我刚刚遇到一个奇怪的错误(?(,我最初有
from django.utils.translation import ugettext as _
我为换的
from django.utils.translation import ugettext as __
但是,令人惊讶的是,运行./manage.py makemessages --all
之后会破坏所有的翻译,它们基本上都会在我的.po
文件中被注释,就好像它们不再被识别为翻译一样。
回到_
并运行makemessages
修复了它。我不太明白为什么变量的名称很重要,我想知道当我需要ugettext和ugettext_lazy时,我应该如何命名它们,以保持一致性。
Django 1.8,带有python 2.7.14
这是因为gettext
实用程序的内部,更具体地说是xgettext
命令的内部。
简而言之,为了将字符串标记为可翻译字符串,您必须将它们封装在特定的关键字中(即translate("hello world")
,这里的translate
是关键字(。xgettext
程序适用于多种编程语言。每种语言都有自己预定义的关键字(按Ctrl + f
并搜索--keyword
(。
在Python中,这些关键字是(注意末尾的_
(:
对于Python:
gettext
、ugettext
、dgettext:2
、ngettext:1,2
、ungettext:1,2
、dngettext:2,3
、_
xgettext
命令有几个选项可以改变它的行为。其中之一是--keyword
选项。当您使用--keyword
选项调用xgettext
命令时,如果python文件中的所有字符串都封装在预定义的关键字或您提供的--keyword
选项中,则它们将被视为可翻译。例如,如果运行xgettext --keyword=jimmy_hendrix
,那么所有像jimmy_hendrix("hello world")
这样的字符串都将包含在.po
文件中。
但是,您永远不会在Django中显式地运行此命令。使用makemessages
命令。查看makemessages
命令的源代码,可以看到Django提供了额外的--keyword
s,用于标记要翻译的字符串。事实上,这些关键字与Django用于翻译的附加功能相同。
在所有这些之后,我认为现在很清楚,别名__
或___
将不起作用,因为它不在Django的xgettext
命令调用的列表中,也不在xgettext
命令的预定义关键字中。
你可能会看到一个过时但仍然有效的答案。
此外,还提供了一个xgettext
在MDN上使用PHP的示例。