我正在使用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中使用_
和ugettext
(或任何其他相关翻译函数)的ugettext_lazy
别名否则makemessages
命令将无法识别它。技术解释可以在Robert Lujo的答案中找到。
谢谢!
答案 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的参考):
有些是由django实用程序添加的:
关键字 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 %}
您需要在运行makemessages之前手动创建语言环境目录 - 您通常会这样做,如果没有,则会收到错误消息
语言文件在使用之前必须编译为.mo
个文件 - 您也是
修改
在我链接到我的帖子的页面中,他们在模板中使用了这种语法:
{% trans "Hello" %}
这是你尝试过的吗?
答案 3 :(得分: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
停止开发服务器并重新运行命令解决了我的问题。