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