Django uggetext 作为 __ 而不是 _ 中断 makemessages

Django uggetext as __ instead of _ breaks makemessages

我刚遇到一个奇怪的错误 (?) 我最初遇到的是

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 utility and more specifically of the xgettext 命令的内部结构。

简而言之,为了将字符串标记为可翻译,您必须将它们包装到特定的关键字中(即translate("hello world")translate这里是关键字) . xgettext 程序适用于多种编程语言。每种语言都有自己的 predefined keywords(按 Ctrl + f 并搜索 --keyword)。

在Python中,这些关键词是(注意最后的_):

For 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 命令。查看 source of makemessages command,您可以看到 Django 提供了额外的 --keyword 用于标记要翻译的字符串。其实这些关键字和Django的翻译附加功能是一样的

在所有这些之后,我认为现在很清楚别名 _____ 将不起作用,因为它不在 Django 的 xgettext 命令调用列表中,也不在预定义的列表中xgettext 命令的关键字。

你可能会看一个过时的,but still valid answer

还有一个例子xgettext on MDN, using PHP