在 Django 模板中,您可以使用 {{ _("Hello World") }}
或 {% trans "Hello World"%}
将字符串标记为被翻译。在文档中,“官方”方法似乎是 {% trans %}
标记,但也提到了 _()
语法 once .
这些方法有何不同(语法除外)以及为什么应优先选择一种而不是另一种?
一个区别是您显然不能将 {% trans %}
与标签和过滤器一起使用。但这是否意味着我可以随处使用 _()
,例如 {{ _("String") }}
?与使用带有独立字符串的 {% trans "String"%}
和带有标签和过滤器的 _()
相比,它看起来更简洁、更一致。
最佳答案
所以从 Django 1.5 开始,技术上似乎没有什么区别。模板引擎在两种情况下在内部标记要翻译的变量(通过设置其 translate
属性):
- 当您执行
{% trans VAR %}
(参见TranslateNode
)时,或者 - 如果变量的名称以
_(
开头并以) 结尾
(参见Variable.__init__
)。
稍后,当变量被resolved ,如果 Django 看到 translate
属性,则用 ugettext
或 pgettext
包装它。
不过从源码可以看出,有一些灵 active 的考虑,有利于{% trans %}
标签:
- 你可以做
{% trans "String"noop %}
,这会将要翻译的字符串放入 .po 文件中,但在渲染时不会实际翻译输出(没有内部translate
变量的属性,无ugettext
调用); - 您可以指定消息上下文*,例如
{% trans "May"context "verb"%}
; - 您可以将翻译后的消息放入变量中供以后使用*,例如
{% trans "String"as translated_string %}
.
* 从 Django 1.4 开始。
如果我遗漏任何内容,请随时纠正我或发布更好的答案。
关于django - _() 或 Django 模板中的 {% trans %}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496173/