django blocktrans和模板中的i18n

时间:2009-11-28 19:31:10

标签: django templates internationalization translation

我在django中遇到了i18n问题:

这很好用:

{% trans cat.name %}  

cat.name将被翻译

但这不起作用:

{% blocktrans with cat.name|slugify as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

cat.name未翻译

如果我更改过滤器:

{% blocktrans with cat.name|capfirst as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

我可以看到过滤器正在运行,但没有翻译...

5 个答案:

答案 0 :(得分:18)

我刚刚开始使用Django国际化,但我认为你误解了{% blocktrans %}标记处理占位符的方式。

blocktrans的要点是允许翻译占位符 文本。它不会翻译{{...}}内的任何内容。

如果查看生成的.po文件,您会看到以下模板代码:

{% blocktrans %}This is my variable: {{variable}}{% endblocktrans %}

将转换为以下内容:

msgid:"This is my variable: %s"

我认为你不能在blocktrans标签中翻译变量。您可以使用{% blocktrans with _("string") as x %}{{x}}{% endblocktrans %}执行常量字符串,但我无法想到您为什么要这样做。

您必须在我认为的视图或模型代码中执行您想要的操作。

答案 1 :(得分:9)

这有效:

{% filter slugify %}{% trans cat.name %}{% endfilter %}

答案 2 :(得分:3)

正如Tom所指出的,blocktrans将保留你在with语句中放置的内容而不是翻译它。您需要做的是在翻译之前使用with。在您的示例中,它看起来像这样:

{% with cat_slug=cat.name|slugify %}
    {% trans cat_slug %}
{% endwith %}

P.S。我知道我正在回答一个6岁的问题,但我现在已经遇到过这种情况,并且没有看到处理它的问题/答案。

答案 3 :(得分:1)

{% blocktrans with cat.name as cat_slug %}{{ cat_slug|capfirst }}{% endblocktrans %}

?
编辑:你说得对,文档说过滤器要放在blocktrans中

答案 4 :(得分:0)

{% blocktrans with cat_slug=cat.name|capfirst %}{{ cat_slug }}{% endblocktrans %}