2

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')),

同様のエラーやバグに関する情報をいくつか読みましたが、どれも私の問題を解決しません。手がかりはありますか?

4

1 に答える 1

1

これは、「要求された言語の翻訳が見つかりません」というDjangoの言い方です。

compilemessagesを実行しましたか?

于 2012-08-30T00:31:44.480 に答える