Django translations和gettext:(字符串插值)运算符的弃用

Django translations和gettext:(字符串插值)运算符的弃用,django,string,internationalization,deprecated,string-interpolation,Django,String,Internationalization,Deprecated,String Interpolation,虽然Django Django还不支持Python3,但它最终会支持,所以我希望我的代码能够更“经得起未来的考验” 自Python 2.7以来,字符串插值运算符(%)已被弃用。我意识到每个需要翻译的字符串都使用了%插值语法。在Django文档中,没有提到新的str.format方法(字符串格式的“新”官方方式) 也许gettext库有限制,但我不这么认为,因为字符串在.PO文件中看起来是相同的 问题是我是否可以使用新的stringformat方法进行翻译 老办法: class Post(mode

虽然Django Django还不支持Python3,但它最终会支持,所以我希望我的代码能够更“经得起未来的考验”

自Python 2.7以来,字符串插值运算符(
%
)已被弃用。我意识到每个需要翻译的字符串都使用了
%
插值语法。在Django文档中,没有提到新的
str.format
方法(字符串格式的“新”官方方式)

也许
gettext
库有限制,但我不这么认为,因为字符串在.PO文件中看起来是相同的

问题是我是否可以使用新的string
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,
        }
“新”方式:


另外,
ugettext\u lazy
实际上并不返回字符串,但
承诺了只在需要时才计算的对象。

您可以安全地使用它。比如说

ugettext_lazy('{foo}').format(foo='bar')
Django使用的翻译程序
xgettext
,不关心要翻译的内容。它只是在
.py
文件中搜索关键字,如
ugettext\u lazy
\u
,以收集可翻译字符串(参考和)

此外,上面的
.format()
方法是代理对象提供的包装,如:

>>> ugettext_lazy(u'{foo}').format
<bound method __proxy__.__wrapper__ of <django.utils.functional.__proxy__ object at 0x102f19050>>
>>ugettext_lazy(u'{foo}')。格式

调用上面的
.format()
会将
u'{foo}'
转换为一些unicode
value
,然后使用实际参数调用
value.format
。您可以看到翻译和
value.format
发生在不同的阶段。

您尝试过吗?你没有弄清楚你是否尝试过并失败了,或者只是在问是否可能。我看不出有什么明显的原因它不应该工作,但如果它确实失败了,那么Django gettext扩展肯定就是不兼容的,这意味着您基本上运气不佳。当Django支持Python 3时,您可以像Python 3一样使用它。我已经尝试过,似乎一切都很好,但我不确定这是否是一种“正确”的方式,因为文档中没有提到任何关于这种不推荐的内容。您能解释一下新的fstring会发生什么吗?@AdamBarnes没有魔力。f字符串由Python格式化。如果您在
.
,则
.
函数将收到一个已格式化的字符串(已替换
{foo}
),并且在翻译表(
.mo
文件)中找不到正确的参考字符串。
>>> ugettext_lazy(u'{foo}').format
<bound method __proxy__.__wrapper__ of <django.utils.functional.__proxy__ object at 0x102f19050>>