虽然Django Django还不支持Python 3,但它最终会支持,所以我想让我的代码尽可能"面向未来"。
从 Python 2.7 开始,字符串插值运算符 (%
) 被弃用。我意识到每个需要翻译的字符串都在使用%
插值语法。在 Django 文档中没有提到新的 str.format
方法(字符串格式化的"新"官方方式)......
也许gettext
库有限制,但我不这么认为,因为字符串在 .采购订单文件。
问题是我是否可以使用新的字符串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,
}
"新"方式:
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
或_
来收集可翻译的字符串(参考xgettext和Django代码的手册)
此外,上面的.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
发生在不同的阶段。