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

时间:2013-05-12 15:51:46

标签: python django internationalization

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

from django.utils.translation import ugettext as trans
from django.utils.translation import ugettext_lazy as _

from django.utils.translation import ugettext as trans, ugettext_lazy as _

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

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

from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _

from django.utils.translation import ugettext, ugettext_lazy as _

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

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


更新

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

from django.utils.translation import ugettext_lazy as translate

a = translate("string")

但是,如果使用_作为别名,则可以使用:

from django.utils.translation import ugettext_lazy as _

a = _("string")

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

谢谢!

4 个答案:

答案 0 :(得分:24)

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

(可以找到来源here)。因此,某些关键字由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 不在任何关键字集中,因此您不应将其用于标记翻译文本。

答案 1 :(得分:3)

可以通过覆盖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']

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

答案 2 :(得分:0)

关于multi-language support for Django project的这些说明可能会让您发现错误。最有可能重命名不是失败的根本原因。

这些说明中的一些警告:

  • 您网站的每个模板都必须使用{% load %}

  • 加载i18n标记库
  • 您需要在运行makemessages之前手动创建语言环境目录 - 您通常会这样做,如果没有,则会收到错误消息

  • 语言文件在使用之前必须编译为.mo个文件 - 您也是

修改

在我链接到我的帖子的页面中,他们在模板中使用了这种语法:

{% trans "Hello" %}

这是你尝试过的吗?

答案 3 :(得分:0)

解决不生成 .po 文件的另一种方法是开发服务器。

在我的开发服务器运行期间,我执行了命令 ma​​kemessage。命令输出是正确的,但我的 .po 文件已更新:

(venv_crypto_bot) macbook-pro:django_project dauzon$ python manage.py makemessages -a 
processing locale fr
processing locale en
processing locale ru

停止开发服务器并重新运行命令解决了我的问题。