add extra buttons to translate with AI on crowdin, support DeepL X and OpenAI
// ==UserScript==
// @name AI Translation on crowdin
// @description add extra buttons to translate with AI on crowdin, support DeepL X and OpenAI
// @namespace https://crowdin.com/
// @version 0.3.2
// @author bowencool
// @license MIT
// @supportURL https://github.com/bowencool/Tampermonkey-Scripts/issues
// @match https://crowdin.com/translate/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=crowdin.com
// @run-at document-end
// @require https://cdn.jsdelivr.net/gh/bowencool/Tampermonkey-Scripts@f59cc91442dd34eb28e0d270486da5c7ac8d2d50/shared/waitForElementToExist.js
// @grant GM_xmlhttpRequest
// ==/UserScript==
async function main() {
const sourceContainer = await waitForElementToExist(
"#source_phrase_container"
);
const button = document.createElement("button");
button.innerText = "DeepL Translate";
button.classList.add("btn");
button.addEventListener("click", () => {
const sourceText = sourceContainer.innerText;
// console.log(sourceText);
if (!sourceText) return;
button.setAttribute("disabled", "true");
const targetContainer = document.querySelector("#translation");
// console.log(targetContainer);
// you need to deploy https://hub.docker.com/r/zu1k/deepl to use this api
fetch("http://deeplx.localhost:8080/translate", {
method: "POST",
body: JSON.stringify({
text: sourceText,
source_lang: "auto",
target_lang: "ZH",
}),
})
.then((res) => res.json())
.then((res) => {
//console.log(res)
targetContainer.value = res.data;
targetContainer.dispatchEvent(new Event("input", { bubbles: true }));
button.removeAttribute("disabled");
});
});
const button2 = document.createElement("button");
button2.innerText = "OpenAI Translate";
button2.classList.add("btn");
button2.style.marginLeft = "10px";
button2.addEventListener("click", () => {
const sourceText = sourceContainer?.innerText;
// console.log(sourceText);
if (!sourceText) return;
button2.setAttribute("disabled", "true");
const targetContainer = document.querySelector("#translation");
// you need to login https://key-rental.bowen.cool/login to use this api
fetch("https://key-rental-api.bowen.cool/openai/v1/chat/completions", {
method: "POST",
mode: "cors",
credentials: "include",
body: JSON.stringify({
model: "gpt-3.5-turbo",
messages: [
{ role: "user", content: "Translate to Chinese:\n" + sourceText },
],
}),
})
.then((res) => res.json())
.then((res) => {
//console.log(res)
const text = res.choices[0].message.content;
targetContainer.value = text;
targetContainer.dispatchEvent(new Event("input", { bubbles: true }));
button2.removeAttribute("disabled");
});
});
sourceContainer.before(button);
sourceContainer.before(button2);
console.log("inserted");
}
main();