Django 翻译和 gettext:弃用 %(字符串插值)运算符



虽然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发生在不同的阶段。

最新更新