Django的自定义 {% trans %} 标签

4
我为Django编写了一个模板标签,可以像这样使用:{% foo bar="foobar"%}。该标签获取bar参数值,对其使用ugettext进行翻译,并用翻译后的字符串渲染标签。
因此,基本上,该标签的实现看起来大致如下:
@register.simple_tag
def foo(bar):
    return "something something " + ugettext(bar)

很不幸,我们在使用ugettext与变量时,这意味着Django不会标记我们的bar参数值进行翻译。
我在Django的makemessages以及{% trans %}代码中寻找解决方案,但没有找到任何清楚说明如何完成"标记翻译"的方法。那么,我的问题是:要怎么做?如何强制Django认为我的标签的bar参数值应该被翻译,以便在执行manage.py makemessages后出现在.po(t)文件中?

1
问题在于它对传入的字符串一无所知(或者说它不知道这是一个字符串),你可以将已翻译好的字符串传递给标签,但即使这样也可能难以获得正确翻译的字符串(参见 Django 文档中日期示例)。 - Sayse
嗯,我知道我可以使用类似 {% trans "sth" as var %} 然后 {% foo bar=var %} 的东西。我的问题是如何避免它,如果可能的话。 - m4tx
我还没有找到一个好的方法,当然你可以手动编写makemessages创建的文件,但我认为那样更糟糕。 - Sayse
@BurhanKhalid 你所说的“fixed”是什么意思?bar参数的值始终为字符串字面量。 - m4tx
1个回答

1

不必创建“自定义”转换标签,可以使用_()语法传递字符串,这样参数就会得到已经翻译好的字符串。

对于问题中的标签,这意味着我们可以将标签实现更改为简单的形式:

@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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接