Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.
- Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
- Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
- Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5.
/* ======================= CommonTranslate.js (versione stabile precedente) ======================= */
console.log("🔄 Caricamento CommonTranslate.js…");
// Evita doppio caricamento
if (window.__CommonTranslateLoaded) {
console.warn("⚠️ CommonTranslate.js è già stato caricato.");
} else {
window.__CommonTranslateLoaded = true;
// Manteniamo la vecchia struttura con pulsante
const DEFAULT_MODEL = (window.openaiModel || "gpt-4o");
const LINGUA_ORIGINE = document.documentElement.lang || "en";
// 🔑 QUI usi ancora la chiave diretta (come avevi prima) → se preferisci il proxy si cambia solo questo pezzo
const API_URL = "https://api.openai.com/v1/chat/completions";
const API_KEY = window.apiKey || "INSERISCI_LA_TUA_API_KEY";
console.log("✅ CommonTranslate.js caricato. Modello:", DEFAULT_MODEL);
function getEditor() {
return document.getElementById("wpTextbox1");
}
function getSelectedTextInfo() {
const area = getEditor();
if (!area) return { text: "", start: 0, end: 0 };
const start = area.selectionStart;
const end = area.selectionEnd;
const text = area.value.slice(start, end);
return { text, start, end };
}
function segmentaTesto(testo, maxChars = 3000) {
const re = new RegExp(`.{1,${maxChars}}(?=\\s|$)`, "gs");
return testo.match(re) || [];
}
async function traduciBlocco(blocco, lingua, model = DEFAULT_MODEL) {
try {
const res = await fetch(API_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${API_KEY}`
},
body: JSON.stringify({
model,
messages: [
{
role: "system",
content:
"You are a professional MediaWiki translator. Translate preserving templates, links, headings, lists and any wiki syntax. Do not add explanations."
},
{
role: "user",
content: `Translate the following text from ${LINGUA_ORIGINE} to ${lingua}:\n\n${blocco}`
}
],
temperature: 0
})
});
const data = await res.json();
if (!res.ok) {
const msg = data?.error?.message || `HTTP ${res.status}`;
throw new Error(msg);
}
return data?.choices?.[0]?.message?.content ?? "[Traduzione vuota]";
} catch (err) {
console.error("❌ Errore traduzione:", err);
return "[Errore Traduzione]";
}
}
async function inviaTraduzione(blocchi, lingua, sostituisciTutto) {
const area = getEditor();
if (!area) {
alert("❌ Campo editor non trovato (wpTextbox1).");
return;
}
let risultato = "";
for (let i = 0; i < blocchi.length; i++) {
console.log(`🚀 Invio blocco ${i + 1}/${blocchi.length}…`);
const tradotto = await traduciBlocco(blocchi[i], lingua);
risultato += tradotto.trim() + "\n\n";
}
risultato = risultato.trim();
if (sostituisciTutto) {
area.value = risultato;
} else {
const { start, end } = getSelectedTextInfo();
const prima = area.value.slice(0, start);
const dopo = area.value.slice(end);
area.value = prima + risultato + dopo;
area.selectionStart = start;
area.selectionEnd = start + risultato.length;
}
area.dispatchEvent(new Event("input", { bubbles: true }));
area.dispatchEvent(new Event("change", { bubbles: true }));
console.log("✅ Traduzione completata.");
}
async function traduciTesto() {
const area = getEditor();
if (!area) {
alert("❌ Editor non trovato.");
return;
}
const { text: selezione } = getSelectedTextInfo();
const conferma = confirm(
"Vuoi tradurre SOLO il testo selezionato?\n\n✅ OK = solo selezione\n❌ Annulla = tutto il testo"
);
if (conferma && !selezione) {
alert("⚠️ Nessuna selezione trovata.");
return;
}
const testo = conferma ? selezione : area.value;
if (!testo.trim()) {
alert("⚠️ Niente da tradurre.");
return;
}
const lingua = prompt("🌍 Scegli lingua di traduzione (es: it, en, fr, es, de):", "it");
if (!lingua) return;
const blocchi = segmentaTesto(testo);
console.log("🧩 Segmenti:", blocchi.length);
await inviaTraduzione(blocchi, lingua, !conferma);
}
// Pulsante sotto editor
function addTranslateButton() {
const area = getEditor();
if (!area) return;
if (document.getElementById("btnCommonTranslate")) return;
const btn = document.createElement("button");
btn.id = "btnCommonTranslate";
btn.className = "mw-ui-button";
btn.textContent = "🧠 Traduci contenuto";
btn.style.margin = "8px 0";
btn.addEventListener("click", traduciTesto);
area.parentNode.insertBefore(btn, area.nextSibling);
}
if (typeof $ !== "undefined") {
$(addTranslateButton);
} else {
document.addEventListener("DOMContentLoaded", addTranslateButton);
}
}