9

我正在使用 Django 1.5.1,并且在翻译时遇到了一些“奇怪的行为”。我在同一个 Python 文件中使用ugettext和。ugettext_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 中使用and (或任何其他相关翻译函数)的_别名,否则command将无法识别ugettextugettext_lazymakemessages。技术解释可以在 Robert Lujo 的回答中找到。

谢谢!

4

4 回答 4

28

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

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

  • 对于 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不在这些关键字集中,因此您不应使用它来标记要翻译的文本。

于 2013-05-12T18:00:13.353 回答
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']

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

于 2015-06-23T10:05:01.500 回答
0

这些关于Django 项目的多语言支持的说明可以让您找出问题所在。重命名很可能不是失败的根本原因。

这些注释中的一些警告:

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

  • 您需要在运行 makemessages 之前手动创建语言环境目录 - 您通常会这样做,否则您会收到错误消息

  • 语言文件必须.mo在使用之前编译为文件 - 你也这样做了

编辑

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

{% trans "Hello" %}

你已经尝试过了吗?

于 2013-05-12T17:03:00.763 回答
0

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

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

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

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

于 2021-01-06T18:31:37.373 回答