我可以使用 sightly 显示上下文和 i18n 标签吗?

Can I use sightly display context along with i18n label?

我在我的项目中看到一个代码

${'myproj.label' @i18n, format=[sighltyObj.field1], context='text'} 

目的是将变量传递给 i18n 文本 + 对文本进行安全编码。使用显示上下文和 i18n 翻译是否正确?当我使用 field1 = "Hello%20World" 进行测试时,它没有对文本进行编码,而是按原样呈现。 如何在将参数作为变量传递给 i18n 时对 html 字符串进行编码?

HTL 不会解码 format 返回的文本。我认为混淆来自说明显示上下文 text 以下内容的文档:

Use this for simple HTML content - Encodes all HTML

(来源:HTL Specification Section 1.2.1 Display Context

但这并不意味着此上下文 解码 任何内容,它 编码 HTML 标签。

因此,如果 sighltyObj.field1Hello%20World,它将 而不是 呈现为 Hello World,而是呈现为 Hello%20World,正如您已经注意到的那样.

显示上下文 text 编码 给定文本中的所有 HTML 标签,这样您就无法 "smuggle"文本(参见代码注入)。

例如:

${'<p>This is my text</p>' @ context='text'}

将创建以下 HTML

&lt;p&gt;This is my text&lt;/p&gt;

请注意 p 标签是如何 编码的 :

<p> 变成了 &lt;p&gt;</p> 变成了 &lt;/p&gt.

sighltyObjfield1 的 getter 必须进行 解码 以便 Hello%20World 变为 Hello World。 Whosebug 上已经有一个答案告诉你如何做到这一点:

String result = java.net.URLDecoder.decode(url, "UTF-8");