1

我目前正在重新实现 Facebook 的国际化 XFBML 标签的前端,该标签已经被破坏了一段时间。我快完成了,但有一个问题:在不丢失子节点信息的情况下替换标记化的翻译。

对于背景,翻译标签看起来像这样:

<fb:intl>
Text goes here and you can have {a-token} like this.
<fb:intl-token name="a-token">parameters</fb:intl>
</fb:intl>

你给他们传递一个这样的字符串: Text goes here and you can have {a-token} like this.

你会得到一个这样的翻译字符串:El texto va aquí y usted puede tener {a-token} como ésta.

即使您可以输入动态数据,这也可以让您只翻译一次字符串。很酷的部分(和问题)是您可以嵌套这些字符串。因此,除了令牌内部的“参数”纯文本之外,它内部可能还有另一个嵌套fb:intl标签(其中可能有另一个嵌套标签,等等)。

我想要做的是在不丢失子节点上下文的情况下进行替换。因此,我只想获取<fb:intl-token>标签并将其移动以替换{token}代表其在字符串中的位置的标签。

关于如何有效地做到这一点的任何想法?

4

1 回答 1

0

经过相当多的黑客攻击,我能够想出一个解决方案。

伪代码是这样的:

  1. 使用 jQuery 克隆原始元素.clone(true)(以维护所有原始数据等)。
  2. 用 清空克隆的元素.empty()
  3. 将 设置.html()为将标记的正则表达式替换为 html 元素,以便可以通过 jQuery: 轻松操作它们.replace(/{([a-zA-Z\-]+)}/, '<span id="$1"></span>')
  4. 循环遍历原始元素的fb:intl-token子元素并为每个子元素执行$(this).insertBefore(placeHolder);(其中 placeHolder 是步骤 3 中替换的标记——这就是它的 id 基于标记名称的原因)
  5. 从克隆的元素中删除占位符。
  6. 用克隆替换原始元素。

到目前为止,这似乎只是花花公子。

于 2012-08-27T23:40:21.220 回答