Dojo 本地化 - 当本地化字符串包含单引号时,data-dojo-props 失败
Dojo Localization - data-dojo-props fails when localised string contains single quote
我正在尝试本地化 dojo 模板,但当本地化字符串包含单引号时我遇到了问题。
我的模板看起来像这样:
<div>
<select data-dojo-props="label:'${i18n.mySelectorLabel}'"
>
</select>
</div>
法语资源包中的相关行如下所示:
"mySelectorLabel" : "d'élément :",
我期望 dojo 模板系统能够处理法语单词 'element' 中的单引号,而无需在资源包中进行额外的转义。
执行我的代码会导致以下错误:
dojo/parser::parse() error Error: SyntaxError: Expected '}' in data-dojo-props='label:'d'élément :''
显然单引号没有被适当地转义,但我不确定我的错误在哪里。在资源包的字符串中转义单引号似乎很奇怪。
我只是想把它扔出去。尝试在模板中颠倒使用单引号和双引号:
<div>
<select data-dojo-props='label:"${i18n.mySelectorLabel}"'>
</select>
</div>
更新: 不幸的是,这也不是一直有效 - 请参阅 OP 的评论以获得进一步的解释。
查看 dojo 解析器的工作原理,它似乎将 data-dojo-props 属性的值传递给 eval。你最终得到这样的结果:
eval("{" + "label:'${i18n.mySelectorLabel}'" + "}");
这似乎暗示问题中概述的问题是 dojo 的基本限制。
vogomatix 提出的解决方法特别适用于 ' 字符,但会受到正在使用的缩小器的影响。 Uglify 可以,但 Dojo ShrinkSafe 不行。
考虑到这些要点,我们得出的解决方案如下:
- 转义资源包中的字符。
- 明确设置标签
<select label="${i18n.mySelectorLabel}">
- 使用附加点以编程方式设置标签。
我们选择了选项 2。虽然不理想,但在使用 Dojo ShrinkSafe 的 Dojo 1.7 和使用 Uglify 的 Dojo 1.10 上都表现出色。
我正在尝试本地化 dojo 模板,但当本地化字符串包含单引号时我遇到了问题。
我的模板看起来像这样:
<div>
<select data-dojo-props="label:'${i18n.mySelectorLabel}'"
>
</select>
</div>
法语资源包中的相关行如下所示:
"mySelectorLabel" : "d'élément :",
我期望 dojo 模板系统能够处理法语单词 'element' 中的单引号,而无需在资源包中进行额外的转义。
执行我的代码会导致以下错误:
dojo/parser::parse() error Error: SyntaxError: Expected '}' in data-dojo-props='label:'d'élément :''
显然单引号没有被适当地转义,但我不确定我的错误在哪里。在资源包的字符串中转义单引号似乎很奇怪。
我只是想把它扔出去。尝试在模板中颠倒使用单引号和双引号:
<div>
<select data-dojo-props='label:"${i18n.mySelectorLabel}"'>
</select>
</div>
更新: 不幸的是,这也不是一直有效 - 请参阅 OP 的评论以获得进一步的解释。
查看 dojo 解析器的工作原理,它似乎将 data-dojo-props 属性的值传递给 eval。你最终得到这样的结果:
eval("{" + "label:'${i18n.mySelectorLabel}'" + "}");
这似乎暗示问题中概述的问题是 dojo 的基本限制。
vogomatix 提出的解决方法特别适用于 ' 字符,但会受到正在使用的缩小器的影响。 Uglify 可以,但 Dojo ShrinkSafe 不行。
考虑到这些要点,我们得出的解决方案如下:
- 转义资源包中的字符。
- 明确设置标签
<select label="${i18n.mySelectorLabel}">
- 使用附加点以编程方式设置标签。
我们选择了选项 2。虽然不理想,但在使用 Dojo ShrinkSafe 的 Dojo 1.7 和使用 Uglify 的 Dojo 1.10 上都表现出色。