1

JavaScript で独自の翻訳機能を構築したいと考えています。私はすでに単語や表現を翻訳する関数 language.lookup(key) を持っています:

var frenchHello = language.lookup('hello') //'bonjour'

ここで、html 文字列を受け取り、それをルックアップ関数で変換する関数を書きたいと思います。HTML 文字列には、この単語を翻訳する必要があることを示す #[translationkey] などの特別な構文があります。

これは私が望む結果です:

var html = '<div><span>#[hello]</span><span>#[sir]</span>'
language.translate(html) //'<div><span>bonjour</span><span>monsieur</span>

language.translate はどのように記述すればよいですか? 私の考えは、正規表現を使用して特別な構文を除外し、各キーで language.lookup を実行することです。たぶん、文字列の置換か何かで。

正規表現に関してはひどいもので、非常に不完全な例しか思いつきませんでしたが、とにかくそれを含めて、誰かが私がやろうとしていることを理解できるようにします。次に、より良いが完全に異なるソリューションがあれば、それは大歓迎です。

var value = "#[hello], nice to see you.";

lookup = function(word){
    return "bonjour";
};

var res = new RegExp( "\\b(hello)\\b", "gi" ).exec(value)

for (var c1 = 0; c1 < res.length; c1++){
    value = value.replace(res[c1], lookup(res[c1]))
}       
alert(value) //#[bonjour], nice to see you.

もちろん、正規表現は hello という単語を除外するのではなく、構文を除外してから、グループ化などによってキーを収集する必要があります。

誰でも助けることができますか?

4

4 に答える 4

2

String.replaceメソッドの機能を使用して、2 番目の引数として指定された関数を呼び出して置換テキストを生成し、構文に一致する正規表現を使用してグローバルな置換を行います。

var value = "#[hello], #[sir], nice to see you.";

lookup = function(full_match, word){
    if(word == 'hello')
        return "bonjour";
    if(word == 'sir')
        return "monsieur"
};

console.log(value.replace(/#\[(.+?)\]/gi, lookup))

結果:ボンジュール、ムッシュ、お会いできてうれしいです。

もちろん、置換リストが大きくなった場合は、ルックアップ関数で一連の if の代わりにルックアップ オブジェクトを使用することをお勧めしますが、本当にやりたいことは何でもできます。

于 2012-04-25T08:57:46.780 に答える
1

次のようなものを使用できます。

#\\[[^\\]]*\\]

これは、ハッシュの後に左角括弧が続き、その後に右角括弧を含まない 0 個以上の文字が続き、その後に右角括弧が続くものと一致します。

または、サーバー側で (おそらくテンプレート エンジンを介して) 翻訳を処理し、翻訳された応答をクライアントに送り返す方がよいでしょう。そうしないと (もちろん、対処している特定の問題によって異なりますが)、ブラウザに大量のデータを送信することになり、アプリケーションの応答が遅くなる可能性があります。

編集:ここにコードの作業部分があります:

    var q="This #[ANIMAL1] was eaten by that #[ANIMAL2]";
    var u = {"#[ANIMAL1]":"Lion","#[ANIMAL2]":"Frog"};

    function insertAnimal(aString, lookup){
        var res = (new RegExp("#\\[[^\\]]*\\]", "gi"))          
        while (m = res.exec(aString)){
            aString = aString.replace(m, lookup[m])
        }       
        return aString;
    }  

    function main(){
        alert(insertAnimal(q,u));           
    }

HTML ドキュメントの body onload イベントから「main()」を呼び出すことができます

于 2012-04-25T08:19:45.893 に答える
1

これを試して、すべての出現を見つけることができます:

var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'),
    str = '#[value1] plain text #[value2]',
    match;

while (match = re.exec(str)) {
    console.log(match);
}
于 2012-04-25T08:36:20.147 に答える
0

あなたの要件を「コンテンツ内のテンプレート テキストの解決」と比較できます。Jquery を使用できる場合は、Handlebars.jsを試してください 。

于 2012-04-25T08:23:39.400 に答える