Javascript翻译模板

时间:2012-08-27 22:53:50

标签: javascript jquery facebook jquery-templates xfbml

我目前正在努力重新实现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.

即使您可以输入动态数据,也可以只翻译一次字符串。很酷的部分(和问题)是你可以嵌套这些字符串。因此,而不是&#34;参数&#34;的纯文本。在令牌内部,它可能在其内部有另一个嵌套的fb:intl标签(反过来可能在其中有另一个标签等)。

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

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

1 个答案:

答案 0 :(得分:0)

经过相当多的黑客攻击后,我能够找到解决方案。

psuedocode是这样的:

  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. 将原始元素替换为克隆。
  7. 到目前为止,这似乎只是花花公子。