Django get_current_language всегда возвращает "en"

На моем сайте Django 2.0 я хочу установить атрибут lang тега html на текущий язык локали. В моем 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'

и по предложению Горана следующий порядок промежуточного программного обеспечения

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 не установлена.

По предложению Костадина Славова я попытался напечатать язык с точки зрения. Кажется, что get_current_language вызывает django.utils.translation.get_language, поэтому я вставил следующее на мой взгляд

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

Он печатает правильное значение (например, de при доступе к представлению с браузером, настроенным на немецкий язык).

Что еще мне не хватает?

Ответ 1

Я попытался смоделировать среду таким образом:

$ 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),
    ]
    
  • шаблоны /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, чтобы увидеть "различия между текущим файлом настроек и настройками Djangos по умолчанию".