
Gidsen / Achter de schermen
Hoe we onze mobiele games in 14 talen hebben vertaald
Wat ervoor nodig was om onze Android-games in 14 talen te zetten: hoe we onze stringbestanden opbouwen, waarom meervoudsregels en lettertypen ertoe doen, de vertaalfouten die steeds terugkwamen, een bug die alleen telefoons in Europa treft, en waarom 14 talen 16 winkelpagina's betekent.
Onze eerste zes games zijn volledig vertaald in 14 talen: Engels, Duits, Spaans, Frans, Kroatisch, Indonesisch, Italiaans, Japans, Koreaans, Portugees, Russisch, Sloveens, Turks en Traditioneel Chinees. De eerste vier, Idle Ronin, Idle Summoner, Idle AI Factory en Block Brain, hebben samen ongeveer 2.100 Engelse strings, van 254 in Block Brain tot 1.253 in Idle Ronin, en elk ervan is 13 keer vertaald. Idle Restaurant: Miami en ONI Snakes kwamen uit in dezelfde 14 talen, Dark Tower: Idle Schurk TD kreeg er Nederlands, Noors en Vietnamees bij voor 17, en onze woordgame Lantern Isles: Woordpuzzel heeft 20 talen, elk met een eigen woordenlijst. Dit is wat dat vroeg, en wat we opnieuw zouden doen.
Eén stringbestand per taal, met context
Elke game heeft één gewoon tekstbestand per taal. Een regel is de Engelse bronregel, gemarkeerd met @, gevolgd door de vertaling, gemarkeerd met =, en de meeste regels hebben een opmerking die voor de vertaler is geschreven. Dit is het eerste monster in het Engelse bestand van Idle Summoner:
# monster name with its number in the summon chain (1-55); names appear on small labels
@ {0}. Slime
Die opmerkingen zijn het nuttigste wat we hebben toegevoegd. Het Engelse bestand van Idle Summoner heeft er 156 voor 258 strings. Een vertaler die weet dat een string op een piepklein label staat, of dat {0} een getal is, maakt veel minder fouten dan iemand die alleen op de woorden gokt.
De Engelse tekst zelf als sleutel gebruiken houdt de bestanden leesbaar, maar het heeft een valkuil. Een string die in beide kolommen hetzelfde is, is niet automatisch een naam die Engels moet blijven: in Idle Ronin kwamen ongeveer 680 van de eerste 1.185 regels overeen met hun Engelse tekst. Alleen de echte eigennamen blijven Engels, de 19 Guardians, de unitnamen en 12 kostuums, en ons buildscript zet precies die vast.
Meervoudsregels zijn niet optioneel
Engels heeft twee vormen: 1 unit, 2 units. Veel talen hebben er meer, en de regels verschillen. Onze Loc-code volgt de meervoudsregels voor gehele getallen uit de Unicode CLDR-tabellen:
| Talen | Vormen die onze code gebruikt |
|---|---|
| Engels, Duits, Spaans, Italiaans | one, other |
| Frans, Portugees | one (0 en 1), other |
| Kroatisch | one, few, other |
| Russisch | one, few, many |
| Sloveens | one, two, few, other |
| Turks, Indonesisch, Japans, Koreaans, Chinees | één vorm |
Sloveens is de taal die mensen verrast: het heeft een aparte vorm voor twee, dus “2 enoti” en “5 enot” zijn verschillende woorden. Kent je code alleen enkelvoud en meervoud, dan toont elk van deze talen ergens verkeerde grammatica.
Lettertypen: de letters waarvan je niet wist dat ze ontbraken
Het tekstlettertype van Idle Summoner was een uitgeklede kopie van Noto Sans KR Black zonder č, š, ž en ć, West-Europese accenten, Turkse letters en Traditioneel Chinees. Ontbrekende letters vielen terug op een lettertype van de telefoon of verschenen helemaal niet. We bouwden het opnieuw met elke letter die onze tabellen gebruiken en voegden Noto Sans JP toe voor Japans en Noto Sans TC voor Traditioneel Chinees. Labels in het pixellettertype van de game houden dat alleen zolang de tekst past in de letters die dat lettertype heeft.
Lettertypen kunnen ook misleiden. In het Koreaanse lettertype van Idle Ronin is een hoofdletter N zo getekend dat ON en OFF lezen als “OΠ”. We vervingen die schakelaars door de Koreaanse woorden 켜기 en 끄기, die sowieso beter lezen.
De fouten die in elke taal terugkwamen
Hoe een game ook wordt vertaald, de eerste versie is zelden klaar. De onze herhaalden in bijna elke taal hetzelfde handjevol fouten, de fouten die onze eigen Sloveense controle als eerste had gevonden:
- “Particle”, een grafische instelling, vertaald als het natuurkundewoord in plaats van “Effecten”.
- “Stack”, extra exemplaren van een unit, in het Engels gelaten of vertaald als “stapel” in plaats van “exemplaren”.
- Een quest om het monster Treasure Chest te verslaan, vertaald als het kapotslaan van schatkisten.
- Tekst op volle lengte vertaald voor rijen en badges waar maar een woord of twee in past.
- “FIGHT FLOOR {0}” met een overbodig werkwoord waardoor de knop te lang werd.
Dus schreven we een checker die precies die strings voor elke taal afdrukt, en we geven die lijst door voordat het vertalen begint. De twee talen die met de lijst in de hand werden vertaald, hadden geen correcties nodig; de talen zonder die lijst hadden er elk ongeveer zes nodig.
Controleer de schermen, niet alleen de bestanden
Een bestand kan compleet zijn terwijl het scherm nog Engels toont. Onze test: zet de game in een andere taal, verzamel elke zichtbare tekst op het scherm en vergelijk die met het Engelse bestand. Alles wat nog Engels is, is een label dat de code nooit vertaalt. In Idle Ronin vond die controle een altijd zichtbare OPEN-knop en instellingenknoppen die vastzaten in de taal die actief was toen het menu voor het eerst openging.
Controleer daarna of alles past op een echte telefoonresolutie. We bekijken elk scherm op 1080 x 2400 in de langste talen en in het Japans, Koreaans, Chinees en Russisch, en we korten tekst liever in dan dat we hem verkleinen tot niemand hem meer kan lezen.
Een komma die saves breekt in Europa
Eén bug heeft niets met woorden te maken. In een game die we aan het bouwen zijn, voegt de save getallen samen met komma's. Op een telefoon waarvan de taal decimalen met een komma schrijft, zoals in een groot deel van Europa, wordt 7392.58 dan 7392,58, de extra komma splitst het getal in tweeën, en elke waarde erna schuift één plek op. Een ontwikkelaar die in het Engels test, ziet het nooit. De oplossing is één regel bij het opstarten die de getalnotatie vastzet op de invariant culture, plus een beveiliging zodat saves die al kapot waren nog laden.
14 talen, 16 winkelpagina's
Google Play heeft aparte winkelpagina's voor Spaans in Spanje en Latijns-Amerika en voor Portugees in Portugal en Brazilië. We houden één vertaling in de game per taal, maar schrijven de winkeltekst apart voor elke markt, met eigen zoektermen. Dat maakt 16 winkelpagina's per game, elk met een eigen titel, korte beschrijving, volledige beschrijving en screenshots. Onze website volgt hetzelfde patroon, en hoe we die bouwen, leggen we uit in een apart bericht.
Wat we opnieuw zouden doen
- Schrijf bij elke string een contextopmerking.
- Zet eigennamen vast in de build, niet in het hoofd van de vertaler.
- Bouw meervoudsregels in voordat de eerste vertaling binnenkomt.
- Controleer of je lettertypen elke letter bevatten die je tabellen gebruiken.
- Houd een lijst bij van bekende probleemstrings en geef die vooraf door.
- Loop de schermen in een andere taal na op achtergebleven Engels.
- Schrijf savedata in de invariant culture.
- Reken op 16 winkelpagina's, niet op 14.
Wil je het resultaat zien? Wissel van taal in Idle Ronin, Idle Summoner, Idle AI Factory, Block Brain, Idle Restaurant: Miami of ONI Snakes: elk ervan spreekt alle 14.
Bronnen
- Unicode CLDR, Language Plural Rules.
- Gamecode van ONI Games, september 2026: Idle Summoner (Loc.cs, LocFonts.cs, Localization/Summoner/en.txt), Idle Ronin (Localization/Ronin), Idle AI Factory (Localization/AIFactory), Block Brain (Localization/Brain).










