【发布时间】:2017-07-30 05:54:01
【问题描述】:
我有一个使用 Django 1.10 的站点,其中德语和英语作为可用语言,其中德语是源语言。动态内容使用 django-modeltranslation 进行翻译,对于静态字符串,我使用 Django 内置的 trans 模板标签。
我希望 Django 以访问者的首选语言返回页面。我已经仔细阅读了how Django discovers language preference 好几遍,我认为我的一切都是正确的。当我在浏览器中更改语言设置时,LANGUAGE_CODE 变量在模板中显示时的值总是会相应更改,并且动态内容总是由 django-modeltranslation 以预期的语言返回。此外,管理界面和扩展(如 rosetta 和 django-debug-toolbar)可以很好地切换它们的界面语言,如预期的那样。 只有trans 模板标签没有选择我的浏览器的语言偏好。相反,它似乎直接使用了 LANGUAGE_CODE 变量的初始值,因为它最初在设置文件中设置,而不通过上述链接中描述的算法。
语言环境中间件当然已经到位,*.po 和 *.mo 文件也是如此。浏览器请求标头看起来也不错。因为除了trans 标签之外的所有东西都按预期运行,我认为这些都不是问题。但作为参考,这是我的中间件设置:
MIDDLEWARE = [
'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.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
还有我的语言设置:
LANGUAGE_CODE = 'en'
LANGUAGES = [
('de', _('German')),
('en', _('English')),
]
其他可能与 SO 相关的帖子(但有点旧):
【问题讨论】:
-
仅供记录。你在每个包含
{% trans %}标签的模板顶部做{% load i18n %},对吧? -
@nik_m 如果你使用 {% trans %} 而不加载 i18n 你会得到一个错误,所以可以肯定的是,他正在加载 i18n
-
您是否运行过 makemessages、翻译您的 .po 文件、编译它们并重新启动 django 进程?提示:作为发布过程的一部分,摆脱 Rosetta 并手动管理您的翻译(使用好的文本编辑器或类似 POEdit)。
-
@nik_m 是的,我确实在顶部包含了
{% load i18n %}。我可以通过将LANGUAGE_CODE设置为en或en-us来判断trans标签正在工作,问题是当德语在英语之上时它不应该翻译在我的浏览器设置中。 -
@brunodesthuilliers 是的,我已经运行
makemessages并翻译了我的 .po 文件(在生产服务器上使用了 Rosetta)。在生产实例上,rosetta 负责编译它们,而在我的本地实例上,我手动运行compilemessages并重新启动了很多次。因此,在我的本地实例和生产环境中,.po 文件和 .mo 文件都已就位,因此看起来 Rosetta 并没有在这里受到有害干扰。在这两个地方我都遇到了相同的行为:翻译发生(所以找到了文件),只是没有正确选择正确的语言。
标签: django django-templates translation