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

Django translation discovery looking at site-packages first

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)

哪个returns:

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

这是这样的核心代码,测试了大概一百万次,我肯定我配置错了,但我真的看不出我的 LOCALE_PATHS 有任何优先权吗?

/data/www/locale/内容

/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',)

/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 获取翻译。