web-dev-qa-db-ja.com

Djangoのget_current_languageは常に "en"を返します

私のDjango 2.0サイトで、htmlタグのlang属性を現在のロケールの言語に設定します。私のbase.html他のテンプレートが拡張するので、私は get_current_language 次のように

{% load i18n %}

{% get_current_language as LANGUAGE_CODE %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE }}">
 ...
</html>

サイトには複数の言語の翻訳があります。ブラウザーで言語を切り替えると、正しい翻訳が表示されますが、lang属性には常にenが含まれます。

私のsettings.py 私が持っています

USE_I18N = True
LANGUAGE_CODE = 'en-us'

Goran の提案に基づいて、次のミドルウェアの順序

MIDDLEWARE = [
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.locale.LocaleMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
]

LANGUAGES設定は未設定です。

Kostadin Slavov が示唆しているように、ビューから言語を印刷してみました。 get_current_languageがDjango.utils.translation.get_languageを呼び出すようですので、ビューに以下を挿入しました

from Django.utils import translation                                        
print(translation.get_language())                                           

正しい値を出力します(たとえば、ブラウザーをドイツ語に設定してビューにアクセスすると、de)。

他に何が欠けていますか?

14
Stefan Kögl

私はこれらのステップであなたの環境をシミュレートしようとしました:

$ cd ~
$ python3 -m venv ~/venvs/mysite
$ source ~/venvs/mysite/bin/activate
$ pip install Django==2.0.8
$ Django-admin startproject mysite

次に、あなたの例のように生成コードを更新しました:

  • mysite/settings.py

    ...
    MIDDLEWARE = [
        'Django.middleware.security.SecurityMiddleware',
        'Django.contrib.sessions.middleware.SessionMiddleware',
        'Django.middleware.locale.LocaleMiddleware',
        'Django.middleware.common.CommonMiddleware',
        'Django.middleware.csrf.CsrfViewMiddleware',
        'Django.contrib.auth.middleware.AuthenticationMiddleware',
        'Django.contrib.messages.middleware.MessageMiddleware',
        'Django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    ...
    TEMPLATES = [
        {
            'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
            'DIRS': ['templates'],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'Django.template.context_processors.debug',
                    'Django.template.context_processors.request',
                    'Django.contrib.auth.context_processors.auth',
                    'Django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    ...
    
  • mysite/urls.py

    from Django.contrib import admin
    from Django.urls import path
    from Django.views.generic.base import TemplateView
    
    urlpatterns = [
        path('', TemplateView.as_view(template_name='base.html'), name='home'),
        path('admin/', admin.site.urls),
    ]
    
  • templates/base.html

    {% load i18n %}
    {% get_current_language as LANGUAGE_CODE %}
    <!DOCTYPE html>
    <html lang="{{ LANGUAGE_CODE }}">
    <body>
    <pre>LANGUAGE_CODE = {{ LANGUAGE_CODE }}</pre>
    <body>
    </html>
    

Django生成されたコードと上記のいくつかの更新により、ブラウザの言語を切り替えると別の言語コードが表示される http:// localhost:8000 / の後にで始まる:

$ python manage.py runserver

ローカル環境で私の手順を試して、それが機能するかどうかを確認してから、プロジェクトを上記のコードと比較してください。

更新

diffsettings を使用して、「現在の設定ファイルとDjangoのデフォルト設定の違い」を確認してください。

2