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

问题描述 投票:0回答:2

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

django django-templates translation
2个回答
0
投票

终于,我明白了。我有英语的 .po 和 .mo 文件,但我的源语言(德语)没有。 Django 当然不知道我的源字符串是德语的,但我假设如果找不到某种语言的翻译,它会显示未翻译的原始字符串(即在这种情况下为德语)。相反,看起来在这样做之前,Django 仍在寻找后备语言的翻译(在设置中定义为

LANGUAGE_CODE
的语言,如果没有定义则为英语)。只有当它找不到 either 检测到的语言的翻译 nor 后备语言的翻译时,它才会显示未翻译的字符串。

所以,我的实用建议是:为所有可用语言包括您的源语言生成 .po 和 .mo 文件。并在设置中将您的源语言设置为

LANGUAGE_CODE
。如果需要,您可以将这些翻译留空,以便显示原始字符串

编辑:我还观察到只有当源语言与后备语言不同时我的问题才会出现(在我的例子中,将

de
设置为
LANGUAGE_CODE
一切仍然按预期工作,但要求尽管原始字符串是德语,但站点默认为英语)。因此,我的建议得到了改进:如果您的源语言与设置中定义为
LANGUAGE_CODE
的后备语言不同
,那么您还需要包括与您的源语言相对应的翻译。这可能意味着提供所有
msgid
msgstr
都相同的翻译文件...如果您将任何
msgstr
留空,Django 将尝试以后备语言(与源语言不同)查找翻译字符串。


0
投票

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

简单地,按照这些指示.

之后,无论浏览器的设置如何,您都应该能够通过您的网站选择首选语言。在您的情况下,它应该是英语或德语。正如您在问题中提到的,您的设置应该运行良好。请试一试,如果它不起作用,我很乐意重构我的答案!

© www.soinside.com 2019 - 2024. All rights reserved.