66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { ContentScriptMessenger } from "./gtranslate_commands";
|
|
|
|
(async () => {
|
|
if (window.location.host != "translate.google.com" || window.hasRun) return;
|
|
window.hasRun = true;
|
|
|
|
const conn = new ContentScriptMessenger();
|
|
|
|
const src = <HTMLTextAreaElement>document.querySelector("textarea#source");
|
|
const result = <HTMLDivElement>(
|
|
document.querySelector("div.results-container")
|
|
);
|
|
|
|
const [srcLang, dstLang] = Array.from(
|
|
document.querySelectorAll(".jfk-button-checked")
|
|
).map((d) => ({
|
|
code: d.getAttribute("value")!,
|
|
name: d.textContent!,
|
|
}));
|
|
|
|
const isTranslating = () => result.classList.contains("translating");
|
|
|
|
const observer = new MutationObserver((mutations) => {
|
|
const wasTranslating = mutations.some((m) =>
|
|
m.oldValue!.split(" ").some((c) => c == "translating")
|
|
);
|
|
if (wasTranslating && !isTranslating()) {
|
|
sendTranslation();
|
|
}
|
|
});
|
|
observer.observe(result, {
|
|
attributes: true,
|
|
attributeOldValue: true,
|
|
attributeFilter: ["class"],
|
|
});
|
|
|
|
const sendTranslation = () => {
|
|
conn.runCommand("translationFinished", {
|
|
src: src.value,
|
|
result: result.innerText.trim(),
|
|
languages: {
|
|
srcLang: srcLang,
|
|
dstLang: dstLang,
|
|
},
|
|
});
|
|
};
|
|
|
|
conn.addMessageListener("translate", (toTranslate) => {
|
|
if (src.value == toTranslate && !isTranslating()) sendTranslation();
|
|
else src.value = toTranslate;
|
|
});
|
|
|
|
const getLanguages = () => {
|
|
const langs = document.querySelectorAll(
|
|
"div.language_list_section:nth-child(3) > .language_list_item_wrapper"
|
|
);
|
|
return Array.from(langs).map((l) => {
|
|
const code = l.classList[1].split("-").pop();
|
|
const name = l.querySelector(".language_list_item_language_name")!
|
|
.textContent;
|
|
return { code: code!, name: name! };
|
|
});
|
|
};
|
|
conn.runCommand("languageList", getLanguages());
|
|
})();
|