2012-08-27 250 views
1

我目前正致力于重新实施Facebook的国际化XFBML标签已经打破了一段时间的前端。我几乎完成,但有一个挂断:替换标记化的翻译,而不会丢失子节点的信息。Javascript翻译模板

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

<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}

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

回答

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);(其中占位符是从第3步替换令牌 - 这就是为什么它的ID是基于令牌的名称)
  5. 从克隆的元素中取出占位符。
  6. 用克隆替换原始元素。

到目前为止,这似乎是工作只是丹迪。