Django i18n: 翻译未出现的常见原因
我正在制作一个多语言的Django网站。我创建了一个消息文件,并进行了填充和编译。我在我想要的语言(希伯来语)下检查了网站(在这个例子中是管理后台),大部分短语都正确显示为希伯来语,但有些却没有。我查看了源代码,这些短语仍然显示为_('Whatever')
,而且在消息文件中也有翻译,没错,我也记得执行了compilemessages
。
那么,翻译没有显示出来的常见原因有哪些呢?
9 个回答
我正在尝试提供一个完整的检查清单:
在
settings.py
文件中,USE_I18N
、USE_L10N
、LANGUAGE_CODE
和LOCALE_PATHS
是否设置正确?- 可以查看 这个列表,了解所有允许的语言标识符的值。注意,简体中文用
zh-hans
表示,而不是zh-cn
。
- 可以查看 这个列表,了解所有允许的语言标识符的值。注意,简体中文用
在
settings.py
文件中,django.middleware.locale.LocaleMiddleware
是否按 正确的顺序 包含在MIDDLEWARE
中?你是否用正确的区域名称重新运行了
django-admin makemessages -l <locale-name>
,并且是在 正确的位置?- 你可以通过在你的机器上运行
ls your/path/to/python/site-packages/django/conf/locale/
来查看一个不完整的允许区域名称列表,或者 查看源代码。 - 注意这里要用
_
而不是-
。 比如,要指定简体中文,执行django-admin makemessages -l zh_Hans
,而不是zh_CN
、zh_hans
、zh-Hans
或其他任何形式。
- 你可以通过在你的机器上运行
你是否删除了所有 PO 文件中的
fuzzy
标签?你是否用
django-admin compilemessages
重新编译了 OP 文件?你是否重启了网络服务器?
附加说明:
- 如果你的某些翻译被 Django 的默认翻译覆盖,可以使用 上下文标记 来绕过它。例如,
models.py
first_name = models.CharField(
pgettext_lazy('override default', 'first name'),
max_length=30
)
last_name = models.CharField(
pgettext_lazy('override default', 'last name'),
max_length=150
)
django.po
#: models.py:51
msgctxt "override default"
msgid "first name"
msgstr "姓"
#: models.py:55
msgctxt "override default"
msgid "last name"
msgstr "名"
这样你就会看到 姓
和 名
,而不是默认的 姓氏
和 名字
。
我刚遇到一个问题。我在项目的根目录下有一个 locale/
文件夹,但默认情况下,Django会在 INSTALLED_APPS
目录和默认翻译中查找翻译。所以它没有找到我添加的翻译。不过,有些字符串是Django自带的默认翻译(比如“搜索”),所以有几个字符串被翻译了,这让我有点困惑。
为了把我翻译文件所在的目录添加到Django查找翻译的列表中,我需要设置 LOCALE_PATHS 设置。在我的情况下,因为 locale/
文件夹和 settings.py
文件都在Django项目的根目录下,所以我可以在 settings.py
中加入以下内容:
from os import path
LOCALE_PATHS = (
path.join(path.abspath(path.dirname(__file__)), 'locale'),
)
也许这些翻译的字符串被标记为模糊
了?