sn-translator/sn_translator/sn-translator.js

76 lines
2.3 KiB
JavaScript
Raw Normal View History

2022-12-24 22:43:53 +00:00
// ==UserScript==
// @name SN translator
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Translate posts on SN
// @author You
// @match https://stacker.news/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @grant GM_xmlhttpRequest
// ==/UserScript==
const headers = {
origin: "https://libretranslate.com",
accept: "*/*",
"accept-language": "de-DE,de;q=0.9,ru-DE;q=0.8,ru;q=0.7,en-US;q=0.6,en;q=0.5",
"sec-ch-ua":
'"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Linux"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
};
function translate(text, source, target) {
const formData = new FormData();
formData.append("q", text);
formData.append("source", source);
formData.append("target", target);
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "POST",
url: "https://libretranslate.com/translate",
data: formData,
headers,
synchronous: true,
onload: function (res) {
const body = JSON.parse(res.responseText);
if (res.status !== 200) return reject(body);
return resolve(body.translatedText);
},
});
});
}
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
2022-12-25 01:35:05 +00:00
function addButtons() {
2022-12-24 22:43:53 +00:00
console.log("sn-translator: Adding button to every comment ...");
const commentSection = document.querySelector(".item_comments__cN57K");
const comments = commentSection.querySelectorAll(".comment_comment__5uvl3");
const commentNodes = commentSection.querySelectorAll(".comment_text__nHI0E");
for (const comment of comments) {
const topBar = comment.querySelector(".item_other__qNlji");
const content = comment.querySelector(".comment_text__nHI0E");
const padding = document.createElement("span");
padding.innerText = " ";
const btn = document.createElement("button");
btn.innerText = "Translate";
btn.onclick = async (e) => {
2022-12-25 01:32:49 +00:00
const t = await translate(content.innerText, "auto", "en").catch(
2022-12-24 22:43:53 +00:00
console.error
);
if (t) content.innerText = t;
};
topBar.appendChild(padding);
topBar.appendChild(btn);
}
console.log("Done");
2022-12-25 01:35:05 +00:00
}
(async function () {
await sleep(1000);
addButtons();
2022-12-24 22:43:53 +00:00
})();