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

13

我想在Django中有几个不同版本的相同语言,定制给不同的国家(例如locale/en locale/en_CA locale/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,因为大多数单词在所有变体中都是相同的。也就是说,如果您在其中一个变体中找到一个单词neighbourneighbor不同,那么从特定变体中选择,但仅在主要变体中保留house - JL Peyret
没错,但问题是 Django 出于某种原因使用 "en_US",即使我只指定了 "en"。有什么线索吗?编辑:如果我指定 "en-ca",它会正确地使用 "en_CA"。 - Jordan Jambazov
不好意思,这个建议是来自我在另一个系统上的经验,只是为了提醒您降低翻译成本的一个指针。我还没有使用过Django的翻译支持。 - JL Peyret
3个回答

3
这是Python(而不是特定的Django)和gettext模块的一个怪癖。
在Django问题跟踪器上提出了8626票,大约在1.0版本发布后,经过一些建议和辩论,Django开发人员认为这是“无法修复”的问题。
在票证线程中有建议将'en-en'用作默认值。我的记忆有点模糊,但如果我没记错的话,这种方法与我国际化工具的其他部分(例如pox库)不兼容。我放弃了,并将en-US作为项目的默认值,并列出其他变体(例如en-au)作为备选项。

1
感谢您提供方向 - 我已经给了您赏金!问题是我也在使用i18n_patterns来定制语言URL。 "en-us"或"en-en"的技巧可能有效,但会改变应用程序的URL结构。对此有什么建议吗? - Jordan Jambazov
你能否在通用英语(.../en/)和美国(.../en-us/)的URL上都使用en-US翻译? 老实说,我更喜欢不在URL中包含语言/区域设置,但也许你可以在另一个问题中分享你的URL方案,我会考虑一下。 - Dwight Gunning

1
一个解决问题的方法是将以下代码片段添加到您的settings.py文件中。
import locale
locale.locale_alias.pop('en', None)

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


0

我可以建议您在LocaleMiddleware类中设置断点吗?

这样,您可能会发现一个线索,了解哪些事情实际上阻碍了您获取正确的语言。

因为根据LocaleMiddleware类的源代码Django如何发现语言偏好, 有很多因素可能会影响结果。


我知道这一点,但事实并非如此,因为我正在使用 i18n_patterns,这是 LocaleMiddleware 要查找的第一件事。 - Jordan Jambazov
好的,我刚刚尝试在LocaleMiddlewareprocess_requestprocess_response方法中添加断点,并且语言正确地设置为en。即使如此,仍然使用了en_US区域设置。 - Jordan Jambazov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接