我正在尝试在我的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”...
你知道可能出现什么问题吗?
答案 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_CN
和zh_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。