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

26
我正在制作一个多语言的Django网站。 我创建了一个消息文件,填充并编译了它。 我在我的目标语言(希伯来语)中检查了网站(在此情况下是管理界面),大多数短语都按照应该出现在希伯来语中,但有些没有。 我检查了源代码,这些短语仍然像应该的那样是_(“任何东西”),而且它们已经在消息文件中被翻译了,并且是的,我记得执行了compilemessages
出现翻译不完整的常见原因是什么?
9个回答

40

也许翻译的字符串被标记为fuzzy


你在作弊,Ofri :)是的,这是错过翻译的原因之一,谢谢。 - Ram Rachum
4
这也花了我一些时间来弄清楚。任何标记为“模糊”的条目都不会被使用。它们旨在由翻译人员进行审核,直到经过确认(通过取消模糊标记)才会被显示。 - Tom
http://www.gnu.org/software/hello/manual/gettext/Fuzzy-Entries.html#Fuzzy-Entries - Tom
11年后仍然是一个很好的答案。这就是今天让我感到困扰的地方。 - Asmo Soinio

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'),
)

2
现在看起来像这样: LOCALE_PATHS = ((BASE_DIR / 'locale'), ) - mitenka

17

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

settings.py中,USE_I18NUSE_L10NLANGUAGE_CODELOCALE_PATHS是否设置正确?
  • 请参阅this list以获取所有允许的语言标识符值。请注意,简体中文由zh-hans指定,而不是zh-cn
settings.py中,是否在MIDDLEWARE正确顺序中包含了django.middleware.locale.LocaleMiddleware
您是否使用正确的本地名称从正确的位置重新运行了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文件?
您是否重启了Web服务器?

附加说明:

  • 如果您的一些翻译被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”,其中将编写区域设置。关于上下文标记的非常好的注释,我之前不知道。 - Alessandro Dentella

9
一个可能的原因是懒惰翻译
例如,在views.py中,您应该使用:
from django.utils.translation import ugettext as _

但在 models.py 中,应该使用 ugettext_lazy

from django.utils.translation import ugettext_lazy as _

谢谢,但在这种情况下似乎不是问题所在。我登录到shell,执行ugettext('My expression'),却得到了'My expression'而不是翻译。 (是的,在执行此操作之前,我已经activate了其他语言,并确认我可以使用该函数翻译其他字符串。) - Ram Rachum

9

我现在遇到了一个项目问题。我的settings.py文件中的变量LANGUAGES被设置为:

LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)

有一个文件夹结构,其中包含一个locale文件夹和一个名为pt-br的子文件夹。结果发现我的翻译没有加载。LANGUAGES变量遵循pt-br模式,文件夹必须是pt_BR模式。至少这是它在这里工作的唯一方式!


1
这里与pt-br相同(使用Django==1.10.5) - pitervergara
2
我曾经遇到过同样的问题。包含“-”(连字符)的语言代码的正确模式是“<code_prefix>_<CAPITAL_SUFFIX>”,例如:pt_BR,因此正确的命令是 python manage.py makemessages -l=pt_BR - Kaushal

8

你好,这里是一些我过去处理的修复方法:

  • 重新启动Web服务器!

在设置文件中 - 需要 USE_I18N = True

  • django.middleware.locale.LocaleMiddleware 在中间件模块中(但这不是你的情况,因为Django根本不关心你的本地化)

  • django.core.context_processors.i18n 在 TEMPLATE_CONTEXT_PROCESSORS 中

我肯定还有其他与翻译相关的问题,但我记不起来了...希望这可以帮到你!


2
+1!在我的情况下,我只需要重启服务器。我使用的是nginx + gunicorn组合。重启gunicorn就足够了。谢谢! - nt.bas

0

另一个原因可能是错误的目录结构。

在运行makemassages命令之前,仔细阅读管理命令关于要创建哪个目录的错误消息,以进行app翻译。 (对于应用程序,它必须是locale,而不是conf/locale。)请注意,即使目录结构错误,管理命令也可以正常工作。


0
我注意到当我的文本中有%时,翻译后的文本没有被使用。可能还有其他字符会导致这个问题。我通过将%转义为%%来解决这个问题。

0

我的回答在这里,我所有的翻译都有效,除了我在一个ModelForm中使用的2个DateField。 结果发现我在forms.py中有一个小部件与翻译不兼容。

我现在只是暂时将其删除,以便我可以享受圣诞节 =D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接