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);
  }
}