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