Django的get_current_language总是返回"en"

Ste*_*ögl 14 django localization django-templates internationalization

在我的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>
Run Code Online (Sandbox Code Playgroud)

该网站提供多种语言的翻译.如果我在浏览器中切换语言,我会看到正确的翻译,但该lang属性将始终包含en.

在我的settings.py

USE_I18N = True
LANGUAGE_CODE = 'en-us'
Run Code Online (Sandbox Code Playgroud)

并根据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',
]
Run Code Online (Sandbox Code Playgroud)

LANGUAGES设置未设置.

正如Kostadin Slavov所建议的那样,我尝试从视图中打印语言.似乎get_current_language调用了django.utils.translation.get_language,所以我在我的视图中插入了以下内容

from django.utils import translation                                        
print(translation.get_language())                                           
Run Code Online (Sandbox Code Playgroud)

它打印正确的值(例如de,在浏览器设置为德语的情况下访问视图时).

我还缺少什么?

Pao*_*rre 5

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

\n\n
$ cd ~\n$ python3 -m venv ~/venvs/mysite\n$ source ~/venvs/mysite/bin/activate\n$ pip install django==2.0.8\n$ django-admin startproject mysite\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我更新了生成代码,如您的示例所示:

\n\n
    \n
  • 我的网站/settings.py

    \n\n
    ...\nMIDDLEWARE = [\n    \'django.middleware.security.SecurityMiddleware\',\n    \'django.contrib.sessions.middleware.SessionMiddleware\',\n    \'django.middleware.locale.LocaleMiddleware\',\n    \'django.middleware.common.CommonMiddleware\',\n    \'django.middleware.csrf.CsrfViewMiddleware\',\n    \'django.contrib.auth.middleware.AuthenticationMiddleware\',\n    \'django.contrib.messages.middleware.MessageMiddleware\',\n    \'django.middleware.clickjacking.XFrameOptionsMiddleware\',\n]\n...\nTEMPLATES = [\n    {\n        \'BACKEND\': \'django.template.backends.django.DjangoTemplates\',\n        \'DIRS\': [\'templates\'],\n        \'APP_DIRS\': True,\n        \'OPTIONS\': {\n            \'context_processors\': [\n                \'django.template.context_processors.debug\',\n                \'django.template.context_processors.request\',\n                \'django.contrib.auth.context_processors.auth\',\n                \'django.contrib.messages.context_processors.messages\',\n            ],\n        },\n    },\n]\n...\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 我的网站/urls.py

    \n\n
    from django.contrib import admin\nfrom django.urls import path\nfrom django.views.generic.base import TemplateView\n\nurlpatterns = [\n    path(\'\', TemplateView.as_view(template_name=\'base.html\'), name=\'home\'),\n    path(\'admin/\', admin.site.urls),\n]\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 模板/base.html

    \n\n
    {% load i18n %}\n{% get_current_language as LANGUAGE_CODE %}\n<!DOCTYPE html>\n<html lang="{{ LANGUAGE_CODE }}">\n<body>\n<pre>LANGUAGE_CODE = {{ LANGUAGE_CODE }}</pre>\n<body>\n</html>\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

使用 Django 生成的代码和我上面的一些更新,如果我在启动后访问http://localhost:8000/切换浏览器的语言,我可以看到不同的语言代码:

\n\n
$ python manage.py runserver\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

更新

\n\n

尝试使用差异设置来查看“当前设置文件和 Django\xe2\x80\x99s 默认设置之间的差异”。

\n