Django翻译发现首先查看站点包

时间:2015-04-20 15:28:08

标签: django django-1.7 django-multilingual

compilemessages生效后无法获取任何翻译文件。

深入研究我的代码:

django.utils.translation.trans_real.check_for_language

def check_for_language(lang_code):
    # First, a quick check to make sure lang_code is well-formed (#21458)
    if not language_code_re.search(lang_code):
        return False
    for path in all_locale_paths():
        if gettext_module.find('django', path, [to_locale(lang_code)]) is not None:
            return True
    return False

利用:

django.utils.translation.trans_real.all_locale_paths

def all_locale_paths():
    from django.conf import settings
    globalpath = os.path.join(
        os.path.dirname(upath(sys.modules[settings.__module__].__file__)), 'locale')
    return [globalpath] + list(settings.LOCALE_PATHS)

返回:

[
  u'/data/.venv/mysite/local/lib/python2.7/site-packages/django/conf/locale',
  '/data/www/locale/'
]

这是核心代码,经过了大约一百万次的测试,我确定我的配置错误,但我真的看不出我的LOCALE_PATHS会优先考虑吗?

/ data / www / locale / content

/data/www/locale/
|-- en-us
|   `-- LC_MESSAGES
|       |-- django.mo
|       `-- django.po
|-- zh-hans
|   `-- LC_MESSAGES
|       |-- django.mo
|       `-- django.po
`-- zh-hant
    `-- LC_MESSAGES
        |-- django.mo
        `-- django.po

settings.py

LANGUAGES_DICT = {
    'en-us': _('English'),
    'zh-hant': _('Traditional Chinese'),
    'zh-hans': _('Simplified Chinese'),
}
LANGUAGES = LANGUAGES_DICT.items()

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
path = lambda *a: os.path.join(BASE_DIR, *a)
LOCALE_PATHS = (
    path(u'locale'),
)
# Outputs: (u'/data/www/locale',)

1 个答案:

答案 0 :(得分:1)

/data/www/locale/中的语言目录应使用下划线而不是连字符分隔。可以将命名与Django's official repo进行比较。

zh_Hanszh_Hant的情况下,将连字符后面的4个字符的第一个字母大写也是合适的(也就是说,测试它也适用于小写名称,如zh_hans)。

/data/www/locale/
|-- en_US
|-- zh_Hans
`-- zh_Hant

根据我之前的评论,这些下划线应该只在目录名称中,它们需要在settings.py中用连字符分隔。

最初使用此名称创建目录(如果已存在则无需重新创建它们,重命名应该足够了):

$ django-admin.py makemessages -l zh_Hant
$ django-admin.py makemessages -l zh_Hans

在编译消息并重新启动runserver(它无法检测项目根目录之外的文件更改)之后,翻译应该显示,至少它在Django Admin中测试时对我有用,并翻译verbose_name_plural测试模型。

有一点我注意到,目录/data/www/locale/需要在Python路径上才能让Django选择翻译。