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

Pav*_*lon 10 django translation localization internationalization 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'???'),
)
Run Code Online (Sandbox Code Playgroud)

目前,所有(但中文)语言都能完美运作.这是locale目录的内容:

$ ls locale/
en
fi
ja
no
zh_CN
zh_TW
Run Code Online (Sandbox Code Playgroud)

在每个目录中,我都有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"...

你知道什么可能是错的吗?

Der*_*wok 16

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

LANGUAGES = (
    ('zh-cn', u'????'), # instead of 'zh-CN'
    ('zh-tw', u'????'), # instead of 'zh-TW'
)
Run Code Online (Sandbox Code Playgroud)

请参阅https://code.djangoproject.com/browser/django/trunk/django/conf/global_settings.py中指定的语言代码.您将看到它使用zh-tw而不是zh-TW.

最后,语言目录存储在您的语言环境中的*.po和*的.mo文件夹需要命名zh_CN,并zh_TW分别为翻译才能正常工作.

  • 这对我有用!我的settings.py中有"zh-cn",但我必须运行"makemessages -l zh_CN".非常感谢!这引起了很大的挫败感. (3认同)
  • 对于简体中文(`zh-cn`),它现在是`zh-hans`.对于`zh-hant`(繁体中文),它现在是`zh-hant`.`(Django 1.9新更新)` (2认同)

mod*_*tos 10

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

zh-hans在您的配置中,并确保您的目录已命名zh_Hans.

对于繁体中文:

zh-hant在您的配置中,您的目录应该被命名zh_Hant.

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

基本上,对于我们的中文代码,将-其替换为a _,并且第二个作品的第一个字母大写.

这个逻辑的源代码在这里: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()
Run Code Online (Sandbox Code Playgroud)

注意,en-us变成en_US,基于上面的源代码,因为us是2个字符或更少.