Django 翻译 : setting of LANGUAGE_CODE working - accept-languages not?

标签 django

我正在尝试修复我的一个小型 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/

相关文章:

python - 在 django 中将视频编码为多种分辨率的最佳方法是什么?我们应该创建一个 celery 任务还是要编码多个任务?

python - django 中找不到或不存在图像文件

python - 如何在 Django 中对模型进行两次过滤?

Django表单: default value if user leaves field blank

javascript - Django Admin 弹出功能

django - 使用 GeoDjango 将 geojson 文件中的多边形数据导入 PostGIS

django-lockdown 密码提示不显示

django - 如何在 django 管理员更改列表上添加顶部保存按钮?

python - 如何在 View 中排序一组对象

python - 如何在virtualenv中强制安装包?