我正在尝试修复我的一个小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(请求("返回的语言来手动解决此问题...