首页 > 解决方案 > django trans 标签内的过滤器:首先翻译然后应用过滤器;不像其他标签

问题描述

我遇到了来自 djangotrans标签的奇怪行为。如您所知,每当我们在标签内使用过滤器时,过滤器首先应用,然后将结果作为输入提供给标签。但这与 trans 标签的顺序相反。

例子:

假设我有这个 django.po 文件:

msgid "msgid-world"
msgstr "world"

msgid "msgid-"
msgstr "message"

现在查看这些标签的结果:

{% trans "msgid-"|add:"world" %}
result: messageworld  (first translate then concat)

预期结果:“世界”(先连接然后翻译密钥)

更新

我的问题是关于一致性。与其他标签(如“if”)的行为相反!

此外,如果我为自己编写一个自定义标签,如下所示:

@register.simple_tag
def customtrans(a):
    return _(str(a))

那么它的行为就像其他标签一样。这个例子的结果(如上面的例子):

{% customtrans "msgid-"|add:"world" %}

将是“世界”。

这就是我想明白的奥妙之处!

标签: djangodjango-templatesdjango-template-filtersdjango-i18n

解决方案


根据jinja2 文档

变量可以通过过滤器进行修改。过滤器通过管道符号 (|) 与变量分隔,并且可以在括号中包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器

所以它做了描述的事情:

  1. trans使用参数“msgid-”进行评估
  2. 将结果传递给下一个过滤器并添加“世界”

我建议你使用blocktrans来实现你的目的

{% load i18n %}
{% blocktrans %}
    msgid-world
{% endblocktrans %}

或者您可以使用 with 语句:

{% with variable="msgid-"|add:"world"}
    {% trans variable %}
{% endwith%}

另请查看https://docs.djangoproject.com/en/3.0/topics/i18n/translation/以了解如何解决问题的大量选项


推荐阅读