1

私は現在、かなり長い間壊れていた Facebook の国際化 XFBML タグのフロントエンドの再実装に取り​​組んでいます。私はほぼ完成しましたが、ハングアップが 1 つあります: 子ノードの情報を失うことなく、トークン化された翻訳を置き換えます。

背景として、翻訳タグは次のようになります。

<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 に答える