【问题标题】:Django translations: setting of LANGUAGE_CODE working - accept-languages not?Django 翻译:设置 LANGUAGE_CODE 工作 - 不接受语言?
【发布时间】:2020-10-19 00:45:45
【问题描述】:

我正在尝试为我的一个小 Django 项目修复翻译。取消 Django 2.2.12。

当前状态是,我可以通过将 LANGUAGE_CODE 设置为不同的值来切换翻译。但我想通过浏览器的接受语言来切换翻译 - 这似乎不起作用。我的怀疑是,由于某种原因,中间件配置不正确。

这是我为中间件设置的:

MIDDLEWARE_CLASSES = [
'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.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

还有语言:

LANGUAGES = (
('de', 'German'),
('tr', 'Turkish'),
('en', 'English'),
('it', 'Italian'),
('fr', 'French'),
)

从文档中我得出结论,如果 LANGUAGE_CODE 的设置改变了翻译——就像我的情况一样——那么确定正确翻译的所有其他方法都失败了(包括 cookie)。因为 LANGUAGE_CODE 是在最后一步计算的。

我想知道如何检查中间件是否正确 - 以及为什么它似乎忽略了接受语言。对此的任何提示都非常感谢!

【问题讨论】:

  • 它可以工作,但是如果设置了 cookie,那么这会覆盖 Accept-languages 的值。
  • Django 尝试通过多种方式确定要使用的语言docs.djangoproject.com/en/3.0/topics/i18n/translation/…。您是否已将语言添加到 settings.LANGUAGES
  • 已编辑我的问题以纳入 cmets - 感谢您的评论!

标签: django


【解决方案1】:

使用settings.USE_I18N=True,键码在django.utils.translation.trans_real.get_language_from_request()函数中 由LocaleMiddleware.process_request() 调用。 language_code 的查找优先级从高到低如下。

首先,如果 urlconf 由 i18n_patterns 函数处理,它将尊重路径中显式的 language_code 信息。

lang_code = get_language_from_path(request.path_info) 

如果不是或无效,作为尊重用户,然后尝试从 request.session 中获取语言代码,可以将其设置在某个地方, 通常客户端可以将 {language:'en'} 发布到 django.views.i18n.set_language(request) 的 url 路径。

lang_code = request.session.get(LANGUAGE_SESSION_KEY) # LANGUAGE_SESSION_KEY = '_language'

如果不是或无效,则尝试从 request.cookies 中获取 language_code 作为尊重客户端。

lang_code = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME) # LANGUAGE_COOKIE_NAME = 'django_language'

如果不是或无效,则尝试从 ACCEPT_LANGUAGE 中获取第一个有效的语言代码作为尊重浏览器。

accept = request.META.get('HTTP_ACCEPT_LANGUAGE', '')  # usually it has a lot of language info

如果无效,否则:

lang_code = get_supported_language_variant(settings.LANGUAGE_CODE)

因此,您可以打印所有相关信息以找出答案。

【讨论】:

    【解决方案2】:

    根据@Blackdoor 的回答添加我的发现:

    • django.utils.translation.trans_real.get_language_from_request() 返回“en”

    • django.utils.translation.get_language_from_path(request.path_info) 返回无

    • request.session.get(LANGUAGE_SESSION_KEY) 导致 AttributeError: "'WSGIRequest' object has no attribute 'session'"

    • request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME) 返回无

    • request.META.get('HTTP_ACCEPT_LANGUAGE', '') 返回“en”

    • django.utils.translation.get_language_from_request(request) 返回“en”

    • settings.LANGUAGE_CODE 设置为“de”

    • django.utils.translation.get_language() 返回“de”

    仍然想知道为什么不使用 'HTTP_ACCEPT_LANGUAGE' - 但我将通过激活 `get_language_from_request(request) 返回的语言手动解决此问题...

    【讨论】:

    • 注意q值。//多种类型,用质量值语法加权:Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7 , *;q=0.5
    • 我已经使用 Firefox 的“快速接受语言切换器”插件进行了测试。在那里我输入了语言代码“en”。所以只有“en”,没有重量。
    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2018-04-15
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多