Django“trans”模板标签使用错误的语言

时间:2017-03-09 09:55:37

标签: django django-templates translation

我有一个使用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的其他可能相关的帖子(还有点旧):

2 个答案:

答案 0 :(得分:0)

您似乎依赖于用户的浏览器语言设置。没关系,但是一个好的用户体验要求你应该为用户提供一套可用的语言选项。你是怎么做到的?

只需关注these directions即可。

之后,您应该能够通过您的网站选择优先语言,无论浏览器的设置如何。在您的情况下,它应该是英语或德语。正如您在问题中提到的,您的设置应该可以正常工作。请试一试,如果它没有工作,我很乐意重构我的答案!

答案 1 :(得分:0)

最后,我想出来了。我有英语的.po和.mo文件,但我的源语言(德语)没有。 Django当然不知道我的源字符串是德语,但我假设如果找不到某种语言的翻译,它会显示未翻译的原始字符串(即在这种情况下是德语)。相反,它看起来像之前那样,Django仍然会寻找后备语言的翻译(在设置中定义为LANGUAGE_CODE的翻译,或者如果没有定义则翻译英语)。只有当它无法为后备语言检测到的语言翻译找到 翻译时,它才会显示未翻译的字符串。

所以,我的实际建议是:为所有可用语言生成.po和.mo文件包括您的源语言。并在设置中将源语言设置为LANGUAGE_CODE。如果需要,您可以将这些翻译留空,以便显示原始字符串

修改:我还发现只有当源语言与后备语言不同时才会出现问题(在我的情况下,将de设置为LANGUAGE_CODE所有内容仍然按预期工作,但要求网站默认为英语,尽管原始字符串是德语)。所以我的建议得到了改进:如果您的源语言与设置中定义为LANGUAGE_CODE的后备语言不同,那么您还需要包含与您的源语言相对应的翻译。这可能意味着提供所有msgidmsgstr相同的翻译文件...如果您将任何msgstr留空,Django将尝试使用后备语言查找翻译字符串(这是不同的比源语言。)