Django模板中的_()或{%trans%}?

Ant*_*off 43 django translation django-templates internationalization

在Django模板中,您可以使用{{ _("Hello World") }}{% trans "Hello World" %}标记要翻译的字符串.在文档中,"官方"方法似乎是{% trans %}标记,但_()语法也提到过一次.

这些方法有何不同(语法除外)以及为什么应该优先于其他方法?

一个区别是你显然不能使用{% trans %}标签和过滤器.但这是否意味着我可以_()随处使用,比如{{ _("String") }}?与使用{% trans "String" %}独立字符串以及_()标签和过滤器相比,它更加干净,更加一致.

Ant*_*off 49

所以看起来技术上没有Django 1.5的区别.translate在两种情况下,模板引擎在内部标记用于转换的变量(通过设置其属性):

稍后,当解析变量时,Django将其包装ugettext或者pgettext如果它看到该translate属性.

但是,从源代码可以看出,有一些灵活性考虑因素有利于{% trans %}标记:

  • 你可以这样做{% trans "String" noop %},它会把字符串翻译成.po文件,但在渲染时实际上不会翻译输出(translate变量没有内部属性,没有ugettext调用);
  • 你可以指定消息上下文*,像{% trans "May" context "verb" %};
  • 您可以将已翻译的消息放入变量中供以后使用*,例如{% trans "String" as translated_string %}.

*自Django 1.4起.

如果我遗漏任何东西,请随时纠正我或发布更好的答案.