1

我的任何翻译文件在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/ 内容

/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

设置.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',)
4

1 回答 1

1

中的语言目录/data/www/locale/应该用下划线而不是连字符分隔。命名可以与Django 的官方 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 Adminverbose_name_plural中通过测试模型的翻译进行测试时对我有用。

我注意到的一件事是,该目录/data/www/locale/需要位于 Python 路径上,以便 Django 选择翻译。

于 2015-04-21T14:18:00.530 回答