django blocktrans和模板中的i18n

Jul*_*ien 10 django templates translation internationalization

我在django有一个i18n问题:

这很好用:

{% trans cat.name %}  
Run Code Online (Sandbox Code Playgroud)

cat.name 将被翻译

但这不起作用:

{% blocktrans with cat.name|slugify as cat_slug %}{{ cat_slug }}{% endblocktrans %}  
Run Code Online (Sandbox Code Playgroud)

cat.name 没有翻译

如果我更改过滤器:

{% blocktrans with cat.name|capfirst as cat_slug %}{{ cat_slug }}{% endblocktrans %}  
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*Tom 18

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

关键blocktrans是允许翻译占位符周围的文本.它不会翻译任何内部{{...}}.

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

{% blocktrans %}This is my variable: {{variable}}{% endblocktrans %}
Run Code Online (Sandbox Code Playgroud)

将转换为如下所示的内容:

msgid:"This is my variable: %s"
Run Code Online (Sandbox Code Playgroud)

我认为你不能在blocktrans标签中翻译变量.你可以用常量字符串,{% blocktrans with _("string") as x %}{{x}}{% endblocktrans %}但我想不出你想要的原因.

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


Jul*_*ien 9

这有效:

{% filter slugify %}{% trans cat.name %}{% endfilter %}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

{% with cat_slug=cat.name|slugify %}
    {% trans cat_slug %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

PS 我知道我正在回答一个 6 年前的问题,但我已经遇到过这种确切的情况好几次了,但还没有看到一个可以处理它的问题/答案。


小智 2

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

?
Run Code Online (Sandbox Code Playgroud)

编辑:你是对的,文档说过滤器要放置在 blocktrans 中