<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(/"/g,"\"").replace(/'/g,"\"").replace(/>/g,">");
textarea.text(textarea.text().replace("{"+i+"}",translated_text[i]));
}
else
{
alert('Request Failed : '+responseDetails.status+"\nError : "+responseDetails.statusText);
}
}
});
}
PS : これはクロス ドメイン リクエストであるため、jQuery の AJAX メソッドを使用できません。したがって、新しい$.when
機能はここでは使用できません (残念ながら)。