我有一个网站使用 Django 1.10,德语和英语作为可用语言,其中德语是源语言。动态内容使用 django-modeltranslation 进行翻译,对于静态字符串,我使用 Django 的内置
trans
模板标签。
我希望 Django 以访问者的首选语言返回页面。 Django 如何发现语言偏好 仔细看了好几遍,我觉得我都说对了。当我在浏览器中更改我的语言设置时,
LANGUAGE_CODE
变量的值在模板中显示时总是相应地改变,而且 django-modeltranslation 总是以预期的语言返回动态内容。此外,管理界面和扩展程序(如 rosetta 和 django-debug-toolbar)也能按预期很好地切换界面语言。 只有 trans
模板标签没有选择我的浏览器的语言首选项。相反,它似乎直接求助于 LANGUAGE_CODE
变量的初始值,因为它最初是在设置文件中设置的,而没有经过上述链接中描述的算法。
locale 中间件当然已经到位,*.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 的其他可能相关的帖子(但有点旧):
终于,我明白了。我有英语的 .po 和 .mo 文件,但我的源语言(德语)没有。 Django 当然不知道我的源字符串是德语的,但我假设如果找不到某种语言的翻译,它会显示未翻译的原始字符串(即在这种情况下为德语)。相反,看起来在这样做之前,Django 仍在寻找后备语言的翻译(在设置中定义为
LANGUAGE_CODE
的语言,如果没有定义则为英语)。只有当它找不到 either 检测到的语言的翻译 nor 后备语言的翻译时,它才会显示未翻译的字符串。
所以,我的实用建议是:为所有可用语言包括您的源语言生成 .po 和 .mo 文件。并在设置中将您的源语言设置为
LANGUAGE_CODE
编辑:我还观察到只有当源语言与后备语言不同时我的问题才会出现(在我的例子中,将
de
设置为LANGUAGE_CODE
一切仍然按预期工作,但要求尽管原始字符串是德语,但站点默认为英语)。因此,我的建议得到了改进:如果您的源语言与设置中定义为LANGUAGE_CODE
的后备语言不同,那么您还需要包括与您的源语言相对应的翻译。这可能意味着提供所有 msgid
和 msgstr
都相同的翻译文件...如果您将任何 msgstr
留空,Django 将尝试以后备语言(与源语言不同)查找翻译字符串。
您似乎依赖于用户的浏览器语言设置。没关系,但良好的用户体验要求您应该为用户提供一组可用的语言选项。你是怎么做到的?
简单地,按照这些指示.
之后,无论浏览器的设置如何,您都应该能够通过您的网站选择首选语言。在您的情况下,它应该是英语或德语。正如您在问题中提到的,您的设置应该运行良好。请试一试,如果它不起作用,我很乐意重构我的答案!