Best Practices voor App-Lokalisatie: De Volledige Gids voor Ontwikkelaars

A
Geschreven door
AI Trans Team
12 min lezen
337 weergaven

Je hebt een geweldige app gebouwd. Je code is schoon, je functies zijn solide en je Engelstalige gebruikers zijn er dol op. Maar je laat 75% van de potentiële gebruikers links liggen door hun talen niet te ondersteunen.

App-localisatie gaat niet alleen om vertaling — het gaat erom je app wereldwijd native te laten aanvoelen voor gebruikers. Een goed gelokaliseerde app kan het aantal downloads met 128% verhogen en de omzet met meer dan 26% per markt, volgens het app-localisatieonderzoek van Distomo.

In deze uitgebreide gids leer je alles wat je moet weten over het lokaliseren van mobiele en webapps: van het beschermen van variabele placeholders tot het omgaan met meervoudsvormen, datumnotaties en culturele nuances.

Wat is App-localisatie (en waarom het belangrijk is)

Localisatie gaat verder dan vertaling. Het is het aanpassen van je app aan een specifieke regio, inclusief:

  • Taalvertaling (voor de hand liggend, maar slechts het begin)
  • Culturele aanpassing (kleuren, afbeeldingen, symbolen hebben verschillende betekenissen)
  • Formaatconventies (data, getallen, valuta)
  • Juridische naleving (GDPR in de EU, verschillende gebruiksvoorwaarden)
  • Betalingsmethoden (Alipay in China, UPI in India)

Impact in de echte wereld

Case Study: Duolingo

  • App gelokaliseerd in 40+ talen
  • Zag 300% toename in gebruikerswerving op niet-Engelstalige markten
  • App Store-beoordelingen verbeterd met gemiddeld 0,8 sterren op gelokaliseerde markten

Case Study: Spotify

  • Ondersteuning voor Hindi en Tamil toegevoegd in India
  • Gebruikersbestand groeide met 200% in 6 maanden
  • Werd #1 muziekstreamingapp in de regio

De technische basis: i18n vs L10n

Voordat we erin duiken, laten we twee termen verduidelijken die je overal zult tegenkomen:

i18n (Internationalization) Het voorbereiden van je codebase om meerdere talen te ondersteunen. Dit omvat:

  • Strings externaliseren (geen hardcoded tekst)
  • Placeholder-variabelen gebruiken
  • Ondersteuning voor RTL (rechts-naar-links) talen
  • Flexibele lay-outs ontwerpen

L10n (Localization) Het daadwerkelijk vertalen en aanpassen van content voor specifieke regio's:

  • UI-strings vertalen
  • Data/getallen opmaken
  • Regiospecifieke afbeeldingen leveren
  • Culturele verwijzingen aanpassen

Denk er zo over:

  • i18n = De infrastructuur bouwen (dit doe je één keer)
  • L10n = Nieuwe talen toevoegen (dit doe je herhaaldelijk)

Stap 1: Internationaliseer je codebase

iOS Apps (.strings-bestanden)

iOS gebruikt .strings-bestanden voor lokalisatie:

en.lproj/Localizable.strings:

/* Login-scherm */
"welcome_message" = "Welkom terug!";
"login_button" = "Inloggen";
"forgot_password" = "Wachtwoord vergeten?";

/* Profielscherm */
"edit_profile" = "Profiel bewerken";
"logout_button" = "Uitloggen";

In je Swift-code:

// Goed - Localiseerbaar
welcomeLabel.text = NSLocalizedString("welcome_message", comment: "Welkomstbericht op login-scherm")

// Slecht - Hardcoded (doe dit niet)
welcomeLabel.text = "Welcome back!"

Android Apps (strings.xml)

Android gebruikt XML-resourcebestanden:

res/values/strings.xml (Engels standaard):

<resources>
    <string name="welcome_message">Welkom terug!</string>
    <string name="login_button">Inloggen</string>
    <string name="items_count">Je hebt %d items</string>
</resources>

res/values-es/strings.xml (Spaans):

<resources>
    <string name="welcome_message">¡Bienvenido de nuevo!</string>
    <string name="login_button">Iniciar sesión</string>
    <string name="items_count">Tienes %d artículos</string>
</resources>

In je Kotlin/Java-code:

// Goed
binding.welcomeText.text = getString(R.string.welcome_message)

// Slecht - Hardcoded
binding.welcomeText.text = "Welcome back!"

React/Web Apps (i18n JSON)

Moderne webapps gebruiken JSON-bestanden met bibliotheken zoals i18next of react-intl:

locales/en.json:

{
  "welcome_message": "Welkom terug!",
  "login_button": "Inloggen",
  "items_count": "Je hebt {{count}} items",
  "greeting": "Hallo, {{name}}!"
}

locales/es.json:

{
  "welcome_message": "¡Bienvenido de nuevo!",
  "login_button": "Iniciar sesión",
  "items_count": "Tienes {{count}} artículos",
  "greeting": "¡Hola, {{name}}!"
}

In je React-componenten:

import { useTranslation } from 'react-i18next';

function LoginScreen() {
  const { t } = useTranslation();

  return (
    <div>
      <h1>{t('welcome_message')}</h1>
      <button>{t('login_button')}</button>
    </div>
  );
}

}

Stap 2: Beheer variabele placeholders correct

De meest voorkomende lokalisatiefout is het kapotmaken van variabele placeholders tijdens de vertaling.

Voorbeelden van tekenreeksopmaak

iOS (Swift):

// Enkele variabele
let message = String(format: NSLocalizedString("greeting", comment: ""), userName)
// "greeting" = "Hello, %@!";

// Meerdere variabelen
let status = String(format: NSLocalizedString("order_status", comment: ""), orderId, itemCount)
// "order_status" = "Order #%@ contains %d items";

Android (Kotlin):

// Enkele variabele
val message = getString(R.string.greeting, userName)
// <string name="greeting">Hello, %s!</string>

// Meerdere variabelen
val status = getString(R.string.order_status, orderId, itemCount)
// <string name="order_status">Order #%1$s contains %2$d items</string>

React (i18next):

// Enkele variabele
t('greeting', { name: userName })
// "greeting": "Hello, {{name}}!"

// Meerdere variabelen
t('order_status', { orderId: '12345', count: 5 })
// "order_status": "Order #{{orderId}} contains {{count}} items"

Veelvoorkomende placeholderfouten

Fout 1: Vertaaler verwijdert placeholder

// Voor vertaling
"welcome": "Welcome, {{name}}!"

// Slechte vertaling (placeholder verwijderd)
"welcome": "欢迎!"  // Naamvariabele verloren

// Correct
"welcome": "欢迎,{{name}}!"

Fout 2: Verkeerd placeholderformaat

<!-- Voor -->
<string name="items">You have %d items</string>

<!-- Slecht (verkeerd formaat) -->
<string name="items">Vous avez %s articles</string>  <!-- %s in plaats van %d -->

<!-- Correct -->
<string name="items">Vous avez %d articles</string>

Fout 3: Omgewisselde placeholder-volgorde

// Voor
"date_range": "From %1$s to %2$s"

// Slecht (volgorde doet ertoe!)
"date_range": "De %2$s à %1$s"  // Omgewisseld zonder positionele markers

// Correct (gebruik positionele argumenten)
"date_range": "De %1$s à %2$s"

Stap 3: Meester meervoudsvormen

Engels heeft eenvoudige meervoudsvormen: 1 item, 2 items. Makkelijk, toch? Fout. Andere talen hebben complexe meervoudsvormen:

  • Arabisch: 6 meervoudsvormen (zero, one, two, few, many, other)
  • Russisch: 3 meervoudsvormen gebaseerd op de laatste cijfer
  • Japans: Geen meervoudsonderscheid
  • Pools: Complexe regels gebaseerd op nummers die eindigen op specifieke cijfers

iOS Meervoudsvormen (.stringsdict)

Localizable.stringsdict:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@items@</string>
        <key>items</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>zero</key>
            <string>No items</string>
            <key>one</key>
            <string>One item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

Android Meervoudsvormen (plurals.xml)

res/values/strings.xml:

<plurals name="items_count">
    <item quantity="zero">No items</item>
    <item quantity="one">One item</item>
    <item quantity="other">%d items</item>
</plurals>

Gebruik in Kotlin:

val count = 5
val text = resources.getQuantityString(R.plurals.items_count, count, count)
// Uitvoer: "5 items"

React Meervoudsvormen (i18next)

locales/en.json:

{
  "items_count": "{{count}} item",
  "items_count_plural": "{{count}} items",
  "items_count_zero": "No items"
}

Gebruik:

t('items_count', { count: 0 })  // "No items"
t('items_count', { count: 1 })  // "1 item"
t('items_count', { count: 5 })  // "5 items"

Stap 4: Beheer data, tijden en getallen

Hardcode datum/nummerformaten nooit. Ze variëren dramatisch per regio:

Datumopmaak

VS (en-US): 12/31/2025 (MM/DD/YYYY) VK (en-GB): 31/12/2025 (DD/MM/YYYY) Japan (ja-JP): 2025/12/31 (YYYY/MM/DD) Duitsland (de-DE): 31.12.2025 (DD.MM.YYYY)

iOS (Swift):

let date = Date()
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.locale = Locale.current

print(formatter.string(from: date))
// VS: "Jan 15, 2025"
// Duitsland: "15. Jan. 2025"
// Japan: "2025/01/15"

Android (Kotlin):

val date = Date()
val format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault())
println(format.format(date))

React (JavaScript):

const date = new Date();
const formatted = new Intl.DateTimeFormat(locale, {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}).format(date);

// en-US: "January 15, 2025"
// fr-FR: "15 janvier 2025"
// ja-JP: "2025年1月15日"

Nummer- en valuta-opmaak

Nummers:

  • VS: 1.234.567,89
  • Duitsland: 1.234.567,89
  • India: 12,34,567.89 (lakh-systeem)

iOS:

let number = 1234567.89
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current
print(formatter.string(from: NSNumber(value: number))!)

Valuta:

let price = 99.99
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ja-JP")
print(formatter.string(from: NSNumber(value: price))!)
// Output: "¥100" (afgerond in Japanse yen)

Stap 5: Vertaal je lokalisatiebestanden

Nu komt de eigenlijke vertaling. Je hebt verschillende opties:

Optie 1: Handmatige vertaling (Langzaam maar nauwkeurig)

Huur moedertaalsprekers in of gebruik een vertaalbureau:

Voordelen:

  • Hoge kwaliteit
  • Culturele nuances begrepen
  • Menselijke controle

Nadelen:

  • Duur ($0,10-0,25 per woord)
  • Langzaam (weken voor grote apps)
  • Moeilijk om frequent te updaten

Optie 2: Machinevertaling + controle (Gebalanceerd)

Gebruik AI-vertalingstools en laat moedertaalsprekers controleren:

Voordelen:

  • Snel (minuten in plaats van weken)
  • Kosteneffectief ($10-50 per miljoen tekens vs duizenden voor menselijke vertaling)
  • Goed voor initiële lancering
  • Perfect voor iteraties

⚠️ Let op:

  • Technische terminologie (zorgvuldig controleren)
  • Consistentie in merktone
  • Culturele gepastheid

Optie 3: Crowdsourced vertaling (Community-gedreven)

Laat je gebruikers vertalen (zoals Wikipedia):

Voordelen:

  • Gratis of zeer goedkoop
  • Community-betrokkenheid
  • Dekking van obscure talen

Nadelen:

  • Kwaliteit varieert sterk
  • Langzaam voor nieuwe strings
  • Vereist moderatie

Stap 6: Test in alle talen

Vertaal niet zomaar en publiceer. Test grondig:

Layout-testing

Tekstuitbreiding is echt:

Engels: "Settings" (8 tekens) Duits: "Einstellungen" (14 tekens - 75% langer!) Fins: "Asetukset" (9 tekens)

Test je lay-outs met:

1. Langste taal (meestal Duits/Fins)
2. Kortste taal (meestal Chinees/Japans)
3. RTL-talen (Arabisch/Hebreeuws)
4. Speciale tekens (Pools ą, ż, ć)

Functionele testing

  • Tik op alle knoppen in elke taal (zorg dat ze werken)
  • Vul formulieren in (foutmeldingen moeten ook vertaald zijn)
  • Test edge cases (0 items, 1 item, veel items voor meervoud)
  • Controleer meldingen (push-meldingen hebben vertaling nodig)

Pseudo-lokalisatie

Voordat je echt vertaalt, gebruik pseudo-lokalisatie om bugs te vinden:

"Settings" → "[!!! Šéţţîñĝš !!!]"
"Welcome" → "[!!! Ŵéļčöɱé !!!]"

Dit helpt je te vinden:

  • Hardcoded strings (worden niet omwikkeld met [!!! !!!])
  • Layout-problemen (geaccentueerde tekens zijn breder)
  • Tekst die wordt afgesneden

Stap 7: Optimaliseer voor app stores (ASO)

Vertaal ook je app store-listing:

App Store lokalisatie-checklist

App-naam (kan per regio verschillen) ✅ Subtitel/Korte beschrijvingKeywords (onderzoek lokale zoektermen) ✅ Volledige beschrijvingScreenshots (gebruik gelokaliseerde UI) ✅ Preview-video (voeg ondertitels of voice-over toe) ✅ What's New (update-opmerkingen)

Impact: Apps met gelokaliseerde store-listings zien gemiddeld 128% meer downloads (App Annie, 2024).

Veelvoorkomende lokalisatie-valkuilen

Valkuil 1: Culturele ongevoeligheid

Handgebaren gebruiken: Duim omhoog is aanstootgevend in sommige Midden-Oosterse landen ❌ Kleurenbetekenissen: Wit betekent zuiverheid in westerse culturen, dood in Chinese cultuur ❌ Symbolen: Rode X betekent universeel fout? Nee—rood is geluk in China

Valkuil 2: RTL-talen negeren

Apps moeten volledig gespiegeld worden voor Arabisch/Hebreeuws:

Engels (LTR):    [←Back]  Title           [Menu→]
Arabisch (RTL):  [→Menu]  العنوان        [Back←]

iOS: Schakel RTL-ondersteuning in in Interface Builder Android: Gebruik start/end in plaats van left/right in lay-outs

Web: Gebruik CSS logische eigenschappen (margin-inline-start in plaats van margin-left)

Valstrik 3: Strings samenvoegen

Nooit zinnen bouwen door samenvoeging:

// SLECHT - Grammatica breekt in andere talen
const message = "You have " + count + " messages";

// GOED - Gebruik complete vertaalbare strings
const message = t('messages_count', { count });
// "messages_count": "You have {{count}} messages"

Waarom? Woordvolgorde verandert per taal:

  • Engels: "You have 5 messages"
  • Japans: "メッセージが5件あります" (Berichten 5 stuks hebben)
  • Duits: "Sie haben 5 Nachrichten"

Valstrik 4: Geen rekening houden met tekstuitbreiding

Reserveer extra ruimte:

Taal Uitbreiding
Duits +30-40%
Frans +20-30%
Spaans +20-30%
Chinees -30% (korter!)

Tools voor app-localisatie

Vertaalbeheerplatforms

  1. Lokalise - Populair voor mobiele apps
  2. Crowdin - Goed voor open-source projecten
  3. Phrase - Enterprise-niveau
  4. POEditor - Gratis tier beschikbaar

AI-vertaling voor localisatiebestanden

AI Trans - Ontworpen voor ontwikkelaars-localisatiebestanden:

  • Detecteert automatisch .strings, strings.xml, JSON-formaten
  • Behoudt alle placeholders (%@, %d, %1$s, {{var}})
  • Behoudt bestandsstructuur en commentaar
  • Behandelt meervoudsvormen correct
  • Prijs: $10 voor 1M tekens (Standard) of $50 voor 10M tekens (Business)

Voorbeeldkosten voor typische apps:

  • Kleine app (500 strings, ~50.000 tekens): $0,50 om te vertalen naar 5 talen
  • Middelgrote app (2.000 strings, ~200.000 tekens): $2 voor 10 talen
  • Grote app (10.000 strings, ~1M tekens): $10 voor 15 talen

Workflow:

1. Upload je en.lproj/Localizable.strings (of strings.xml, of i18n JSON)
2. Selecteer doeltalen (Spaans, Frans, Duits, Japans, enz.)
3. AI behoudt alle %@, %d, {{var}} placeholders automatisch
4. Download vertaalde es.lproj/, fr.lproj/, de.lproj/, ja.lproj/
5. Sleep in Xcode/Android Studio → Klaar

vs. Traditionele vertaling:

Aspect AI Trans Vertaalbureau
2.000 strings $2 $2.000-4.000
Tijd 5 minuten 2-3 weken
Herzieningen GRATIS $500+/herziening
Placeholder-fouten 0% (auto-behouden) 5-10% (handmatig)

ROI van lokalisatie meten

Volg deze metrics:

Gebruikerswerving:

  • Downloads per land/taal
  • Kosten per installatie per regio
  • Organisch vs betaald gesplitst per regio

Betrokkenheid:

  • Sessieduur per taal
  • Functieadoptie per regio
  • Retentiepercentages (Dag 1, 7, 30)

Omzet:

  • In-app aankopen per valuta
  • Abonnementsconversie per land
  • LTV (Lifetime Value) per taal

Voorbeeld ROI-berekening:

Kosten lokalisatie: $5.000 (vertaling + ontwikkeltijd)
Extra downloads: +10.000 uit nieuwe markten
Conversieratio: 2% naar betaald ($9,99/maand)
Maandelijkse terugkerende omzet: 200 gebruikers × $9,99 = $1.998
Terugverdientijd: 2,5 maanden
Jaarlijkse ROI: 379%

Aan de slag: Je eerste lokalisatie

Hier is een praktisch 2-wekenplan om je eerste gelokaliseerde versie te lanceren:

Week 1: Bereid je codevoorraad voor

Dag 1-2: Controleer alle hardcoded strings Dag 3-4: Externaliseer naar .strings/strings.xml/JSON Dag 5: Implementeer i18n-bibliotheek (als webapp)

Week 2: Vertaal en test

Dag 1-2: Vertaal je strings (begin met Spaans of Chinees—grootste niet-Engelstalige markten) Dag 3-4: Test lay-outs met vertaalde tekst Dag 5: Update App Store-listing in doeltaal

Lancering: Dien in bij App Store/Play Store met nieuwe taal

Conclusie

App-lokalisatie is een van de investeringen met de hoogste ROI die je kunt doen:

  • 🌍 Toegang tot 75% van de gebruikers die je nu mist
  • 💰 26% gemiddelde omzetstijging per nieuwe markt
  • ⭐ Betere beoordelingen (gebruikers houden van apps in hun taal)
  • 🚀 Concurrentievoordeel (de meeste apps zijn niet gelokaliseerd)

Begin klein: Kies één waardevolle markt (Spaans voor VS/LATAM, Japans voor Azië, Duits voor EU) en lokaliseer alleen je kerngebruikersstromen. Je hoeft niet elke string op dag één te vertalen.

Het technische werk is eenvoudig—externaliseer strings, gebruik juiste opmaak-API's, test lay-outs. De vertaling zelf is het makkelijkste deel met moderne AI-tools.

Klaar om wereldwijd te gaan? Begin met het vertalen van je app-strings met AI Trans en breng je eerste gelokaliseerde versie deze maand uit.