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 不行。

考虑到这些要点,我们得出的解决方案如下:

  1. 转义资源包中的字符。
  2. 明确设置标签
    <select label="${i18n.mySelectorLabel}">
  3. 使用附加点以编程方式设置标签。

我们选择了选项 2。虽然不理想,但在使用 Dojo ShrinkSafe 的 Dojo 1.7 和使用 Uglify 的 Dojo 1.10 上都表现出色。