Django的get_current_language始终返回“ en”

时间:2018-08-01 19:59:41

标签: django localization django-templates internationalization

在我的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)。

我还想念什么?

1 个答案:

答案 0 :(得分:2)

我尝试通过以下步骤模拟您的环境:

componentWillReceiveProps

然后,按照您的示例更新生成的代码:

  • mysite / settings.py

    $ cd ~
    $ python3 -m venv ~/venvs/mysite
    $ source ~/venvs/mysite/bin/activate
    $ pip install django==2.0.8
    $ django-admin startproject mysite
    
  • mysite / urls.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',
                ],
            },
        },
    ]
    ...
    
  • templates / base.html

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

有了Django生成的代码和上面的一些更新,如果我以以下方式启动访问http://localhost:8000/的浏览器的语言,并切换为以下语言,则可以看到不同的语言代码:

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

在本地环境中尝试我的步骤,并检查其是否有效,然后将您的项目与上面的代码进行比较。

更新

尝试使用diffsettings查看“当前设置文件与Django默认设置之间的差异”。