Cau*_*ons 7 python django internationalization
我正在使用Django 1.5.1,我正在经历一些翻译的"奇怪行为".我正在使用ugettext并ugettext_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中使用_别名ugettext和ugettext_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的参考):
还有一些是由django实用程序添加的:
关键字trans不在任何这些关键字集中,因此您不应将其用于标记翻译文本.
可以通过覆盖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