Auto-translates pages using an iframe overlay and inline Google Translate.
目前為
// ==UserScript==
// @name Google Auto Translate (Multilingual + Inline Translation)
// @namespace https://greasyfork.org/en/users/1030895-universedev
// @author UniverseDev
// @license GPL-3.0-or-later
// @version 1.0
// @description Auto-translates pages using an iframe overlay and inline Google Translate.
// @match *://*/*
// @grant none
// ==/UserScript==
(function () {
"use strict";
const STORAGE_KEY = "userTranslateLang";
const DEFAULT_LANG = "en";
const getUserLanguage = () => localStorage.getItem(STORAGE_KEY) || DEFAULT_LANG;
const setUserLanguage = (lang) => {
localStorage.setItem(STORAGE_KEY, lang);
location.reload();
};
const detectPageLanguage = () =>
document.documentElement.lang || document.querySelector("html")?.getAttribute("lang") || null;
const isAlreadyTranslated = () => {
return document.querySelector("body").classList.contains("translated-ltr") ||
document.querySelector("body").classList.contains("translated-rtl");
};
const createTranslateOverlay = (targetLang) => {
if (document.getElementById("googleTranslateIframe")) return;
const iframe = document.createElement("iframe");
iframe.id = "googleTranslateIframe";
iframe.src = `https://translate.google.com/translate?hl=${targetLang}&sl=auto&tl=${targetLang}&u=${encodeURIComponent(location.href)}`;
Object.assign(iframe.style, {
position: "fixed",
top: 0,
left: 0,
width: "100vw",
height: "100vh",
border: "none",
zIndex: 99999,
backgroundColor: "#fff",
});
document.body.appendChild(iframe);
};
const insertGoogleTranslateWidget = () => {
if (document.getElementById("google_translate_element")) return;
const translateDiv = document.createElement("div");
translateDiv.id = "google_translate_element";
Object.assign(translateDiv.style, {
position: "fixed",
bottom: "10px",
right: "10px",
zIndex: 100000,
});
document.body.appendChild(translateDiv);
const script = document.createElement("script");
script.src = "//translate.google.com/translate_a/element.js?cb=googleTranslateInit";
document.body.appendChild(script);
};
window.googleTranslateInit = () => {
new google.translate.TranslateElement(
{ pageLanguage: "auto", includedLanguages: getUserLanguage(), autoDisplay: false, multilanguagePage: true },
"google_translate_element"
);
};
const autoTranslateIfNeeded = () => {
const targetLang = getUserLanguage();
const pageLang = detectPageLanguage();
if ((!pageLang || pageLang.toLowerCase() !== targetLang.toLowerCase()) && !isAlreadyTranslated()) {
createTranslateOverlay(targetLang);
} else {
insertGoogleTranslateWidget();
}
};
window.addEventListener("load", autoTranslateIfNeeded);
})();