尽管Django Django尚不支持Python 3,但最终仍会支持。因此,我想让我的代码尽可能“面向 future ”。
从Python 2.7开始,不推荐使用字符串插值运算符(%
)。而且我意识到,每个需要翻译的字符串都使用了%
插值语法。并且在Django文档中,没有提到新的str.format
方法(“新的”正式的字符串格式设置方法)...gettext
库可能有一个限制,但我不这么认为,因为该字符串在.PO文件中看起来是相同的。
问题是我是否可以使用新的字符串format
方法进行翻译。
旧方法:
class Post(models.Model):
title = models.CharField(max_length=50)
date = models.DateField()
# ...
def __unicode__(self):
return _('%(title)s (%(date)s)') % {
'title': self.title,
'date': self.date,
}
"new"方式:
class Post(models.Model):
title = models.CharField(max_length=50)
date = models.DateField()
# ...
def __unicode__(self):
return _('{title} ({date})').format(
title=self.title,
date=self.date,
)
另外,
ugettext_lazy
并不真正返回字符串,而是Promises
,仅在需要时才对其进行评估。
最佳答案
您可以安全地使用它。例如
ugettext_lazy('{foo}').format(foo='bar')
Django使用的翻译程序
xgettext
不在乎要翻译的内容。它只是在.py
文件中搜索诸如ugettext_lazy
或_
之类的关键字以收集可翻译的字符串(引用the manual of xgettext和Django code)此外,上面的
.format()
方法是代理对象提供的包装器,例如:>>> ugettext_lazy(u'{foo}').format
<bound method __proxy__.__wrapper__ of <django.utils.functional.__proxy__ object at 0x102f19050>>
上面的
.format()
的调用将使u'{foo}'
转换为某些unicode value
,然后使用实际参数调用value.format
。您会看到翻译和value.format
发生在不同的阶段。
关于Django翻译和gettext : The deprecation of the % (string interpolation) operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999954/