10

尽管 Django Django 还不支持 Python 3,但它最终会支持,所以我想让我的代码尽可能地“面向未来”。

从 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,
        }

“新”方式:

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仅在需要时才评估的对象。

4

1 回答 1

18

你可以安全地使用它。例如

ugettext_lazy('{foo}').format(foo='bar')

Django 使用的翻译程序xgettext不关心要翻译的内容。它只是在.py文件中搜索关键字,例如ugettext_lazy_收集可翻译的字符串(参考xgettextDjango 代码的手册)

此外,上述.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发生在不同的阶段。

于 2012-06-12T16:53:34.737 回答