如何在 Django 中维护同一语言的不同国家版本?

How to maintain different country versions of same language in Django?

我想在 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 文档。

我可以建议您在 LocaleMiddleware Class 中放置一个断点吗?

通过这种方式,您可能会发现一条线索,即哪些东西实际上让您无法获得正确的语言。

因为根据 source code of LocaleMiddleware Class and the How Django discovers language preference , 可能有很多事情会影响结果。

这是 Python(不是专门针对 Django)和 gettext 模块的怪癖。

Ticket 8626 是在 1.0 发布前后在 Django 问题跟踪器上提出的,经过一些建议和辩论后,Django 开发人员认为它是 "won't fix"。

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

该问题的解决方法是将以下代码段添加到您的 settings.py 文件中。

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

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