Django trans 标签可以包含 HTML 标签吗?

Posted

技术标签:

【中文标题】Django trans 标签可以包含 HTML 标签吗?【英文标题】:Can Django trans tags include HTML tags? 【发布时间】:2015-12-26 02:46:45 【问题描述】:

例如我可以做% trans "Hold <em><strong>Ctrl</strong></em>" % 吗?还是我必须改用% trans "Hold" % <em><strong>% trans "Ctrl" %</strong></em>"

【问题讨论】:

【参考方案1】:

我们可以在trans 模板标签中包含 HTML 标签吗?

不,我们不应该在 trans 模板标签中包含 html 标签,就像您在第一种方法 % trans "Hold <em><strong>Ctrl</strong></em>" % 中所做的那样。这是错误的做法

来自docs:

% trans % 模板标签可以转换一个常量字符串 (用单引号或双引号括起来)或可变内容。

不能在% trans % 的字符串中混合模板变量。 如果您的翻译需要带变量的字符串 (占位符),请改用% blocktrans %

<title>% trans "This is the title." %</title> # example 1

<title>% trans "myvar" noop %</title>  # example 2

解决方案一:使用trans模板标签

除了将 HTML 代码放在 trans 标记中之外,您还可以执行以下操作来获得所需的结果(尽管这不是推荐的方法)。

% trans "Hold" % <em><strong>% trans "Ctrl" %</strong></em> # using trans tag

解决方案2:改用blocktrans标签

更好的选择是使用blocktrans 模板标签而不是trans 标签来包含HTML 标签。

blocktrans 标签允许您标记由以下组成的复杂句子 文字和可变内容通过利用 占位符:

然后你可以这样做:

% blocktrans %
Hold <em><strong>Ctrl</strong></em>
% endblocktrans %

【讨论】:

这似乎不符合DRY原则。 某种程度上可以说。 在我的情况下相当多。 @RahulGupta 我对此感到困惑。混合变量和字符串的能力与包含 HTML 标记(它们只是常量字符串)有什么关系?也就是说,您应该能够很好地包含它们,但您需要确保它们被正确翻译(即在大多数情况下没有翻译);) 解决方案一并不正确,如果单词是句子的一部分,则单独翻译这些单词是没有意义的。例如:某些语言需要它们反过来(“Ctrl”然后“Hold”)。【参考方案2】:

正如 Rahul 在他的回答中所说,不应在 trans 模板标签中包含 HTML 标签。但是,根据Translating text blocks with Django .. what to do with the HTML?(我刚刚发现),可以将 HTML 标签放在 blocktrans 模板标签中。因此我不必做% trans "Hold" % &lt;em&gt;&lt;strong&gt;% trans "Ctrl" %&lt;/strong&gt;&lt;/em&gt;"。我在the Django 1.8 docs 中找不到这样的说明。

【讨论】:

是的,我们不能在 trans 模板标签中使用 HTML 标签,但我们可以使用 blocktrans 标签。使用trans 模板的解决方案不是最好的解决方案。我们可以使用blocktrans 模板标签代替我们的案例。我已经更新了答案,请检查。

以上是关于Django trans 标签可以包含 HTML 标签吗?的主要内容,如果未能解决你的问题,请参考以下文章

默认过滤器中的 Django trans 标记

使用包含标签插入.html的嵌套Django视图

Django 模板:翻译带有 HTML 的文本块的最佳实践

我将如何在 Django 模板标签中使用模板上下文变量的值? [复制]

我如何在Django模板标签中使用模板上下文变量的值? [重复]

处理 django 包含模板标签中的请求