Django i18n: 翻译未出现的常见原因

26 投票
9 回答
11093 浏览
提问于 2025-04-15 19:41

我正在制作一个多语言的Django网站。我创建了一个消息文件,并进行了填充和编译。我在我想要的语言(希伯来语)下检查了网站(在这个例子中是管理后台),大部分短语都正确显示为希伯来语,但有些却没有。我查看了源代码,这些短语仍然显示为_('Whatever'),而且在消息文件中也有翻译,没错,我也记得执行了compilemessages

那么,翻译没有显示出来的常见原因有哪些呢?

9 个回答

17

我正在尝试提供一个完整的检查清单:

  • settings.py 文件中,USE_I18NUSE_L10NLANGUAGE_CODELOCALE_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_CNzh_hanszh-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 "名"

这样你就会看到 ,而不是默认的 姓氏名字

24

我刚遇到一个问题。我在项目的根目录下有一个 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'),
)
40

也许这些翻译的字符串被标记为模糊了?

撰写回答