【问题标题】:Django's get_current_language always returns "en"Django 的 get_current_language 总是返回“en”
【发布时间】:2019-01-09 12:06:49
【问题描述】:

在我的 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,当浏览器设置为德语时访问视图)。

我还缺少什么?

【问题讨论】:

  • 确保中间件顺序正确how Django discovers language preferences
  • 我已经根据文档修复了中间件的顺序;它没有解决问题,但我已将信息添加到上面的问题中。
  • 您确定向{% url 'set_language' %} 发送POST 请求吗?该视图期望通过 POST 方法调用docs
  • 不,我正在发送 Accept-Language 标头。翻译正常工作就足够了。
  • 你为 LANGUAGE_CODE 和 LANGUAGES 设置了什么,如果有的话?

标签: django localization django-templates internationalization


【解决方案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查看“当前设置文件与Django默认设置的差异”。

【讨论】:

  • 这样一个简单的项目可以正常工作;但是问题是我的项目与这样的项目的比较。我不确定我会错过什么导致返回错误的语言。
  • 那么你有没有在本地尝试过我的简单测试?您能否提供有关您的项目的更多详细信息以允许重新创建您的环境?
  • 为了它的价值,我还设置了一个简单的项目,针对 2.0 和 2.1 进行了测试,发现两个版本都按预期工作。如果我将 LANGUAGES 定义为一个空列表,我能够重现默认值(en-us)。
  • 我看不到您的代码,但我会检查设置的差异并尝试仅使用默认设置,逐一添加您的设置以查看哪个设置破坏了语言标签。
  • 我可以在不使用 LocaleMiddleware 的情况下使用 get_current_language 吗? => stackoverflow.com/questions/59301978/…
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 2019-07-20
  • 2019-09-07
  • 2019-08-29
  • 2017-11-22
  • 2014-09-06
  • 2011-08-18
相关资源
最近更新 更多