4

<textarea>現在、Google Translation API を使用して、イントラネット アプリのフィールドを翻訳する Greasemonkey スクリプトを開発しています。

しかし、一部のテキストは大きすぎて 1 回のリクエストで翻訳することはできません。しようとすると、このエラーが発生します。

エンティティが大きすぎるリクエスト

とにかく、テキストを断片に切り取り、別々のリクエストで送信する方法を見つけました。それが難しいのは、元のテキストエリア、特に適切な場所でこれらのフラグメントをどのように置き換えるかです。

成功せずにいくつかの方法を試した後、翻訳する必要があるテキストの断片に対応するプレースホルダーをテキストエリアに挿入しました。

{1}
{2}
...

しかし、今度は XHR の成功のコールバックで、プレースホルダーを翻訳されたテキストに置き換える必要があります。問題は、私の XHR がforループ内にあり、元のテキストのフラグメントを含むテーブルを反復処理していることです。リクエストが終了すると、ループは長く終了し、翻訳をどこに置くべきかわかりません。

コードは次のとおりです。

//Array text[] contains the fragments of original text
var translated_text = [];
var l = text.length;
for(var i = 0; i < l; i++)
{
var fullurl = apiurl+encodeURIComponent(text[i]);
GM_xmlhttpRequest({
    method: 'GET',
    url: fullurl,
    headers:
    {
        'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
        'Accept': 'application/atom+xml,application/xml,text/xml',
    },
    onload: function(responseDetails)
    {
        var destination = "{"+i+"}";
        if(responseDetails.status == 200)
        {
            var data = $.parseJSON(responseDetails.responseText);
            translated_text[i] = data.responseData.translatedText.replace(/&quot;/g,"\"").replace(/&#39;/g,"\"").replace(/&gt;/g,">");
            textarea.text(textarea.text().replace("{"+i+"}",translated_text[i]));
        }
        else
        {
            alert('Request Failed : '+responseDetails.status+"\nError : "+responseDetails.statusText);
        }
    }
});
}

PS : これはクロス ドメイン リクエストであるため、jQuery の AJAX メソッドを使用できません。したがって、新しい$.when機能はここでは使用できません (残念ながら)。

4

2 に答える 2

2

更新: GreasemonkeyとTampermonkeyの新しいバージョンでは、  Docを渡す ことができるようになりましたcontext

GM_xmlhttpRequest ( {
   method:   'GET',
   url:      fullurl,
   context:  i,
   headers:  {
               'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
               'Accept': 'application/atom+xml,application/xml,text/xml',
             },
   onload:   function (responseDetails) {
                var destination = "{" + responseDetails.context + "}";  // context is `i`
                if (responseDetails.status == 200) {
                   var data           = $.parseJSON (responseDetails.responseText);
                   translated_text[i] = data.responseData.translatedText.replace (/&quot;/g,"\"")
                                      .replace (/&#39;/g,"\"").replace (/&gt;/g,">")
                                      ;
                   textarea.text (textarea.text ().replace ("{"+i+"}",translated_text[i]) );
                }
                else {
                   alert (
                      'Request Failed : '+responseDetails.status+"\nError : "
                      + responseDetails.statusText
                   );
                }
             }
} );

他の/古いプラットフォームの場合、の値を使用するには、 JavaScriptクロージャでラップiする必要があります これを行う1つの方法は次のとおりです。

( function (i)  {
   GM_xmlhttpRequest ( {
      method:   'GET',
      url:      fullurl,
      headers:  {
                  'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
                  'Accept': 'application/atom+xml,application/xml,text/xml',
                },
      onload:   function (responseDetails) {
                   var destination = "{"+i+"}";
                   if (responseDetails.status == 200) {
                      var data           = $.parseJSON (responseDetails.responseText);
                      translated_text[i] = data.responseData.translatedText.replace (/&quot;/g,"\"")
                                         .replace (/&#39;/g,"\"").replace (/&gt;/g,">")
                                         ;
                      textarea.text (textarea.text ().replace ("{"+i+"}",translated_text[i]) );
                   }
                   else {
                      alert (
                         'Request Failed : '+responseDetails.status+"\nError : "
                         + responseDetails.statusText
                      );
                   }
                }
   } );
} ) (i);
于 2011-03-04T10:02:11.900 に答える
0

私が理解している限り、jQueryを使用して、このようなクロスドメインリクエストを行うことができます...

function pass_ajax(url,text_to_translate){
    $.ajax({
      type: 'GET',
      url: url,
      crossDomain: true,
      data: text_to_translate,
      dataType: 'json',
      success: function(data){
        req = data; //here you can sanitize the data before concatenating
      },
      complete: function(xhr,textStatus){
        translated_text += req;
      }
    });

「crossDomain: true」プロパティは、jQuery 1.5 の新機能です。また、success と complete を利用して、返されたテキストを連結し、外側のスコープを持つ変数に割り当てることもできると思います。

于 2011-03-04T09:58:28.757 に答える