← Torna agli articoli
Web 17/04/2026 ProtoMedia

Un sito che parla 25 lingue, senza traduttori

Come abbiamo costruito il sistema di traduzione che gira sotto queste pagine: AI al bisogno, cache sempre, zero attesa percepita.

Il problema dell'i18n tradizionale

Per anni l'internazionalizzazione di un sito web è stata una piccola odissea di workflow: file .po, traduttori umani, chiavi dimenticate, deploy ritardati perché "manca ancora il tedesco". Aggiungere una lingua costava tempo e soldi; aggiungerne dieci era fuori discussione per qualunque piccola azienda.

Con gli LLM di ultima generazione la qualità della traduzione automatica è arrivata a un punto in cui — per un sito aziendale, non per la letteratura — è sufficiente. La domanda non è più "possiamo tradurlo in automatico", ma "come lo integriamo senza rompere l'esperienza utente".

L'architettura, in breve

Il sito è servito staticamente in italiano. Quando un utente sceglie un'altra lingua entra in gioco un piccolo motore su tre collezioni MongoDB:

  • i18n_base: i testi sorgente in italiano e inglese, ognuno con tono, limite di caratteri e una descrizione del suo uso. Questa descrizione diventa parte del prompt al LLM, che così sa se sta traducendo un bottone o un paragrafo.
  • i18n_cache: le traduzioni già generate, indicizzate per (campo, lingua). Ogni entry conserva il timestamp del testo base al momento della generazione.
  • articoli_i18n: stessa logica applicata ai contenuti più lunghi, come questo articolo.

Al primo accesso in una nuova lingua il sistema chiede al LLM solo i campi davvero mancanti, salva la risposta nella cache e la restituisce al browser. Alle visite successive la stessa lingua arriva istantanea, senza più chiamate AI.

L'invalidazione che funziona

Una cache è una bugia ordinata: dice "la mia verità è questa" finché qualcuno non la smentisce. Il meccanismo di smentita qui è semplice: ogni traduzione cacheata memorizza il timestamp del testo base che l'ha generata. Quando modifichi il testo italiano e bumpi il suo updated_at, tutte le traduzioni di quel campo in tutte le lingue risultano automaticamente stale e vengono rigenerate al bisogno. Zero cascate manuali, nessuna cache da svuotare.

L'utente che non aspetta

La parte più interessante non è la traduzione — è come la si mostra. Al cambio lingua, il browser ha davanti una pagina italiana con piccoli spinner accanto a ogni blocco di testo da aggiornare. La tentazione è fare una singola chiamata che traduce tutto insieme: semplice, pulito, e condanna l'utente ad aspettare che il LLM abbia finito tutto prima di vedere qualunque cambiamento.

Abbiamo preso la direzione opposta. I testi vengono raggruppati per sezione (navbar, corpo, footer) e spezzati in micro-batch da tre campi ciascuno. Le chiamate partono in sequenza: prima i pochi campi della navbar, che compaiono in pochi secondi — l'utente vede che qualcosa sta succedendo e inizia a leggere. Mentre legge, arriva il primo pezzo del corpo, poi il secondo, infine il footer.

La lezione in breve: La velocità percepita non è la velocità totale. Tradurre un pezzo alla volta, in ordine visibile, conta più che finire prima.

Il lavoro notturno

Una cache ha un solo vero nemico: la prima visita. Il primo utente tedesco paga il prezzo di tutte le traduzioni future, e la sua esperienza è quella che gli resta in testa. Per eliminare (o quasi) il problema, un task in background si sveglia ogni minuto, sceglie la lingua più attesa tra quelle ancora incomplete, prende un testo non tradotto e lo fa passare dal LLM. Al minuto successivo, il prossimo. In pochi giorni le lingue più diffuse sono già tutte calde.

Se sei il primo tedesco della giornata e arrivi mentre il sistema sta ancora ultimando la cache, hai comunque il caricamento progressivo a tenerti occupato. Se sei il secondo, non te ne accorgi nemmeno.

Cosa si porta a casa

Un sito multilingua senza traduttori, senza file da gestire, senza deploy per aggiungere una lingua. L'utente digita un codice — ja, ca, eu, quello che vuole — e la pagina si traduce. La seconda volta è istantanea. Alla terza, molto probabilmente ci siamo già arrivati noi, tradotta al minuto giusto da un task che non dorme mai.

Questa stessa pagina, se la stai leggendo in tedesco, in spagnolo, in coreano, non è stata scritta nessuna volta da un traduttore. È stata tradotta una volta sola, da un LLM, e da allora è servita dalla cache. L'unica cosa scritta a mano è quello che stai leggendo adesso, in italiano.

Interessato a portare questa architettura sul tuo sito? Parliamone.

Contattaci

Hai un'osservazione? Scrivici

Il messaggio arriva solo a noi. Se il tuo commento è interessante potremmo pubblicarlo in fondo all'articolo, ma solo dopo averlo valutato.