拥有 Django 的 {% trans %} 标签

Own {% trans %} tag for Django

我为 Django 编写了一个模板标签,其用法类似于 {% foo bar="foobar"%}。该标签采用 bar 参数值,在其上使用 ugettext 并使用翻译后的字符串呈现标签。

因此,基本上,标记的实现大致如下所示:

@register.simple_tag
def foo(bar):
    return "something something " + ugettext(bar)

不幸的是,我们将 ugettext 与变量一起使用,这意味着 Django 不会标记我们的 bar 参数值进行翻译。

我在 Django makemessages{% trans %} 代码中寻找解决方案,但没有找到任何可以清楚说明 "marking for translation" 是如何完成的。所以,我的问题是:怎么做?如何强制 Django 认为我的标签的 bar 参数值应该被翻译,所以它在执行 manage.py makemessages?

后出现在 .po(t) 文件中

无需创建 "custom" trans 标记,可以使用 _() 语法传递字符串,因此参数会得到一个已翻译的字符串。

如果是问题中的标签 - 这意味着我们可以将标签实现更改为简单的:

@register.simple_tag
def foo(bar):
    return "something something " + bar

但不必使用这样的东西:

{% trans "foobar" as var %}
{% foo bar=var %}

而是:

{% foo bar=_("foobar") %}

够方便,不浪费行和变量,标记字符串待翻译

参见:https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#string-literals-passed-to-tags-and-filters