我正在尝试修复我的一个小型 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 在最后一步中进行了评估。
我想知道如何检查中间件是否正确执行它的操作 - 以及为什么它似乎忽略接受语言。任何有关此的提示都将受到高度赞赏!
最佳答案
使用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_code ,可以将其设置在某个地方, 通常客户端可以将 {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 中获取第一个有效的 language_code(尊重浏览器)。
accept = request.META.get('HTTP_ACCEPT_LANGUAGE', '') # usually it has a lot of language info
如果无效,则:
lang_code = get_supported_language_variant(settings.LANGUAGE_CODE)
因此,您可以打印所有相关信息来弄清楚。
关于Django 翻译 : setting of LANGUAGE_CODE working - accept-languages not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628223/