django - 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" %}
将是“世界”。
这就是我想明白的奥妙之处!
解决方案
变量可以通过过滤器进行修改。过滤器通过管道符号 (|) 与变量分隔,并且可以在括号中包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器
所以它做了描述的事情:
trans
使用参数“msgid-”进行评估- 将结果传递给下一个过滤器并添加“世界”
我建议你使用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/以了解如何解决问题的大量选项
推荐阅读
- dart - 从当前版本升级到最新版本时出现错误
- square-connect - 轮询 Square Device 状态
- javascript - cavsTxt.measureText 根据字体系列和字体大小为文本提供不同的宽度
- python - 从 SparseTensorValue 访问值
- php - PHP:准备好的语句不能从单引号中转义
- sql - 以垂直方式显示Sing
- timestamp - UTC时间戳需要保存在java变量中
- php - 从 ZendFramework 3 调用存储过程
- javascript - react-native 将两个数组合二为一
- node.js - 使用 sinon 模拟连接池和测试 url 参数?