【问题标题】:Django "trans" template tag using wrong languageDjango“trans”模板标签使用错误的语言
【发布时间】: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 设置为enen-us 来判断trans 标签正在工作,问题是当德语在英语之上时它不应该翻译在我的浏览器设置中。
  • @brunodesthuilliers 是的,我已经运行 makemessages 并翻译了我的 .po 文件(在生产服务器上使用了 Rosetta)。在生产实例上,rosetta 负责编译它们,而在我的本地实例上,我手动运行 compilemessages 并重新启动了很多次。因此,在我的本地实例和生产环境中,.po 文件和 .mo 文件都已就位,因此看起来 Rosetta 并没有在这里受到有害干扰。在这两个地方我都遇到了相同的行为:翻译发生(所以找到了文件),只是没有正确选择正确的语言。

标签: django django-templates translation


【解决方案1】:

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

只需关注these directions

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-18
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2012-01-18
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多