{
// 替换文本中的换行符为占位符
let textWithPlaceholder = text.replace(/\n/g, ' ').replace(/GHG/g, '@G@H@G@')
// 如果当前批次加上这个文本不超过最大字符限制,则加入当前批次
if (currentBatch.length + textWithPlaceholder.length <= maxLength) {
currentBatch += textWithPlaceholder + '\n';
} else {
// 如果超过最大字符限制,先保存当前批次,再开始新的批次
result.push(currentBatch.trim());
currentBatch = textWithPlaceholder + '\n';
}
});
if (currentBatch.length > 0) {
result.push(currentBatch.trim()); // 最后一批
}
return result;
}
// 翻译完成后恢复换行符
function restoreNewlines(translatedText) {
return translatedText.replace(/ /g, '\n').replace(/@\s*G\s*@\s*H\s*@\s*G\s*@/g, 'GHG');
}
// 主函数:批量翻译文本
function translateBatch(from, to, q, callback) {
var salt = (new Date).getTime();
var str1 = appid + q + salt + key;
var sign = MD5(str1);
$.ajax({
url: 'http://api.fanyi.baidu.com/api/trans/vip/translate',
type: 'get',
dataType: 'jsonp',
data: {
q: q,
appid: appid,
salt: salt,
from: from,
to: to,
sign: sign
},
success: function (data) {
if (data && data.trans_result) {
callback(null, data.trans_result); // 返回翻译结果
} else {
callback('翻译失败', null);
}
},
error: function (error) {
callback('请求失败', null);
}
});
}
// 批量翻译并回填
function translateTextNodes(nodes, from, to, url) {
// 检查缓存
let cachedTranslation = getCachedTranslation(from, to, url);
if (cachedTranslation) {
// 如果缓存存在,直接使用缓存
console.log('使用缓存的翻译');
fillTranslatedTexts(nodes, cachedTranslation);
return;
}
// 如果没有缓存,进行翻译
var texts = nodes.map(node => node.textContent || node.innerText);
var maxBatchLength = 5000; // 百度API每次请求的字符最大长度
var batches = splitTextForBatchTranslation(texts, maxBatchLength);
var allTranslations = [];
var currentBatchIndex = 0;
function processNextBatch() {
if (currentBatchIndex < batches.length) {
var batch = batches[currentBatchIndex];
translateBatch(from, to, batch, function(error, result) {
if (error) {
console.log('错误: ', error);
} else {
allTranslations = allTranslations.concat(result);
currentBatchIndex++;
processNextBatch(); // 继续翻译下一个批次
}
});
} else {
// 所有翻译完成,回填翻译结果并缓存
cacheTranslation(from, to, url, allTranslations); // 缓存翻译结果
fillTranslatedTexts(nodes, allTranslations);
}
}
processNextBatch(); // 开始翻译
}
// 回填翻译结果到原始节点
function fillTranslatedTexts(nodes, translations) {
var textIndex = 0;
nodes.forEach(node => {
if (node.textContent || node.innerText) {
let temp = restoreNewlines(translations[textIndex].dst);
node.textContent = temp; // 将翻译后的文本回填
textIndex++;
}
});
}
// 初始化语言设置
window.onload = function() {
let lang = localStorage.getItem('lang') || 'en';
if (lang === 'zh') {
document.querySelector('e').remove();
let language = document.querySelector('.language')
language.insertAdjacentHTML('afterbegin', "