← Înapoi la articole
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

Un site care vorbește zeci de limbi, fără traducători

Tradus automat din italiană · citește originalul

Cum am construit sistemul de traducere care rulează sub aceste pagini: AI la nevoie, cache mereu, zero așteptare percepută.

Problema i18n tradiționale

Ani de zile, internaționalizarea unui site web a fost o mică odisee de workflow: fișiere .po, traducători umani, chei uitate, deploy-uri întârziate pentru că "mai lipsește germana". Adăugarea unei limbi costa timp și bani; adăugarea a zece era de neconceput pentru orice companie mică.

Cu LLM-urile de ultimă generație, calitatea traducerii automate a ajuns într-un punct în care — pentru un site de afaceri, nu pentru literatură — este suficientă. Întrebarea nu mai este "o putem traduce automat", ci "cum o integrăm fără a strica experiența utilizatorului".

Arhitectura, pe scurt

Site-ul este servit static în italiană. Când un utilizator alege o altă limbă, intră în joc un mic motor pe trei colecții MongoDB:

  • i18n_base: textele sursă în limba aleasă (astăzi italiană), fiecare cu declarația propriei limbi, o descriere a locului și motivului pentru care apare pe site (esențială pentru calitatea traducerii), ton și limită de caractere. Această descriere devine parte din prompt-ul către LLM, astfel încât acesta să știe dacă traduce un buton sau un paragraf.
  • i18n_human: traducerile curate manual, atunci când pentru anumite pagini dorim calitate editorială în loc de output-ul LLM. Au prioritate asupra cache-ului automat și se "demarchează" automat când textul sursă se modifică.
  • i18n_cache: traducerile deja generate, indexate pe (câmp, limbă). Fiecare înregistrare păstrează timestamp-ul textului de bază la momentul generării.
  • articoli_i18n: aceeași logică aplicată conținuturilor mai lungi, cum ar fi acest articol.

La prima accesare într-o nouă limbă, sistemul solicită LLM doar câmpurile cu adevărat lipsă, salvează răspunsul în cache și îl returnează browserului. La vizitele ulterioare, aceeași limbă ajunge instantaneu, fără alte apeluri AI.

Invalidarea care funcționează

O memorie cache este o minciună ordonată: spune "adevărul meu este acesta" până când cineva o infirmă. Mecanismul de infirmare aici este simplu: fiecare traducere în memorie cache stochează timestamp-ul textului de bază care a generat-o. Când modifici textul italian și mărești updated_at, toate traducerile acelui câmp în toate limbile devin automat învechite și sunt regenerate la nevoie. Zero cascade manuale, nicio memorie cache de golit.

Utilizatorul care nu așteaptă

Partea cea mai interesantă nu este traducerea — ci modul în care este afișată. La schimbarea limbii, browserul are în față o pagină italiană cu mici indicatoare de încărcare lângă fiecare bloc de text care trebuie actualizat. Tentația este să faci un singur apel care traduce totul împreună: simplu, curat și condamnă utilizatorul să aștepte până când LLM-ul termină totul înainte de a vedea vreo schimbare.

Am luat direcția opusă. Textele sunt grupate pe secțiuni (navbar, corp, footer) și împărțite în micro-loturi de câte trei câmpuri fiecare. Apelurile pornesc în secvență: mai întâi cele câteva câmpuri din navbar, care apar în câteva secunde — utilizatorul vede că se întâmplă ceva și începe să citească. În timp ce citește, ajunge prima parte a corpului, apoi a doua, în final footer-ul.

Lecția pe scurt: Viteza percepută nu este viteza totală. Traducerea pe bucăți, în ordinea vizuală, contează mai mult decât să termini primul.

Munca de noapte

O memorie cache are un singur adevărat inamic: prima vizită. Primul utilizator german plătește prețul tuturor traducerilor viitoare, iar experiența lui este cea care îi rămâne în minte. Pentru a elimina (sau aproape) problema, o sarcină în fundal se trezește la fiecare minut, alege limba cea mai așteptată dintre cele încă incomplete, ia un text netradus și îl trimite către LLM. În minutul următor, următorul. În câteva zile, limbile cele mai răspândite sunt deja încălzite.

Sarcina nocturnă face și o a doua meserie: revizuiește automat traducerile de calitate îndoielnică, reîncercându-le cu un model AI diferit. Când alinierea între limbi este importantă, o traducere mediocră nu rămâne așa.

Dacă ești primul german al zilei și ajungi în timp ce sistemul încă finalizează memoria cache, ai oricum încărcarea progresivă care să te țină ocupat. Dacă ești al doilea, nici nu îți dai seama.

Ce obții

Un site multilingv fără traducători, fără fișiere de gestionat, fără implementări pentru a adăuga o limbă. Utilizatorul introduce un cod — ja, ca, eu, ce dorește — și pagina se traduce. A doua oară este instantanee. A treia oară, foarte probabil am ajuns deja noi, tradusă la momentul potrivit de o sarcină care nu doarme niciodată.

Această aceeași pagină, dacă o citești în germană, în spaniolă, în coreeană, nu a fost scrisă niciodată de un traducător. A fost tradusă o singură dată, de un LLM, și de atunci este servită din cache. Singurul lucru scris de mână este ceea ce citești acum dacă este în italiană.

Interesat să aduci această arhitectură pe site-ul tău? Să discutăm.

Contactează-ne

Ai o observație? Scrie-ne

Mesajul ajunge doar la noi. Dacă comentariul tău este interesant, îl putem publica la finalul articolului, dar numai după evaluare.

În timp ce scrii, browserul tău rezolvă o mică problemă de calcul – este modul nostru de a bloca spamul automat fără servicii externe și fără a te solicita să recunoști semafoare. Nu ți se cere nimic și niciun dat nu părăsește acest site.