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

在Django模板中,可以使用{{ _("Hello World") }}{% trans "Hello World" %}来标记要翻译的string。 在文档中,“官方”方法似乎是{% trans %}标记,但是_()语法也被提及过一次 。

这些方法如何不同 (语法除外),为什么应该是一个更好的而不是另一个呢?

一个区别是,你显然不能使用带有标签和filter的{% trans %} 。 但这是否意味着我可以在任何地方使用_() ,如{{ _("String") }} ? 它的工作原理看起来比使用独立string的{% trans "String" %}和使用标签和filter的_()更清晰和更一致。

所以看起来从Django 1.5开始在技术上没有什么区别。 模板引擎在两种情况下在内部标记用于翻译的variables(通过设置其translate属性):

  • 当你做{% trans VAR %} (参见TranslateNode )或者
  • 如果一个variables的名字以_(开始_(以及结束于) (参见Variable.__init__ )。

稍后,当variables正在被parsing时 ,Django会使用ugettextpgettext包装它,如果它看到translate属性。

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

  • 你可以做{% trans "String" noop %} ,它将翻译的string放到.po文件中,但是在渲染时不会翻译输出(variables没有内部translate属性,没有ugettext调用)。
  • 你可以指定消息上下文* ,如{% trans "May" context "verb" %} ;
  • 你可以把翻译的消息放到variables中供以后使用* ,如{% trans "String" as translated_string %}

*从Django 1.4开始。

请随时纠正我或张贴更好的答案,以防万一我失去了什么。

trans模板标签调用ugettext()函数。 在Django中_()ugettext()的别名。 这在django文档中有介绍 。