LocaleMiddlewareを使用して、テンプレート層でユーザーの優先言語を取得し、言語ごとに異なるコンテンツを表示したいと思います。djangoのドキュメントによると、LocaleMiddlewareは次のことを行います。
まず、要求されたURLで言語プレフィックスを探します。これは、ルートURLconfでi18n_patterns関数を使用している場合にのみ実行されます。言語プレフィックスとURLパターンを国際化する方法の詳細については、「国際化:URLパターン」を参照してください。
それができない場合は、現在のユーザーのセッションでdjango_languageキーを探します。
それが失敗すると、Cookieを探します。使用されるCookieの名前は、LANGUAGE_COOKIE_NAME設定によって設定されます。(デフォルト名はdjango_languageです。)
それができない場合は、Accept-LanguageHTTPヘッダーを調べます。このヘッダーはブラウザから送信され、優先度の高い順にサーバーに優先する言語を通知します。Djangoは、利用可能な翻訳がある言語が見つかるまで、ヘッダー内の各言語を試します。
それができない場合は、グローバルLANGUAGE_CODE設定を使用します。
Accept-Languageヘッダーを使用すると正しく機能するようです。ただし、set_languageリダイレクトにアクセスすると、LocaleMiddlewareが次のエラーで失敗し始めます。
AttributeError at /
'NoneType' object has no attribute '_info'
ミドルウェアリストからLocaleMiddlewareを除外するか、ブラウザのCookieをクリアすると、set_languageリダイレクトに再度移動するまでエラーは表示されなくなります。
これは私の構成です:
settings.py
LANGUAGE_CODE = 'en-us'
USE_I18N = True
LANGUAGES = (
('en', 'English'),
('es', 'Español'),
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#Uncomment the next line for simple clickjacking protection:
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
そして、urls.pyのset_languageリダイレクトへの次のパターン:
(r'^i18n/', include('django.conf.urls.i18n')),
同様のエラーやバグに関する情報をいくつか読みましたが、どれも私の問題を解決しません。手がかりはありますか?