【发布时间】:2013-05-06 17:25:24
【问题描述】:
我正在使用 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 _
运行makemessages 命令时会跳过标记为trans("string") 的字符串。
但是,如果我不重命名 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 的回答中找到。
谢谢!
【问题讨论】:
-
您可以根据需要“重命名”任意数量的符号(函数或其他),Python 名称只是别名,并且两种导入形式(一个衬里或两个衬里)是等效的,所以问题是别处。 FWIW 我强烈怀疑您在导入后将名称“trans”重新绑定到其他地方...
-
嗨!我没有在模块中覆盖
trans(我用 Eclipse 进行了搜索)。可能因为'_'重命名吗? -
_是一个有效的 Python 名称,没有神奇的力量。 wrt/重命名,from x import y as z与from x import y; z = y; del y完全相同,所以这里再次没有任何神奇的事情发生。 wrt/您的断言“您没有覆盖trans”,简单的文本搜索可能还不够。一个非常常见的(反)模式是星形导入覆盖,即from x import y; from z import *,其中z也导出y符号。另外,如果您不熟悉 Python,Python 的函数 不 存在于孤立的命名空间中,它们是普通变量。 -
我不知道是否会与名为 trans 或 translate 的任何 Django 变量发生名称冲突。我的想法不多了。我不在 Python 中使用狂野的导入来避免问题。
-
@brunodesthuilliers 我刚刚在进一步测试后更新了我的问题。
标签: python django internationalization