2009-11-28 144 views
9

我在Django的国际化问题:Django的blocktrans和模板国际化

这工作得很好:

{% 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 %} 

我可以看到,过滤器工作正常,但没有翻译...

回答

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

? 

编辑:你是对的医生说过滤器作为被放置在blocktrans

+0

似乎VAR不被翻译 {%blocktrans与cat.name为cat_slug%} {{cat_slug}} {%endblocktrans%} 这还没有翻译... – Julien 2009-11-28 21:57:51

9

这工作:

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

这让我太:我想''linebreaksbr''一些翻译文本。 – 2015-10-29 06:50:49

16

我只是刚刚开始使用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 %}来做常量字符串,但我想不出为什么你想要。

你必须做你想要在你的视图或型号代码我想。

3

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

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

P.S.我知道我正在回答一个6年前的问题,但我现在碰到了几次这种确切的情况,并没有看到处理它的SO问题/答案。

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