我在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 %}
我可以看到过滤器正在运行,但没有翻译...
答案 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 %}