0

bing V2 JavaScript API が機能するには、コールバックが必要です。jQuery を使用してスクリプト ブロックを動的に追加します (グローバル名前空間の汚染を無視します)。

function translate(text) {
    var txt = "text=" + text;
    var lang = "&to=fr";
    var appId = "&appid=apikey"; // Add your AppId here
    var func = "&oncomplete=window.translated";

    $("<script><\/script>")
                .attr("src", "http://api.microsofttranslator.com/V2/ajax.svc/Translate?" + txt + lang + appId + func)
                .appendTo("HEAD");
}

次に、複数の要素でクリック イベントを使用して翻訳をトリガーします。

$(document).ready(function () {

    $('a').click(function () {
        var tr = $(this).parent().parent();
        var txtin = tr.find('.in').text();
        var out = tr.find('.out'); // would like translation inserted here
        translate(txtin);
        return false;
    });

});

最後に、API が必要とするコールバック:

function translated(text) {
    $("#translation").text(text);
}

翻訳を開始するためにクリックされた要素に応じて、翻訳されたテキストを受け取るさまざまな要素を指定したいのですが、上記のアプローチを使用すると、追加のパラメーターを bing に渡してコールバックで返すことはできません。

行 1 の el をクリックして行 1 に翻訳を配置し、行 2 の el をクリックして行 2 に翻訳を配置できるようにするには、これをどのように書き直す必要がありますか? つまり、クリック イベントで「out」に割り当てられた要素を使用します。

4

1 に答える 1

1

コールバック メソッドは状態オブジェクトをサポートしていないため、グローバルな場所でオブジェクトを追跡する必要があります。私はあなたがそれを作るのを助けるためにキューモデルを実装しました

  1. グローバル変数にキュー定義を追加します。

    var queue = new Array();
    
  2. サービスを呼び出す直前に「out」オブジェクトを追加します

    $('a').click(function () { 
        var tr = $(this).parent().parent(); 
        var txtin = tr.find('.in').text(); 
        var out = tr.find('.out'); // would like translation inserted here 
        //Here it goes
        queue.push(out);
        ////////////////
        translate(txtin); 
        return false; 
    });    
    
  3. オブジェクトのインデックスをテキストに追加すると、サービスが数値を変換しないため、返されます。一度に複数の変換を行わない場合は、インデックスの追加をスキップできます。これは、一部のサービス呼び出しが他よりも遅い場合に正しいオブジェクトを取得できるようにするためだけです。

    function translate(text) {
    
        //Here it goes             
        var txt = "text=" + text + " ___" + (queue.length - 1);     
        ////////////////    
        var lang = "&to=fr";             
        //...no more changes here   
    }
    
  4. 最後に、コールバック メソッドでオブジェクトを抽出し、追加されたインデックスとスプリッターを翻訳済みテキストから削除します。

    function translated(text) {
    
        if (queue.length > 0) {
            var splts = text.split(' ___')
            var indx = splts[splts.length - 1];
            var out = queue[indx];
            //remove the out object from the queue
            queue.slice(indx, indx + 1);
            //remove the index number from the end of the word
            text = text.substr(0, text.lastIndexOf(indx) - 4);
            out.text(text);
        }
    }
    
于 2011-11-23T11:11:17.023 に答える