Django翻译和gettext : The deprecation of the % (string interpolation) operator

标签 django string internationalization deprecated string-interpolation

尽管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 xgettextDjango 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/

相关文章:

python - 在模型上运行 objects.all() 时出现 TypeError

Django:如何增加存储在 models.py/Database 中的计数器

java - 使用多个分隔符分割查询字符串 - java

django - 将实例传递给 Django 表单集

java - 如何创建比较字符串长度的条件语句?

c++ - VS2015无法从 'initializer list'转换为 'std::string'错误

grails i18n 换行符

java - Android 中文本的本地化

ruby-on-rails - 在 I18n 消息中使用 a/an

django - 多对多关系作为列表