Vai al contenuto
Parliamo del tuo progetto
tW Translate Plus

tW Translate Plus

CHF 199

Traduzioni multilingua leggere con motore a scelta per sito (gpt-oss-20b, OpenAI o Google Cloud Translation v3, ciascun sito con la propria chiave): un solo oggetto WordPress, URL con prefisso lingua, glossario per sito e override manuali.

COD: tw-translate-plus Categoria:

Descrizione

tW Translate Plus rende multilingua un sito WordPress senza duplicare nulla: una sola pagina, un solo prodotto, un solo ordine. Il plugin conserva per ogni testo l'originale, la traduzione automatica e l'eventuale correzione manuale, e serve ogni lingua al suo indirizzo (/en/, /de/…), indicizzabile da Google.

Cosa traduce

  • Contenuti: titoli, testi, estratti, menu, categorie, descrizioni SEO, prodotti WooCommerce.
  • Tutto quello che il tema stampa: etichette dei template, sezioni dei page builder, testi dei plugin, attributi alt, title, segnaposto dei campi.
  • Testi passati al JavaScript (novità 1.20): configuratori, moduli e componenti che ricevono i loro testi con wp_localize_script vengono tradotti senza toccare id, indirizzi e dati tecnici.

Copertura reale, non solo una percentuale

La barra delle lingue conta i testi che il plugin conosce. Il controllo Copertura reale delle pagine (scheda Stato) apre ogni pagina nella lingua principale e in ogni lingua attiva, lascia lavorare gli script e confronta ciò che il visitatore legge davvero. I testi rimasti in lingua originale vengono elencati pagina per pagina; marchi e nomi propri si segnano con un clic come «uguali in tutte le lingue».

Motore a scelta, costi sotto controllo

  • Google Cloud Translation v3 oppure OpenAI, con la chiave del sito: ogni cliente paga solo le proprie traduzioni.
  • Limite giornaliero di caratteri, coda in background, nessuna chiamata al motore durante le visite.
  • Memoria di traduzione: un testo identico tradotto una volta non si paga di nuovo.
  • Glossario per sito: marchi da non tradurre e terminologia sempre coerente.

Pensato per chi gestisce il sito

  • Correzioni manuali dalla scheda Traduzioni: restano anche quando il motore ritraduce.
  • Lingue attivabili in anteprima prima di pubblicarle nel selettore, nell'hreflang e nella sitemap.
  • SEO multilingua completa: hreflang reciproci, x-default, og:locale, sitemap per lingua, indirizzi tradotti.
  • Compatibile con LiteSpeed Cache, WooCommerce, Elementor, multisite; migrazione guidata da WPML.

Versioni

Changelog

Licenza perpetua: si paga una volta sola, nessun canone annuale.

  • WordPress 6.2 o successivo
  • PHP 7.4 o successivo
  1. 1.20.3Ultima versione
    • Novità · slovacco, import WPML corretto per termini, slug non latini e redirect, v1.20.3
    • Correzione · WPML import strings step crashed on undefined $copies, v1.20.2
    • Correzione · coverage check button; rich update details v1.20.1
    • Novità · translate script data and check real page coverage v1.20.0
    • Correzione · do not requeue rendered translations; hide WPML tab after migration v1.19.5
    • Correzione · short description whitespace, WPML variation descriptions v1.19.4
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
  2. 1.20.2
    • Correzione · WPML import strings step crashed on undefined $copies, v1.20.2
    • Correzione · coverage check button; rich update details v1.20.1
    • Novità · translate script data and check real page coverage v1.20.0
    • Correzione · do not requeue rendered translations; hide WPML tab after migration v1.19.5
    • Correzione · short description whitespace, WPML variation descriptions v1.19.4
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
  3. 1.20.1
    • Correzione · coverage check button; rich update details v1.20.1
    • Novità · translate script data and check real page coverage v1.20.0
    • Correzione · do not requeue rendered translations; hide WPML tab after migration v1.19.5
    • Correzione · short description whitespace, WPML variation descriptions v1.19.4
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
  4. 1.20.0
    • Novità · translate script data and check real page coverage v1.20.0
    • Correzione · do not requeue rendered translations; hide WPML tab after migration v1.19.5
    • Correzione · short description whitespace, WPML variation descriptions v1.19.4
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
  5. 1.19.5
    • Correzione · do not requeue rendered translations; hide WPML tab after migration v1.19.5
    • Correzione · short description whitespace, WPML variation descriptions v1.19.4
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
  6. 1.19.3
    • Correzione · never redirect LiteSpeed ESI sub-requests v1.19.3
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
  7. 1.19.2
    • Novità · WPML import of visible custom field values v1.19.2
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
  8. 1.19.1
    • Correzione · detect JetEngine lazy listing requests v1.19.1
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
  9. 1.19.0
    • Novità · translate HTML fragments in front-end AJAX responses (JetEngine, Woo) v1.19.0
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
  10. 1.18.3
    • Correzione · original slug for trashed WPML copies v1.18.3
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
  11. 1.18.2
    • Correzione · never queue search/feed/404 page texts v1.18.2
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
  12. 1.18.1
    • Correzione · entity-insensitive page text lookup v1.18.1
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
    • Correzione · progress bar shows only the share of translated texts v1.12.1
  13. 1.18.0
    • Novità · translate WooCommerce fee names; texturized page texts in WPML import; --include-trashed v1.18.0
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
    • Correzione · progress bar shows only the share of translated texts v1.12.1
    • Novità · editor translation box + Traduci adesso, hard run deadline v1.12.0
  14. 1.17.3
    • Novità · switcher labels attribute v1.17.3
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
    • Correzione · progress bar shows only the share of translated texts v1.12.1
    • Novità · editor translation box + Traduci adesso, hard run deadline v1.12.0
    • Novità · translation memory, self-healing errors, simpler API page v1.11.0
  15. 1.17.2
    • Correzione · texturized lookup also for single_post_title v1.17.2
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
    • Correzione · progress bar shows only the share of translated texts v1.12.1
    • Novità · editor translation box + Traduci adesso, hard run deadline v1.12.0
    • Novità · translation memory, self-healing errors, simpler API page v1.11.0
    • Novità · self-driven background worker, gpt-oss-20b default engine v1.10.0
  16. 1.17.1
    • Correzione · WPML import uses whole texts, texturized titles, clean queue; names switcher + order v1.17.1
    • Novità · WPML importer, translated URLs + 301, Elementor links, AJAX language v1.17.0
    • Correzione · admin hint when no language is published, no page cache while translations are pending v1.16.3
    • Correzione · translate product titles, protect site name, normalized echo repair, worker liveness v1.16.2
    • Correzione · worker restart on stale hint, accept confirmed-unchanged texts, session page fetch, rounded switcher styles v1.16.1
    • Novità · page-level HTML translation of everything visible, per-variant switcher previews v1.16.0
    • Novità · [tw_language_switcher] shortcode with bundled SVG flags v1.15.0
    • Correzione · reject echoed translations, gpt-oss-120b, security/SEO/perf review fixes v1.14.0
    • Prestazioni · parallel engine requests, fastest OpenRouter provider v1.13.0
    • Correzione · browser autofill no longer overwrites API keys v1.12.2
    • Correzione · progress bar shows only the share of translated texts v1.12.1
    • Novità · editor translation box + Traduci adesso, hard run deadline v1.12.0
    • Novità · translation memory, self-healing errors, simpler API page v1.11.0
    • Novità · self-driven background worker, gpt-oss-20b default engine v1.10.0
    • Novità · automatic indexing, 45s queue runs, OpenAI-compatible engine v1.9.1
  17. 1.17.0
    • feat(migrazione): import da WPML (scheda «Migrazione WPML» e wp twtr wpml-import): contenuti, prodotti e varianti, modelli Elementor, voci di menu, categorie e attributi, media, stringhe; nessuna traduzione rifatta dal motore (origin=wpml, bloccate). Resoconto con le note da controllare, import ripetibile e annullabile.
    • feat(url): indirizzi tradotti per lingua (Twtr_Slugs, mappa per segmento: pagine anche annidate, prodotti, base prodotto, categorie) senza rewrite rule; 301 dallo slug originale a quello tradotto; redirect 301 per vecchi indirizzi senza pagina (solo su 404).
    • feat(elementor): i link interni delle pagine (Elementor, editor) puntano alla lingua corrente (selettori lingua esclusi); il contenuto grezzo delle pagine costruite con Elementor non viene più messo in coda (lo traduce il livello pagina: niente costi inutili).
    • feat(ajax): le richieste AJAX (moduli, carrello, risposte di plugin) partite da una pagina tradotta usano la lingua di quella pagina (Referer dello stesso sito).
    • feat(wpml): finché WPML è attivo tW Translate resta in attesa sul sito pubblico (avviso in admin con il link alla migrazione).
  18. 1.16.3
    • ux(selettore): con meno di due lingue pubblicate lo shortcode mostra agli amministratori un avviso («nessuna lingua pubblicata: spunta Pubblicata in tW Translate → Lingue») invece di sparire senza spiegazione; i visitatori continuano a non vedere nulla.
    • perf(pagina): una pagina tradotta con testi appena scoperti (ancora in traduzione) non viene messa nella cache di LiteSpeed, così i visitatori successivi ricevono i testi tradotti appena pronti invece della versione parzialmente italiana fino al prossimo svuotamento della cache.
  19. 1.16.2
    • fix(qualità): i titoli dei prodotti restavano in italiano: le istruzioni al modello dicevano di non tradurre «nomi di prodotto», e gpt-oss lasciava così «Caviale di lenticchie all'aglio nero bio 90g». Ora le istruzioni chiedono di tradurre titoli e nomi fatti di parole comuni (lasciando solo i marchi), ricordano che ogni testo è mostrato ai visitatori della versione in quella lingua, e proteggono il nome del sito (get_bloginfo('name')), che altrimenti diventava «Oase der Gewürze». Verificato su oasidellespezie.ch con gpt-oss-120b: titolo, «Collezione Oasi», «Vedi tutta la selezione», «Disponibile in laboratorio», «Imposta quantità e aggiungi al carrello» tradotti in tedesco e francese; «Choco Duo», «Box "Black Diamond" | Oasi delle Spezie» e l'indirizzo invariati.
    • fix(qualità): all'aggiornamento (DB version 5) tornano in coda anche le traduzioni rimaste in italiano che differiscono dall'originale solo per entità o tipografia (all’aglio / all’aglio), che il controllo precedente non riconosceva; stesso confronto normalizzato nel controllo dei testi restituiti invariati.
    • fix(worker): dopo la fine di un ciclo il lavoratore risultava «attivo» per 3 minuti, così i testi appena scoperti (es. i 410 testi del tema trovati aprendo una pagina) aspettavano. Ora c'è un indicatore esplicito di ciclo in corso: il nuovo lavoro lo avvia subito.
  20. 1.16.1
    • fix(coda): dopo l'aggiornamento il lavoratore restava fermo con testi in coda: le righe rimesse in coda dalla migrazione non lo avvisavano e lui si fidava di un contatore a zero. Ora, se il contatore dice zero, controlla davvero la coda (una query indicizzata, al massimo una volta al minuto) e riparte da solo.
    • fix(qualità): nomi, indirizzi e marchi che restano giustamente uguali («Choco Duo», «Alla Monda 12, 6515 Gudo») venivano segnati come errore «restituito senza tradurlo». Ora un testo tornato invariato in un gruppo viene richiesto di nuovo da solo (in parallelo se sono più d'uno): se il modello lo conferma invariato è accettato. All'aggiornamento gli errori di questo tipo tornano in coda.
    • fix(editor): «Traduci adesso» apre le pagine tradotte con la sessione dell'utente, così funziona anche con il negozio in modalità «presto disponibile» o in manutenzione, dove un visitatore anonimo vede solo la pagina di attesa.
    • perf(pagina): la traduzione della pagina finita si salta per pagine oltre 4 MB o con il processo PHP vicino al limite di memoria (la pagina esce non tradotta invece di un errore critico).
    • ux(selettore): anteprime dello shortcode fedeli (lo stile non veniva caricato nell'admin) e nuovo stile: bandierine con angoli arrotondati e ombra leggera, lingua attuale con anello, sigle a pillola, menu a tendina a scheda; eredita colori e font del tema.
  21. 1.16.0
    • feat(pagina): traduzione della pagina finita, come un traduttore del browser (class-twtr-html.php). Nelle lingue aggiuntive l'HTML generato viene letto per intero e ogni testo visibile viene tradotto, insieme a <title>, meta description/Open Graph, alt, title, placeholder, aria-label e testi dei pulsanti: anche quello che il tema o il page builder stampa da sé e che nessun filtro di WordPress vede (sezioni costruite leggendo il contenuto, etichette nei template, widget Elementor, markup di altri plugin). Su oasidellespezie.ch erano rimasti in italiano «Caratteristiche & Proprietà», «Note del Maestro Speziere» e i valori delle schede prodotto. I testi nuovi vanno in coda una volta sola per lingua (contesto html, condiviso da tutte le pagine: un'etichetta ripetuta su 900 prodotti è una riga sola) e si riusano le traduzioni già fatte in qualsiasi contesto. Esclusi script, style, code, pre, textarea, svg, la barra di amministrazione, class="notranslate", translate="no", testi senza lettere, URL ed e-mail e le traduzioni già prodotte dai filtri. Una sola query indicizzata per pagina generata; LiteSpeed mette in cache il risultato. Disattivabile con il filtro twtr_translate_html.
    • feat(editor): «Traduci adesso» apre una volta le pagine tradotte del contenuto (aggirando la cache), così traduce subito anche i testi del tema di quella pagina, e il riquadro «Traduzioni» li conta.
    • ux(lingue): anteprima di ogni variante dello shortcode accanto al codice da copiare.
  22. 1.15.0
    • feat(selettore): shortcode [tw_language_switcher] per mettere le bandierine su qualsiasi tema o page builder (Elementor: widget «Shortcode», anche nell'header di Elementor Pro; Gutenberg: blocco «Shortcode»), e funzione PHP twtr_language_switcher(). Varianti: style="flags" (predefinito), flags-names, names, codes, dropdown (menu a tendina senza JavaScript); current="hide"; size="24"; flags="en:us" per cambiare la bandiera di una lingua; class="...". Ogni link porta alla stessa pagina nell'altra lingua, con hreflang, lang e aria-current. Mostra solo le lingue pubblicate e nulla se ce n'è una sola.
    • feat(bandiere): 24 bandiere SVG incluse nel plugin (assets/flags/, anche USA e Svizzera), mostrate come immagini: uguali su ogni sistema (le emoji delle bandiere su Windows non esistono e diventano «DE», «FR») e senza conflitti con il CSS del tema. Filtro twtr_flag_code per cambiare una bandiera su tutto il sito.
    • feat(admin): nel tab Lingue il riquadro «Bandierine sul sito» con anteprima, gli shortcode pronti e il pulsante «Copia», e le opzioni per sviluppatori.
  23. 1.14.0
    • fix(qualità): testi restituiti non tradotti. gpt-oss-20b restituiva a volte la frase italiana invariata, che veniva salvata come «tradotta» (su oasidellespezie.ch ~7% dei testi gpt-oss: titolo e scheda prodotto in italiano sotto /de/). Ora ogni frase di 4+ parole tornata identica viene richiesta di nuovo da sola e, se resta uguale, conta come errore (riprovato in automatico), mai come traduzione; la memoria non copia più questi casi; all'aggiornamento (DB version 4) le righe già colpite di tutti i siti tornano in coda.
    • feat(motore): modello predefinito gpt-oss-120b (misurato: traduzione corretta in ~1 s, contro errori come «aglio nero» → «noci nere» del 20b; ~4× il costo, sempre frazioni di centesimo per prodotto). I siti rimasti sul vecchio predefinito passano da soli al 120b; un modello scelto a mano non viene toccato.
    • fix(worker): la catena in background si fermava dopo ogni ciclo: il loopback con timeout di 10 ms (come spawn_cron) spesso non partiva nemmeno su HTTPS. Ora 1 s, con la pagina già staccata dal visitatore. Al massimo 3 siti della rete traducono insieme (twtr_worker_max_sites), per non togliere processi PHP ai visitatori.
    • security: le impostazioni del motore (chiave, indirizzo del servizio, modello, limiti) le cambia solo un amministratore del sito; editor e shop manager vedono la pagina in sola lettura. Prima un editor poteva puntare l'indirizzo su un proprio server e ricevere la chiave e tutti i testi. Cambiando servizio la chiave salvata viene cancellata. L'output dei motori viene filtrato prima di salvarlo (wp_kses con i soli tag del testo originale: niente <script>/onerror iniettati). Niente redirect nelle richieste ai motori (SSRF), token_uri Google accettato solo se è quello di Google, finestra della firma del lavoratore 120 s, pacchetti lingua scaricati solo da chi può installarli, la capability non viene più riassegnata a ogni richiesta (un amministratore può toglierla).
    • fix(seo): link mailto:, tel:, #ancora e relativi non vengono più trasformati in URL rotti nelle pagine tradotte; gli URL di altri siti della rete non ricevono più il prefisso lingua; hreflang con codici di sola lingua (de, fr, it, filtro twtr_hreflang_code) invece di de-DE; quando una traduzione è pronta vengono svuotate dalla cache tutte le lingue della pagina, così anche le altre lingue aggiornano l'hreflang.
    • perf: lo svuotamento completo della cache LiteSpeed per i testi del tema avviene al massimo ogni 10 minuti (prima a ogni ciclo, cioè ogni minuto, anche per l'italiano); scritture della coda in un'unica transazione per blocco e svuotamenti per contesto invece che per riga; memoria con un solo gemello per testo; indice claim; impostazioni del sito memorizzate per sito anche dentro switch_to_blog().
  24. 1.13.0
    • perf(coda): richieste in parallelo. Con i modelli linguistici la coda manda fino a 6 blocchi alla volta (Twtr_Openai::translate_many(), curl multi via WpOrgRequests, filtro twtr_concurrency) e prende 150 testi per giro; i blocchi che falliscono in parallelo per un intoppo (risposta non allineata, rete, 400, 429, 5xx) vengono ripresi da soli uno per uno, chiave/credito/modello sbagliati no. Testato con un server finto: ordine dei testi sempre corretto, nessun testo rimasto bloccato.
    • perf(gpt-oss): su OpenRouter le richieste chiedono il fornitore più veloce (provider.sort = throughput, filtro twtr_openrouter_provider): misurato su oasidellespezie.ch, 4.000 caratteri in 2,2 s costanti (Groq) invece di 3–12 s a seconda del fornitore capitato. Insieme al parallelo, un sito come oasidellespezie.ch si traduce in minuti invece che in giorni; «Traduci adesso» traduce tutte le lingue di un prodotto in una sola andata e ritorno.
    • fix(scoperta): un testo già tradotto riusato dal tema in un altro punto (es. la descrizione SEO costruita dal riassunto tradotto) non viene più messo in coda come se fosse un originale italiano.
    • docs: per un server proprio (Ollama, vLLM) WordPress ammette solo le porte 80, 443 e 8080 (filtri http_allowed_safe_ports e http_request_host_is_external per altre).
  25. 1.12.2
    • fix(api): salvando la pagina «API traduzione» il browser poteva compilare il campo chiave (vuoto) con una password memorizzata, che veniva salvata al posto della chiave: su oasidellespezie.ch la chiave OpenRouter è stata sostituita da una password di 10 caratteri («Missing Authentication header»). Ora i campi chiave dicono ai gestori di password di non compilarli (autocomplete="new-password", attributi per LastPass, 1Password, Bitwarden) e il plugin accetta solo valori con la forma di una chiave vera (OpenRouter sk-or-…, OpenAI sk-…, altri servizi almeno 20 caratteri senza spazi): altrimenti la chiave salvata resta quella di prima e un avviso spiega perché.
  26. 1.12.1
    • ux(lingue): la barra di avanzamento mostra solo la percentuale dei testi tradotti (es. 1.343 su 11.761 → 11%), non più il minimo fra testi e pagine complete, che restava all'1–2% finché quasi ogni pagina non era finita. 100% solo quando nulla è in attesa o in errore. Tolte anche due query pesanti per lingua dal tab Lingue.
  27. 1.12.0
    • feat(editor): riquadro «Traduzioni» nell'editor di prodotti, pagine, articoli e di ogni tipo di contenuto pubblico: stato per lingua (pallino verde «Tradotto», giallo «In traduzione: X di Y testi pronti», rosso con il numero di errori, grigio «Non ancora in coda»), link «Vedi» alla pagina tradotta, link per correggere a mano e pulsante «Traduci adesso», che rilegge il contenuto salvato, rimette in coda i suoi errori e traduce subito i suoi testi (memoria, poi motore) davanti a tutto il resto, entro 40 secondi; quel che resta si completa in background. Negli elenchi una colonna «Traduzioni» con un pallino per lingua, letta con una sola query per pagina.
    • fix(worker): i cicli in background venivano chiusi da LiteSpeed dopo ~120 s («request already in process for 121 seconds, fail with 503»): il budget di 45 s era controllato solo fra un blocco e l'altro, e una richiesta a gpt-oss con il ragionamento predefinito superava i 110 s. Ora ogni ciclo ha una scadenza rigida: nessuna richiesta parte con meno di 12 s, il timeout di ogni chiamata è ridotto al tempo rimasto, i testi non lavorati tornano subito in coda (non dopo 10 minuti) e non vengono contati come errori.
    • perf(gpt-oss): ragionamento «basso» per gpt-oss su OpenRouter (reasoning.effort) e Groq (reasoning_effort): misurato su oasidellespezie.ch, 40 testi in 8,5 s per ~0,00008 $ invece di oltre 110 s; blocchi da 3000 caratteri per i modelli aperti.
  28. 1.11.0
    • feat(memoria): memoria di traduzione. Prima di chiamare il motore, la coda riempie i testi in attesa (o in errore) che hanno un gemello identico già tradotto sullo stesso sito e nella stessa lingua (Twtr_Storage::fill_from_memory(), indice memory_lookup, DB version 3): gratis, senza motore e senza consumare il limite giornaliero. Copia solo traduzioni automatiche pronte, mai gli override manuali né testi di altri siti; i testi rimessi in coda da un cambio di glossario non sono «pronti», quindi una copia rispetta sempre il glossario attuale. Dentro ogni blocco i testi identici vengono inviati una volta sola. Il tab Stato mostra testi riusati e caratteri risparmiati. Su oasidellespezie.ch circa 19.900 testi in coda erano solo ~5.300 testi diversi.
    • feat(errori): gli errori non restano più fermi: quando salvi o provi con successo la configurazione del motore tornano subito in coda, e il lavoratore li riprova da solo una volta al giorno (credito ricaricato, servizio tornato su). Nessun pulsante da premere.
    • ux(API traduzione): pagina semplificata: riquadro in alto verde/rosso «Funziona / Non funziona» con il motivo in parole semplici; per gpt-oss solo la chiave OpenRouter con i 3 passi per ottenerla; indirizzo e modello in «Impostazioni avanzate», come il limite di spesa; il pulsante «Salva e prova» salva e traduce subito una parola di prova. Lo stato si aggiorna anche da solo a ogni ciclo della coda.
    • fix(gpt-oss): messaggi d'errore del motore compatibile che nominano il servizio usato invece di «OpenAI»; riconosciute le chiavi di gestione OpenRouter (non possono tradurre: «User not found») con l'indicazione di creare una chiave API normale; credito esaurito (402), modello inesistente e limiti spiegati.
  29. 1.10.0
    • feat(worker): traduzione in background autosufficiente, senza configurare nulla sul server. Nuovo class-twtr-worker.php: il plugin avvia da solo il proprio lavoratore con una richiesta loopback non bloccante al proprio admin-ajax.php (come spawn_cron() del core), firmata HMAC con un segreto per sito; ogni ciclo lavora fino a 45 s (indicizzazione, poi coda) e, se resta lavoro, lancia da sé il ciclo successivo, quindi non servono visite. Un controllo a fine richiesta (al massimo una volta al minuto, nessuna query in più: stato in un'opzione autoload) riavvia una catena interrotta. Se il server blocca il loopback, la coda avanza dopo aver già inviato la pagina al visitatore (fastcgi_finish_request / litespeed_finish_request) e il tab Stato lo segnala. Pausa automatica fino a mezzanotte UTC al limite giornaliero e di 10 minuti se il motore va in errore; nuovi testi in coda la annullano. Un solo lavoratore per sito (lock). WP-Cron resta registrato e passa dallo stesso lock: dove funziona, aiuta. Prima, in un multisite con DISABLE_WP_CRON e cron di sistema solo sul sito principale (come su ticinoweb01), i sottositi traducevano solo per caso.
    • feat(motore): gpt-oss-20b è il motore predefinito per i siti non ancora configurati: motore «gpt-oss-20b e altri modelli aperti», precompilato con OpenRouter (https://openrouter.ai/api/v1, openai/gpt-oss-20b); basta incollare la chiave OpenRouter. I siti già configurati mantengono il proprio motore. Per i servizi pubblici (OpenRouter, Groq, Together…) la chiave è obbligatoria, così un sito senza chiave non tenta richieste destinate a fallire.
  30. 1.9.1
    • feat(indicizzazione): automatica. Il sito intero viene riletto in background (cron twtr_index_site, 30 s per passaggio, riprende da dove era rimasto) quando non è mai stato indicizzato, quando si attiva una lingua nuova e poi ogni 7 giorni (controllo giornaliero twtr_daily_maintenance), così entrano in coda anche i contenuti pubblicati prima dell'attivazione, importati o modificati senza passare da save_post. Durante questi passaggi la cache LiteSpeed viene svuotata solo per i contenuti che hanno davvero testi nuovi. Il pulsante «Indicizza tutto il sito» resta per chi vuole rileggere tutto subito; il tab Stato mostra avanzamento e data dell'ultima lettura completa.
    • perf(coda): ogni esecuzione del cron lavora fino a 45 secondi (Twtr_Queue::process_for()) invece di un solo blocco da 25 testi, e si ferma prima se un blocco non avanza (limite giornaliero, errore del motore, coda vuota). Su oasidellespezie.ch la coda traduceva 25–100 testi l'ora.
    • feat(motore): nuovo motore Compatibile OpenAI per modelli aperti come gpt-oss o altri, tramite qualunque servizio con la stessa API (OpenRouter, Groq, Together, Ollama, vLLM): indirizzo API, chiave (facoltativa) e nome del modello per sito. Stesso client, glossario nel prompt e blocchi ridotti di OpenAI; se il server non supporta il formato JSON la richiesta viene ripetuta senza, e il JSON viene estratto anche se il modello lo racchiude in testo. Le richieste usano wp_safe_remote_request (niente indirizzi interni, salvo filtro http_request_host_is_external).
    • feat(update): icona del plugin (assets/icon.svg + PNG 128/256, colori ticinoWEB) mostrata in Bacheca → Aggiornamenti al posto della spina grigia. Il loader tw-release-updater.php passa a 1.1.0 e legge le icone dalla cartella assets/ di qualunque plugin gestito; il mu-plugin si aggiorna da solo. L'icona compare dagli aggiornamenti successivi a questa versione, perché è il codice già installato a comunicarla a WordPress.
  31. 1.9.0
    • fix(glossario): il glossario è per sito. Prima i termini erano comuni a tutta la rete: «Casa dei Ponti», aggiunto su casadeiponti.ch, compariva (e veniva applicato) anche nel glossario di oasidellespezie.ch. Ora la tabella ha la colonna blog_id (DB version 2, chiave unica blog_id + termine) e ogni sito vede, salva, elimina e applica solo i propri termini; la modifica di un termine rimette in coda solo le traduzioni di quel sito. Versione del glossario, coppie da sincronizzare, file CSV e risorse Google sono anch'essi del sito.
    • feat(migrazione): all'aggiornamento ogni termine esistente va ai siti il cui contenuto lo contiene davvero, cioè gli unici siti dove aveva effetto; un termine che non compare in nessun sito va a tutti i siti che traducono, così nessun termine si perde. I siti Google ricostruiscono le proprie risorse al ciclo successivo.
    • feat(permessi): Glossario e API traduzione non sono più riservati ai Super Admin: le vedono amministratori, shop manager ed editor del sito, come il resto del menu tW Translate (capability twtr_manage_translations, assegnata anche ai siti già installati e al ruolo shop manager creato da WooCommerce in seguito). L'opzione di rete «Dati alla disinstallazione» resta ai Super Admin. Rimossa la pagina Glossario in Network Admin, che ora non avrebbe più senso.
    • fix(openai): «Risposta OpenAI non allineata» non fa più fallire l'intero gruppo di 25 testi: quando il modello perde o unisce dei segmenti la coda divide il gruppo a metà e riprova, fino a isolare il testo problematico. Su oasidellespezie.ch questo errore aveva parcheggiato 64 testi.
  32. 1.8.0
    • feat(update): aggiornamenti tramite l'header nativo Update URI e il loader generico includes/tw-release-updater.php (TW_Release_Updater), condivisibile da tutti i plugin ticinoWEB senza mai modificarlo; aggiornamenti automatici accesi (disattivabili con TW_RELEASE_AUTO_UPDATE). Il plugin installa e aggiorna da solo il loader come mu-plugin wp-content/mu-plugins/tw-release-updater.php, così gli aggiornamenti funzionano anche in admin di rete e nel cron del sito principale di un multisite, e su qualsiasi server dove il plugin viene attivato. Rimosso includes/class-twtr-updater.php (1.7.0), sostituito da questo.
  33. 1.7.0
    • feat(multisite): ogni sito traduce solo con la propria chiave. Motore, chiave OpenAI / credenziali Google, modello, bucket, limite giornaliero e contatore dei caratteri passano dalle impostazioni di rete a quelle del sito (twtr_engine, twtr_usage, non autoload). Un sito senza la propria chiave non traduce: niente fallback su chiave di rete, costanti TWTR_OPENAI_API_KEY / TWTR_GOOGLE_* / TWTR_PROVIDER o variabili d'ambiente, che tradurrebbero ogni sito a spese di un solo cliente. Prima un solo motore e una sola chiave servivano tutti i siti: il 2026-09-23 Synergy (Google) ha tradotto con la chiave OpenAI di Casa Dei Ponti, e il limite unico di 500 000 caratteri esaurito da un sito fermava anche gli altri.
    • feat(queue): senza credenziali la coda non parte (niente cron) e wp twtr queue / «Processa ora» spiegano il motivo; salvare le credenziali riavvia la coda. Limite e contatore sono quelli del sito.
    • feat(glossario): termini ancora comuni alla rete, ma stato di sincronizzazione Google per sito (ogni sito ha le risorse nel proprio progetto Google); un cambio di termini fa risincronizzare ogni sito Google al ciclo successivo. Token OAuth Google e chiave del service account memorizzati per sito (anche dentro un switch_to_blog()).
    • feat(admin): la pagina «API traduzione» configura il sito corrente e avvisa se manca la chiave; Network Admin mostra solo il Glossario. La scheda Coda e wp twtr status mostrano motore, ultime cifre della chiave, caratteri usati e limite del sito.
    • feat(cli): wp twtr legacy-keys [--assign=openai|google] [--purge] per assegnare al sito giusto le credenziali di rete delle versioni precedenti e cancellarle dalla rete.
    • feat(update): aggiornamenti dal repo release gfrino/ticinoweb-wp-themes-and-plugin-releases (§13), con supporto all'interruttore degli aggiornamenti automatici.
Assistente ticinoWEB Online