it-swarm.com.ru

Get_current_language в Django всегда возвращает "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 при доступе к представлению с браузером, настроенным на немецкий язык).

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

12
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),
    ]
    
  • шаблоны/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
Paolo Melchiorre