【问题标题】:How to maintain different country versions of same language in Django?如何在 Django 中维护相同语言的不同国家版本?
【发布时间】:2017-01-27 09:47:33
【问题描述】:

我想在 Django 中有几个不同版本的相同语言,为不同的国家定制(例如locale/enlocale/en_CAlocale/en_US 等)。如果没有针对特定国家/地区的语言,我希望使用默认语言版本 (locale/en)。

然后在每个站点的设置文件中指定LANGUAGE_CODELANGUAGES

由于某种原因,即使我指定了以下设置,仍然使用locale/en_US 翻译:

LANGUAGE_CODE = 'en'
LANGUAGES = (
    ('en', ugettext('English')),
)

虽然我明确指出语言代码应该是en(而不是en-us)。

我错过了什么吗?已经尝试在多个地方找到答案,包括 Django 文档。

【问题讨论】:

  • 实际上,如果 Django 支持它,您通常希望在 en_CA、en_US 等中维护最少的条目,并在主要 en 上逐个回退,因为大多数单词在所有口味中都是相同的。 IE。如果您在 neighbourneighbor 中找到一个词,请从具体中选择,但仅将 house 留在 main 中。
  • 没错,但问题是 Django 出于某种原因使用了“en_US”,即使我只是指定了“en”。有什么线索吗?编辑:如果我指定“en-ca”,它会正确使用“en_CA”。
  • 不,不幸的是,这条建议来自我在另一个系统上的经验,只是为了降低翻译成本。尚未使用 Django 翻译支持。

标签: python django internationalization django-i18n


【解决方案1】:

这是 Python(不是专门为 Django)和 gettext 模块的一个怪癖。

Ticket 8626 是在 1.0 版本发布时在 Django 问题跟踪器上提出的,经过一些建议和辩论后,Django 开发人员认为它“无法修复”。

票务线程中建议使用“en-en”作为默认值。我的记忆有点粗糙,但如果我没记错的话,这种方法在我的 i18n 工具的其他部分(例如 pox 库)中表现不佳。我放弃并决定使用 en-US 作为项目的默认设置,并列出其他变体(例如 en-au)作为替代方案。

【讨论】:

  • 感谢您的指导 - 赏金给您!问题是我也在使用 i18n_patterns 来定制语言的 URL。 “en-us”或“en-en”的技巧可能有效,但会改变应用程序的 URL 结构。有什么建议吗?
  • 您能否接受在您的通用英语 (.../en/) 和美国 (.../en-us/) 两个 URL 上提供英美翻译?老实说,我的偏好是将语言/区域设置在 URL 之外,但也许您可以在另一个问题中分享您的 URL 方案,我可以考虑一下。
【解决方案2】:

解决此问题的方法是将以下 sn-p 添加到您的 settings.py 文件中。

import locale
locale.locale_alias.pop('en', None)

特别感谢 Venelin Stoykov,他能够调查 Python locale 模块的行为。

【讨论】:

    【解决方案3】:

    我可以建议你在 LocaleMiddleware 类中设置一个断点吗?

    通过这种方式,您可能会发现一个线索,实际上是什么让您无法获得正确的语言。

    因为根据LocaleMiddleware Class 的source codeHow Django discovers language preference ,可能有很多事情会影响结果。

    【讨论】:

    • 对,我知道这一点,但事实并非如此,因为我使用的是i18n_patterns,这是LocaleMiddleware 试图寻找的第一件事。
    • 好的,我刚刚尝试在process_requestprocess_response 方法中添加断点LocaleMiddleware,并且语言正确设置为en。即使使用了 en_US 语言环境。
    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多