Django:如何为应用程序添加中文支持

时间:2011-10-11 15:56:52

标签: django localization internationalization translation cjk

我正在尝试在我的Django应用程序中添加一个中文语言,我真的很难。我花了半天尝试不同的方法,但没有成功。

我的应用程序支持少量语言,这是 settings.py 文件的一部分:

TIME_ZONE = 'Europe/Dublin'
LANGUAGE_CODE = 'en'

LOCALES = (
    #English
    ('en', u'English'),

    #Norwegian
    ('no', u'Norsk'),

    #Finish
    ('fi', u'Suomi'),

    #Simplified Chinese
    ('zh-CN', u'简体中文'),

    #Traditional Chinese
    ('zh-TW', u'繁體中文'),

    #Japanese
    ('ja', u'日本語'),
)

目前所有(但中文)语言都能完美运作。这是区域设置目录

的内容
$ ls locale/
en
fi
ja
no
zh_CN
zh_TW

在每个目录中,我都有LC_MESSAGES目录,其中包含* .mo和* .po文件。 * .po文件由Python编写的脚本创建,它将* .ODS转换为文本文件。 * .mo文件由 python manage.py compilemessages 命令创建。

用户可以从我的应用程序的“首选项”部分中的正确表单中选择语言。

Django不加载中文翻译。那就是问题所在。简化和传统都不起作用。我在settings.py和locale目录中尝试了不同的语言和区域代码变体:zh-CN,zh-cn,zh_CN,zh_cn。没有成功。

也许我犯了一个简单的错误?我添加了波兰语仅供测试,一切都很顺利。基本上我做了同样的事情。我已将('pl',u'Polish')元组添加到settings.py和带有* .po和* .mo以及LC_MESSAGES目录的“locale / pl”...

你知道可能出现什么问题吗?

5 个答案:

答案 0 :(得分:16)

您需要使用小写字母作为语言环境语言代码才能正常工作。即使用

LANGUAGES = (
    ('zh-cn', u'简体中文'), # instead of 'zh-CN'
    ('zh-tw', u'繁體中文'), # instead of 'zh-TW'
)

查看https://code.djangoproject.com/browser/django/trunk/django/conf/global_settings.py中指定的语言代码。您会看到它使用zh-tw代替zh-TW

最后,在您的locales文件夹中存储* .po和* .mo文件的语言目录需要分别命名为zh_CNzh_TW,以使翻译正常工作。

答案 1 :(得分:8)

对于Django 1.7及更高版本,您需要执行以下操作:

在您的配置中

zh-hans,并确保您的目录名为zh_Hans

对于繁体中文:

您的配置中

zh-hant,您的目录应命名为zh_Hant

以下是auth贡献者包如何在语言环境目录中列出其翻译的示例:https://github.com/django/django/tree/master/django/contrib/auth/locale

基本上,对于我们的中文语言代码,-被替换为_,第二个作品的第一个字母大写。

此逻辑的源代码位于:https://github.com/django/django/blob/master/django/utils/translation/trans_real.py#L63-L78

只是要彻底,这是方法:

def to_locale(language, to_lower=False):
    """
    Turns a language name (en-us) into a locale name (en_US). If 'to_lower' is
    True, the last component is lower-cased (en_us).
    """
    p = language.find('-')
    if p >= 0:
        if to_lower:
            return language[:p].lower() + '_' + language[p + 1:].lower()
        else:
            # Get correct locale for sr-latn
            if len(language[p + 1:]) > 2:
                return language[:p].lower() + '_' + language[p + 1].upper() + language[p + 2:].lower()
            return language[:p].lower() + '_' + language[p + 1:].upper()
    else:
return language.lower()

请注意,根据上面的源代码,en-us已变为en_US,因为us不超过2个字符。

答案 2 :(得分:2)

我有同样的问题[Django-1.6.1]并通过将zh-cn(或zh_cn)的中文语言环境目录重命名为zh_CN(下划线和大写CN)解决了这个问题。

奇怪的是,Django需要一个“zh-cn”作为LANGUAGE_CODE或url分别带有一个i18n_pattern。

未记录的善良btw。

希望有所帮助。

答案 3 :(得分:1)

不确定您是否能够稍后解决此问题,但问题在于语言环境目录中的语言目录名称。所有语言都会在短代码中出现短划线。解决方案是通过用下划线替换短划线来重命名中文目录:

zh-cn - > ZH_CN
zh-tw - > ZH_TW

希望这有帮助。

答案 4 :(得分:1)

在.po文件中,在"语言:\ n"中添加zh-cn或zh-tw,这将成为"语言:zh-en \ n"或"语言:zh-tw \ n"

再次编译消息和runserver。