From 50ccde74b1be4332ff11007bcb12988bb2ec5708 Mon Sep 17 00:00:00 2001 From: ekzyis Date: Sat, 24 Dec 2022 23:43:53 +0100 Subject: [PATCH] Add tampermonkey script --- sn_translator/sn-translator.js | 71 ++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 sn_translator/sn-translator.js diff --git a/sn_translator/sn-translator.js b/sn_translator/sn-translator.js new file mode 100644 index 0000000..0ce430c --- /dev/null +++ b/sn_translator/sn-translator.js @@ -0,0 +1,71 @@ +// ==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)); + +(async function () { + await sleep(1000); + 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) => { + const t = await translate(content.innerText, "en", "es").catch( + console.error + ); + if (t) content.innerText = t; + }; + topBar.appendChild(padding); + topBar.appendChild(btn); + } + console.log("Done"); +})();