js谷歌批量翻译接口代码分享
我的站长站
2023-04-16
共人阅读
该 JavaScript 代码调用谷歌翻译公开接口,实现文本批量翻译,支持多段内容统一请求、中英文互译及多语种切换,内置请求封装、参数拼接、异常捕获。可用于网页内批量文案转换、前端翻译工具、内容批量处理等场景,基于原生fetch发起网络请求,无需额外依赖。仅作技术学习使用,注意接口调用频率,避免高频请求被限制。
async function translation(array) {
var splicing = []
if (!(array instanceof Array)) {
array = [array]
}
for (let i = 0; i < array.length; i++) {
splicing.push(
{
"originalText": array[i],
"translatedText": null,
"detectedLanguage": null,
"status": "translating",
"waitTranlate": {}
}
)
}
return await makeRequest("auto", "zh-CN", splicing)//无并发限制接口
async function makeRequest(sourceLanguage, targetLanguage, requests) {
return await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open(
"POST",
"https://translate.googleapis.com/translate_a/t?anno=3&client=te&v=1.0&format=html" + GetExtraParameters(sourceLanguage, targetLanguage, requests)
);
xhr.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);
xhr.responseType = "json";
xhr.onload = (event) => {
resolve(xhr.response);
};
xhr.onerror = xhr.onabort = xhr.ontimeout = (event) => { console.error(event); reject(); };
xhr.send(getRequestBody(sourceLanguage, targetLanguage, requests));
});
function getRequestBody(sourceLanguage, targetLanguage, requests) {
return requests
.map((info) => `&q=${encodeURIComponent(info.originalText)}`)
.join("");
}
function GetExtraParameters(sourceLanguage, targetLanguage, requests) {
return `&sl=${sourceLanguage}&tl=${targetLanguage}&tk=${calcHash(requests.map((info) => info.originalText).join(""))}`
function calcHash(query) {
const windowTkk = "448487.932609646";
const tkkSplited = windowTkk.split(".");
const tkkIndex = Number(tkkSplited[0]) || 0;
const tkkKey = Number(tkkSplited[1]) || 0;
const bytesArray = transformQuery(query);
let encondingRound = tkkIndex;
for (const item of bytesArray) {
encondingRound += item;
encondingRound = shiftLeftOrRightThenSumOrXor(
encondingRound,
"+-a^+6"
);
}
encondingRound = shiftLeftOrRightThenSumOrXor(
encondingRound,
"+-3^+b+-f"
);
encondingRound ^= tkkKey;
if (encondingRound <= 0) {
encondingRound = (encondingRound & 2147483647) + 2147483648;
}
const normalizedResult = encondingRound % 1000000;
return normalizedResult.toString() + "." + (normalizedResult ^ tkkIndex);
function transformQuery(query) {
/** @type {Array<number>} */
const bytesArray = [];
let idx = 0;
for (let i = 0; i < query.length; i++) {
let charCode = query.charCodeAt(i);
if (128 > charCode) {
bytesArray[idx++] = charCode;
} else {
if (2048 > charCode) {
bytesArray[idx++] = (charCode >> 6) | 192;
} else {
if (
55296 == (charCode & 64512) &&
i + 1 < query.length &&
56320 == (query.charCodeAt(i + 1) & 64512)
) {
charCode =
65536 +
((charCode & 1023) << 10) +
(query.charCodeAt(++i) & 1023);
bytesArray[idx++] = (charCode >> 18) | 240;
bytesArray[idx++] = ((charCode >> 12) & 63) | 128;
} else {
bytesArray[idx++] = (charCode >> 12) | 224;
}
bytesArray[idx++] = ((charCode >> 6) & 63) | 128;
}
bytesArray[idx++] = (charCode & 63) | 128;
}
}
return bytesArray;
}
function shiftLeftOrRightThenSumOrXor(num, optString) {
for (let i = 0; i < optString.length - 2; i += 3) {
/** @type {string|number} */
let acc = optString.charAt(i + 2);
if ("a" <= acc) {
acc = acc.charCodeAt(0) - 87;
} else {
acc = Number(acc);
}
if (optString.charAt(i + 1) == "+") {
acc = num >>> acc;
} else {
acc = num << acc;
}
if (optString.charAt(i) == "+") {
num += acc & 4294967295;
} else {
num ^= acc;
}
}
return num;
}
}
}
}
}
console.log(await translation(['hi', 'omg', 'yes']));相关专题
- DeeplxFile文档文件翻译软件 [2024-09-03]
- 谷歌翻译接口划词翻译油猴脚本 [2023-12-28]
- 分享一个免费的谷歌翻译API接口,自动识别中英互翻 [2023-12-03]
- 团子翻译器4.5.8,支持图片/字幕OCR和翻译 [2023-10-19]
- 麻瓜汉化小助手1.3,OCR识别翻译工具 [2023-10-08]

