Django 翻译:LANGUAGE_CODE工作的设置 - 接受语言不是吗?



我正在尝试修复我的一个小Django项目的翻译。Unsing 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是在最后一步中评估的。

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

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

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

lang_code = get_language_from_path(request.path_info) 

如果不是或无效,作为尊重用户,则尝试从 request.session 中获取language_code,它可以在某处设置, 通常客户端可以将 {language:'en'} 发布到 django.views.i18n.set_language(request( 的 URL 路径。

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

如果不是或无效,则尝试将 request.cookie language_code作为尊重客户端。

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

如果不是或无效,则尝试将第一个有效language_code从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)

因此,您可以打印所有相关信息来弄清楚。

根据@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)导致属性错误:"'WSGIRequest' 对象没有属性'会话'">

  • 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(请求("返回的语言来手动解决此问题...

最新更新