在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',)
答案 0 :(得分:1)
/data/www/locale/
中的语言目录应使用下划线而不是连字符分隔。可以将命名与Django's official repo进行比较。
在zh_Hans
和zh_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选择翻译。