← Terug naar artikelen
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

Een site die tientallen talen spreekt, zonder vertalers

Automatisch vertaald van het Italiaans · lees het origineel

Hoe we het vertaalsysteem hebben gebouwd dat onder deze pagina's draait: AI indien nodig, altijd cache, en geen merkbare wachttijd.

Het probleem van traditionele i18n

Jarenlang was het internationaliseren van een website een kleine odyssee van workflows: .po bestanden, menselijke vertalers, vergeten sleutels, vertraagde deployments omdat "het Duits ontbreekt nog". Het toevoegen van een taal kostte tijd en geld; het toevoegen van tien was uitgesloten voor elk klein bedrijf.

Met de LLM's van de nieuwste generatie is de kwaliteit van automatische vertaling zover verbeterd dat het voldoende is - voor een zakelijke website, niet voor literatuur. De vraag is niet langer "kunnen we het automatisch vertalen", maar "hoe integreren we het zonder de gebruikerservaring te verstoren".

De architectuur, in het kort

De site wordt statisch in het Italiaans aangeboden. Wanneer een gebruiker een andere taal kiest, komt een kleine engine in actie op drie MongoDB-collecties:

  • i18n_base: de bronteksten in de gekozen taal (vandaag Italiaans), elk met de vermelding van de eigen taal, een beschrijving van waar en waarom het op de site voorkomt (essentieel voor de kwaliteit van de vertaling), toon en tekenslimiet. Deze beschrijving wordt onderdeel van de prompt naar de LLM, zodat deze weet of hij een knop of een paragraaf vertaalt.
  • i18n_human: de handmatig gecureerde vertalingen, wanneer we voor sommige pagina's redactionele kwaliteit willen in plaats van de LLM-output. Ze hebben prioriteit op de automatische cache en worden automatisch "ongeldig" gemaakt wanneer de brontekst verandert.
  • i18n_cache: de reeds gegenereerde vertalingen, geïndexeerd op (veld, taal). Elke entry bewaart de timestamp van de basistekst op het moment van generatie.
  • articoli_i18n: dezelfde logica toegepast op langere inhoud, zoals dit artikel.

Bij de eerste toegang in een nieuwe taal vraagt het systeem de LLM alleen om de echt ontbrekende velden, slaat het antwoord op in de cache en retourneert het naar de browser. Bij volgende bezoeken komt dezelfde taal direct beschikbaar, zonder verdere AI-aanroepen.

De ongeldigmaking die werkt

Een cache is een geordende leugen: het zegt "mijn waarheid is deze" totdat iemand het tegenspreekt. Het mechanisme om dit te weerleggen is hier eenvoudig: elke gecachte vertaling slaat de timestamp van de basistekst op die het heeft gegenereerd. Wanneer je de Italiaanse tekst wijzigt en de updated_at verhoogt, worden alle vertalingen van dat veld in alle talen automatisch ongeldig en worden ze indien nodig opnieuw gegenereerd. Geen handmatige cascades, geen cache om te legen.

De gebruiker die niet wacht

Het meest interessante is niet de vertaling — het is hoe je deze toont. Bij een taalwijziging ziet de browser een Italiaanse pagina met kleine spinners naast elk tekstblok dat moet worden bijgewerkt. De verleiding is om één enkele aanroep te doen die alles tegelijkertijd vertaalt: eenvoudig, schoon, en het veroordeelt de gebruiker om te wachten tot de LLM alles heeft afgerond voordat hij enige verandering ziet.

We hebben de tegenovergestelde richting ingeslagen. De teksten worden gegroepeerd per sectie (navbar, body, footer) en opgesplitst in micro-batches van elk drie velden. De aanroepen vertrekken sequentieel: eerst de paar velden van de navbar, die binnen enkele seconden verschijnen — de gebruiker ziet dat er iets gebeurt en begint te lezen. Terwijl hij leest, komt het eerste stuk van de body, dan het tweede, en ten slotte de footer.

De les in het kort: Waargenomen snelheid is niet de totale snelheid. Het geleidelijk vertalen van stukken, in visuele volgorde, is belangrijker dan het snel afwerken ervan.

Het nachtwerk

Een cache heeft slechts één echte vijand: het eerste bezoek. De eerste Duitse gebruiker betaalt de prijs van alle toekomstige vertalingen, en dat is de ervaring die hem bijblijft. Om het probleem (of bijna) te elimineren, wordt een achtergrondtaak elke minuut wakker, kiest de meest verwachte taal van de nog incomplete talen, pakt een onvertaalde tekst en laat deze door de LLM verwerken. De volgende minuut weer. Binnen enkele dagen zijn de meest voorkomende talen al "warm".

De nachttaak doet ook een tweede klus: het herziet automatisch vertalingen van dubieuze kwaliteit en probeert ze opnieuw met een ander AI-model. Wanneer de afstemming tussen talen belangrijk is, blijft een middelmatige vertaling niet middelmatig.

Als je de eerste Duitser van de dag bent en aankomt terwijl het systeem de cache nog aan het afwerken is, heb je nog steeds het progressieve laden om je bezig te houden. Als je de tweede bent, merk je er niets van.

Wat je meeneemt

Een meertalige website zonder vertalers, zonder bestanden om te beheren, zonder implementaties om een taal toe te voegen. De gebruiker typt een code – ja, ca, eu, wat hij/zij maar wil – en de pagina wordt vertaald. De tweede keer is het direct. De derde keer zijn we er waarschijnlijk al in geslaagd, vertaald op het juiste moment door een taak die nooit slaapt.

Deze pagina zelf, als je hem in het Duits, Spaans of Koreaans leest, is nog nooit door een vertaler geschreven. Hij is één keer vertaald door een LLM en is sindsdien vanuit de cache geleverd. Het enige dat met de hand is geschreven, is wat je nu leest als het in het Italiaans is.

Geïnteresseerd om deze architectuur naar jouw website te brengen? Laten we erover praten.

Contacteer ons

Een opmerking? Laat het ons weten

Deze boodschap is alleen voor ons. Als je reactie interessant is, kunnen we deze onder het artikel publiceren, na beoordeling. term

Terwijl je typt, lost je browser een klein rekenprobleem op. Dit is hoe we automatisch spam tegengaan zonder externe diensten of semafoortests, en zonder dat er iets van jou gevraagd wordt. Er worden geen gegevens verzonden.