ugettext和ugettext_lazy函数在Python Django中不被makemessages识别

Cau*_*ons 7 python django internationalization

我正在使用Django 1.5.1,我正在经历一些翻译的"奇怪行为".我正在使用ugettextugettext_lazy在同一个Python文件中.如果我将导入组织为:

from django.utils.translation import ugettext as trans
from django.utils.translation import ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

要么

from django.utils.translation import ugettext as trans, ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

trans("string")运行makemessages命令时会跳过标记为的字符串.

但是,如果我不重命名,ugettext它适用于两个版本:

from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

要么

from django.utils.translation import ugettext, ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

现在trans("string")效果很好.

那么,是否有人知道为什么这个导入重命名导致重命名的函数不被调用?这是一个实际的Python"限制"我在同一个模块中重命名多个函数时我不知道吗?


UPDATE

经过一些测试,我意识到即使在应用程序中使用以下代码创建一个空的python模块也不起作用:

from django.utils.translation import ugettext_lazy as translate

a = translate("string")
Run Code Online (Sandbox Code Playgroud)

但是,如果使用_别名,它可以工作:

from django.utils.translation import ugettext_lazy as _

a = _("string")
Run Code Online (Sandbox Code Playgroud)

我的结论是:你只能在Django中使用_别名ugettextugettext_lazy(或任何其他相关的翻译函数),否则它将无法被makemessages命令识别.技术解释可以在Robert Lujo的答案中找到.

谢谢!

Rob*_*ujo 25

Django命令实用程序makemessages在内部调用xgettext程序,如下所示:

cmd = (
    'xgettext -d %s -L Python %s %s --keyword=gettext_noop '
    '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 '
    '--keyword=ugettext_noop --keyword=ugettext_lazy '
    '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 '
    '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 '
    '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 '
    '--add-comments=Translators -o - "%s"' %
    (domain, wrap, location, work_file))
Run Code Online (Sandbox Code Playgroud)

(来源可以在这里找到).因此,某些关键字由xgettext实用程序预定义(检查--keyword的参考):

  • for python - gettext,ugettext,dgettext,ngettext,ungettext,dngettext,_

还有一些是由django实用程序添加的:

  • gettext_lazy,ngettext_lazy,ugettext_noop,ugettext_lazy,ungettext_lazy,pgettext,npgettext,pgettext_lazy,npgettext_lazy

关键字trans不在任何这些关键字集中,因此您不应将其用于标记翻译文本.


Dan*_*anH 8

可以通过覆盖makemessages命令来处理意外的 ugettext 别名,例如:

from django.core.management.commands import makemessages

class Command(makemessages.Command):
    """
    Extends the makemessages command to look for additional aliases.
    """
    xgettext_options = makemessages.Command.xgettext_options + ['--keyword=_lazy']
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#customizing-the-makemessages-command