← Till artiklar
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

En webbplats som talar dussintals språk, utan översättare

Maskinöversatt från italienska · läs originalet

Hur vi byggde översättningssystemet som driver dessa sidor: AI vid behov, cache alltid, noll upplevd väntan.

Problemet med traditionell i18n

I åratal har internationaliseringen av en webbplats varit en liten odyssé av arbetsflöden: .po-filer, mänskliga översättare, glömda nycklar, försenade driftsättningar eftersom "tyskan saknas fortfarande". Att lägga till ett språk kostade tid och pengar; att lägga till tio var otänkbart för vilket litet företag som helst.

Med LLM:er av senaste generationen har kvaliteten på automatisk översättning nått en punkt där den — för en företagswebbplats, inte för litteratur — är tillräcklig. Frågan är inte längre "kan vi översätta det automatiskt", utan "hur integrerar vi det utan att förstöra användarupplevelsen".

Arkitekturen, kortfattat

Webbplatsen serveras statiskt på italienska. När en användare väljer ett annat språk kommer en liten motor in i spel på tre MongoDB-samlingar:

  • i18n_base: källtexterna på det valda språket (idag italienska), var och en med en deklaration av sitt språk, en beskrivning av var och varför det förekommer på webbplatsen (väsentligt för översättningskvaliteten), ton och teckenbegränsning. Denna beskrivning blir en del av prompten till LLM, så att den vet om den översätter en knapp eller ett stycke.
  • i18n_human: manuellt redigerade översättningar, när vi för vissa sidor vill ha redaktionell kvalitet istället för LLM-output. De har prioritet över den automatiska cachen och "avmarkeras" automatiskt när källtexten ändras.
  • i18n_cache: redan genererade översättningar, indexerade efter (fält, språk). Varje post bevarar tidsstämpeln för bastexten vid genereringstillfället.
  • articoli_i18n: samma logik tillämpad på längre innehåll, som denna artikel.

Vid första besöket på ett nytt språk frågar systemet LLM endast efter de fält som verkligen saknas, sparar svaret i cachen och returnerar det till webbläsaren. Vid efterföljande besök kommer samma språk omedelbart, utan ytterligare AI-anrop.

Ogiltigförklaring som fungerar

En cache är en ordnad lögn: den säger "min sanning är denna" tills någon motbevisar den. Mekanismen för att motbevisa här är enkel: varje cachad översättning lagrar tidsstämpeln för grundtexten som genererade den. När du ändrar den italienska texten och ökar dess updated_at, blir alla översättningar av det fältet i alla språk automatiskt inaktuella och återskapas vid behov. Noll manuella kaskader, ingen cache att tömma.

Användaren som inte väntar

Det mest intressanta är inte översättningen — det är hur den visas. Vid språkbyte har webbläsaren en italiensk sida framför sig med små snurror bredvid varje textblock som ska uppdateras. Frestelsen är att göra ett enda anrop som översätter allt tillsammans: enkelt, rent och dömer användaren att vänta tills LLM:en är klar med allt innan de ser någon förändring.

Vi tog den motsatta vägen. Texterna grupperas per sektion (navbar, brödtext, sidfot) och delas upp i mikro-batchar om tre fält vardera. Anropen startar i sekvens: först de få fälten i navbaren, som visas inom några sekunder — användaren ser att något händer och börjar läsa. Medan hen läser kommer den första delen av brödtexten, sedan den andra och slutligen sidfoten.

Lektionen i korthet: Upplevd hastighet är inte total hastighet. Att översätta bit för bit, i synlig ordning, är viktigare än att vara först i mål.

Nattjobbet

En cache har bara en verklig fiende: det första besöket. Den första tyska användaren betalar priset för alla framtida översättningar, och det är den upplevelsen som stannar kvar i minnet. För att eliminera (eller nästan) problemet, vaknar en bakgrundsaktivitet varje minut, väljer det mest efterfrågade språket bland de som fortfarande är ofullständiga, tar en översatt text och låter den passera genom LLM. Nästa minut, nästa. På bara några dagar är de vanligaste språken redan "varma".

Nattjobbet gör också ett andra jobb: det granskar automatiskt översättningar av tveksam kvalitet och försöker igen med en annan AI-modell. När anpassningen mellan språk är viktig, förblir en medioker översättning inte sådan.

Om du är den första tysken den dagen och anländer medan systemet fortfarande slutför cachen, har du ändå progressiv laddning att hålla dig sysselsatt med. Om du är den andra, märker du det inte ens.

Vad man tar med sig hem

En flerspråkig webbplats utan översättare, utan filer att hantera, utan driftsättning för att lägga till ett språk. Användaren skriver in en kod — ja, ca, eu, vad som helst — och sidan översätts. Andra gången är det omedelbart. Vid den tredje har vi förmodligen redan hunnit dit, översatt i rätt ögonblick av en uppgift som aldrig sover.

Denna sida, om du läser den på tyska, spanska eller koreanska, har aldrig skrivits av en översättare. Den har översatts en gång, av en LLM, och har sedan serverats från cachen. Det enda som skrivits för hand är det du läser nu om det är på italienska.

Intresserad av att implementera denna arkitektur på din webbplats? Låt oss prata om det.

Kontakta oss

Har du en synpunkt? Skriv till oss

Meddelandet når endast oss. Om din kommentar är intressant kan vi publicera den längst ner i artikeln, men först efter godkännande.

Medan du skriver löser din webbläsare ett litet beräkningsproblem – vårt sätt att hålla ute automatiska inlägg utan tredjepartstjänster eller semafor-verifiering. Du behöver inte göra något och inga data lämnar denna sida.