我目前正在<textarea>
使用 Google Translation API 开发一个 Greasemonkey 脚本来翻译 Intranet 应用程序中的字段。
但是有些文本太大了,只需要一个请求就无法翻译。尝试时出现此错误:
请求的实体太大
无论如何,我找到了一种将文本分割成片段的方法,并在单独的请求中发送它们。棘手的地方是我应该如何在原始文本区域中替换这些片段,尤其是在正确的位置。
在尝试了几种方法都没有成功后,我在文本区域中插入了占位符,对应于必须翻译的文本片段:
{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
这里不能使用新功能(遗憾)