Globalisering: wat is het, i18n en meertaligheid in apps

Auteur: IT Sectr Gepubliceerd: 2026-02-26 Leestijd: 8 min

Globalisering (globalisering, ook internationalisering, i18n) — het proces van het voorbereiden van een mobiele app voor meerdere talen en regionale formaten zonder de broncode te wijzigen. Omvat het uittrekken van tekstbronnen uit code, ondersteuning voor verschillende datum-, getal- en valutaformaten, rekening houden met tekstrichting (LTR/RTL) en aanpassen van de layout voor verschillende talen. In iOS worden NSLocalizedString en Localizable.strings gebruikt, in Android — strings.xml in mappen values-{lang}. Meer in Apple-documentatie over internationalisering.

Belangrijkste

  • Globalisering (i18n) — voorbereiding van app-code voor meerdere talen en regio's
  • NSLocalizedString — Swift-macro voor het ophalen van vertaalde strings uit Localizable.strings
  • strings.xml — Android XML-bestand waarin tekstbronnen voor elke taal worden opgeslagen
  • RTL — ondersteuning voor talen van rechts naar links (Arabisch, Hebreeuws, Urdu)
  • Formaten — datums, getallen en valuta's moeten worden geformatteerd via Locale-afhankelijke API's

Wat is globalisering (i18n) en waarom is het nodig?

Globalisering (afgekort i18n — 18 letters tussen «i» en «n») — architectonische voorbereiding van de app voor elke taal en regio. De hoofdregel van i18n: geen enkele tekststring mag hardcoded in de broncode staan. In plaats daarvan worden strings naar resourcebestanden verplaatst en de code benadert ze via sleutels. Bij het toevoegen van een nieuwe taal volstaat het om een vertaalbestand toe te voegen — de code blijft ongewijzigd. Dit onderscheidt i18n van lokalisatie (l10n), waar de strings zelf worden vertaald.

Zakelijk argument — globalisering vergroot de markt. Volgens Common Sense Advisory (2023) geeft meer dan 70% van de gebruikers de voorkeur aan kopen in apps in hun moedertaal. Lokalisatie in 10 talen vergroot het potentiële publiek met 80%. Zonder i18n vereist elke uitbreiding naar een nieuwe taal codeaanpassingen, wat de marktintroductie vertraagt en de kosten 5–10 keer verhoogt. Een goede i18n-architectuur maakt ondersteuning van 40+ talen mogelijk met minimale kosten.

i18n-componenten omvatten: stringexternalisatie (String externalization), meervoudsvormen (pluralization voor 1/2/5+), datum- en getalopmaak (DateFormatter/SimpleDateFormat), ondersteuning voor RTL-talen (Right-to-Left), sorteren volgens locale-regels (Collator), regionale symbolen (duizendscheidingstekens, decimale tekens). Bij IT Sectr bouwen we i18n in tijdens de architectuurfase, niet achteraf — dit bespaart tot 60% tijd bij latere lokalisatie.

Internationalisering in iOS: NSLocalizedString en XLIFF

NSLocalizedString — de belangrijkste Swift-macro voor het werken met vertalingen. Formaat: NSLocalizedString(«key», comment: «beschrijving voor vertaler»). De macro vervangt automatisch de string uit Localizable.strings voor de huidige locale van het apparaat (NSLocale.preferredLanguages). Als er geen vertaling voor de sleutel wordt gevonden, wordt de sleutel zelf of de waarde in de development language (meestal en) geretourneerd. Apple raadt aan om betekenisvolle sleutels te gebruiken, niet Engelse strings als sleutels.

swift
// Localizable.strings (en)
// "welcome_title" = "Welkom!";
// Localizable.strings (ru)
// "welcome_title" = "Welkom!";

// Swift-code — uniform voor alle talen
titleLabel.text = NSLocalizedString(
    "welcome_title",
    comment: "Titel van het welkomstscherm"
)

// Meervoudsvormen via Localizable.stringsdict
// 
// <dict>
//     <key>items_count</key>
//     <dict>
//         <key>NSStringLocalizedFormatKey</key>
//         <string>%#@items@</string>
//         <key>items</key>
//         <dict>
//             <key>one</key>
//             <string>%d product</string>
//             <key>few</key>
//             <string>%d producten</string>
//             <key>many</key>
//             <string>%d producten</string>
//         </dict>
//     </dict>
// </dict>

// Gebruik van meervoudsvormen
let items = 5
let label = String.localizedStringWithFormat(
    NSLocalizedString("items_count", comment: ""), items
)

XLIFF — uitwisselingsformaat voor vertalingen tussen ontwikkelaars en vertalers. Xcode exporteert een XLIFF-bestand (Editor → Export for Localization) dat alle te vertalen strings bevat. De vertaler werkt met XLIFF in CAT-tools (Trados, memoQ, Smartcat). Na vertaling wordt XLIFF terug geïmporteerd in Xcode (Editor → Import Localizations). XLIFF werkt automatisch alle .lproj-mappen bij. Dit is de standaardwerkstroom voor lokalisatie van iOS-apps in productie.

SwiftUI en i18n

SwiftUI werkt met NSLocalizedString via de inititialisator Text. Tekst in SwiftUI is automatisch geïnternationaliseerd: Text(«welcome_title») zoekt net als NSLocalizedString naar een vertaling in Localizable.strings. Voor meervoudsvormen gebruikt u Text(«%d items», count: items). SwiftUI ondersteunt datumnotatie via Text(date, style: .date) — het gebruikt automatisch Locale.current. Apple raadt SwiftUI aan voor nieuwe projecten, omdat internationalisering er transparanter is.

Internationalisering in Android: strings.xml en RTL

Android i18n is gebaseerd op het resourcesysteem. Strings worden geplaatst in res/values/strings.xml voor de standaardtaal (meestal Engels). Voor elke taal wordt een aparte map aangemaakt: res/values-ru/strings.xml (Russisch), res/values-de/strings.xml (Duits), res/values-fr/strings.xml (Frans). Android selecteert automatisch strings op basis van de systeemtaal van het apparaat (Locale.getDefault()). Als er geen exacte locale is, wordt de basisversie (values/strings.xml) gebruikt.

kotlin
// res/values/strings.xml (Engels, standaard)
<resources>
    <string name="welcome_title">Welcome!</string>
    <string name="items_count">%d item(s)</string>
</resources>

// res/values-ru/strings.xml (Russisch)
<resources>
    <string name="welcome_title">Welkom!</string>
    <plurals name="items_count">
        <item quantity="one">%d product</item>
        <item quantity="few">%d producten</item>
        <item quantity="many">%d producten</item>
    </plurals>
</resources>

// Kotlin-code
textView.text = getString(R.string.welcome_title)

// Meervoudsvormen
val items = 5
textView.text = resources.getQuantityString(
    R.plurals.items_count, items, items
)

// RTL-ondersteuning in code
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"

RTL (Right-to-Left) — ondersteuning voor talen waarbij tekst van rechts naar links wordt gelezen (Arabisch, Hebreeuws, Urdu, Perzisch). Android ondersteunt RTL via de attributen android:layoutDirection en android:textDirection. Stel in het manifest android:supportsRtl="true" in — en Android spiegelt automatisch de layout. NavDrawer, terug/vooruit-pictogrammen, tekstuitlijning moeten in beide richtingen werken. Gebruik in code View.LAYOUT_DIRECTION_LOCALE en Gravity.START/END in plaats van LEFT/RIGHT.

Gelokaliseerde bronnen

Android Resource Qualifiers maken het mogelijk niet alleen strings te lokaliseren, maar ook afbeeldingen (res/drawable-ru/), layouts (res/layout-ru/), animaties, kleuren. Voor Arabisch en Hebreeuws zijn aparte layouts met gespiegelde elementen nodig — gebruik res/layout-ar/ (Arabisch). Android ondersteunt ook regionale varianten: values-rUS, values-rGB, values-de-DE. Qualifiers worden gecombineerd: values-ldrtl-ru — Russisch voor RTL-schermen.

Regionale formaten: datums, getallen, valuta in iOS en Android

Datum en tijd — een van de belangrijkste aspecten van i18n. Verschillende regio's gebruiken verschillende formaten: Rusland — DD.MM.JJJJ, VS — MM/DD/JJJJ, Japan — JJJJ.MM.DD. Het gebruik van een vast formaat (yyyy-MM-dd) voor weergave aan de gebruiker is een fout. Gebruik in iOS DateFormatter met Locale(identifier: locale), in Android — DateFormat.getDateInstance(DateFormat.SHORT, locale). Voor spraakassistenten en AI-zoekopdrachten moeten datums intern in ISO 8601 zijn.

Getallen en valuta — verschillende regio's gebruiken verschillende scheidingstekens: 1,234.56 (VS) vs 1.234,56 (Rusland), 1 234,56 (Frankrijk). iOS: NumberFormatter met .locale = locale. Android: DecimalFormat met DecimalFormatSymbols(locale). Voor valuta: formaat ¥1,234 (Japan) vs $1,234.56 (VS) vs 1 234,56 ₽ (Rusland). Voeg nooit handmatig valuta en getallen samen — gebruik NumberFormatter.currencyCode en .currencySymbol.

RegioDatumGetalValuta
Rusland31.12.20241 234,561 234,56 ₽
VS12/31/20241,234.56$1,234.56
Duitsland31.12.20241.234,561.234,56 €
Japan2024/12/311,234¥1,234
Saoedi-Arabië31/12/20241,234.561,234.56 SAR

Sorteren (Collation) — alfabetisch sorteren verschilt per taal. In het Spaans komt «ch» na «c». In het Zweeds staat «ä» aan het einde van het alfabet. In het Duits wordt «ß» gesorteerd als «ss». iOS: LocalizedComparison (String.localizedCompare). Android: Collator.getInstance(locale). Gebruik nooit compareTo() voor strings die aan de gebruiker worden getoond — het gebruikt Unicode Code Point order, dat geen rekening houdt met regionale regels.

Beste praktijken voor internationalisering van mobiele apps

Architectonische principes — begin met i18n vanaf de eerste commit. Elke string in de code moet door een wrapper-functie (tr("key")) gaan, die niet bestaat voordat i18n is ingesteld — dit dwingt de ontwikkelaar om strings meteen te externaliseren. Gebruik geen Engelse strings als sleutels — als de formulering in het Engels verandert, moeten alle vertalingen worden bijgewerkt. Gebruik betekenisvolle sleutels: «profile.title», «settings.language.label».

Pseudolokalisatie — techniek om i18n te testen vóór daadwerkelijke vertaling. Vervang elke Latijnse letter door diakritische tekens (á, é, ñ, ü) om de codering te controleren, voeg een voorvoegsel [XXX] toe om afkapping van strings te controleren. Xcode: startschema's — pseudotaal «Double-Length Pseudolanguage». Android: Developer Options — Force RTL layout direction, System font scale tot 200%. Pseudolokalisatie vindt 80% van de i18n-problemen zonder tussenkomst van een vertaler.

IT Sectr i18n-checklist — vóór release controleren we: (1) geen hardcoded strings in code (uitzondering: logs), (2) meervoudsvormen werken correct voor alle talen, (3) datums/getallen worden geformatteerd via Locale API, (4) layout wordt correct weergegeven in RTL-talen, (5) strings worden niet afgekapt bij maximale schaling, (6) pseudolokalisatie heeft geen fouten gevonden, (7) alle talen die in de stores zijn aangegeven, hebben een volledige set vertalingen.

Veelgestelde vragen

Wat is het verschil tussen i18n en l10n?

i18n (internationalisering) — voorbereiding van code: externaliseren van strings, RTL-ondersteuning, formattering. Wordt eenmalig door de ontwikkelaar gedaan. l10n (lokalisatie) — vertalen van strings naar een specifieke taal. Wordt meerdere keren door de vertaler gedaan voor elke lokalisatie. i18n — architectuur, l10n — inhoud. Zonder i18n is lokalisatie in principe onmogelijk.

Hoe werkt NSLocalizedString in Swift?

NSLocalizedString — een macro die de waarde opzoekt via een sleutel in Localizable.strings voor de huidige locale van het apparaat. Als de vertaling wordt gevonden — retourneert het deze. Zo niet — retourneert het de sleutel. Formaat: NSLocalizedString(«key», comment: «beschrijving»). Voor formattering met parameters gebruikt u String.localizedStringWithFormat().

Hoe zijn strings.xml in Android georganiseerd?

strings.xml — bestand met vertalingen in de map res/values/{lang}/. Basisversie in values/strings.xml, vertalingen — in values-ru/strings.xml. Code benadert via getString(R.string.key). Android kiest zelf het benodigde bestand op basis van de systeemtaal. Voor meervoudsvormen wordt de bron <plurals> gebruikt met specificaties zero/one/few/many/other.

Wat is RTL in de context van i18n?

RTL (Right-to-Left) — schrijfrichting voor Arabisch, Hebreeuws, Urdu, Perzisch. Android: supportsRtl="true" in manifest, android:layoutDirection, Gravity.START/END. iOS: UISemanticContentAttribute.forceLeftToRight voor gedwongen RTL. De layout moet worden gespiegeld: menu rechts, tekst — van rechts naar links, navigatiepictogrammen — omgekeerd.

Welke talen zijn verplicht voor publicatie?

Voor wereldwijde publicatie minimale set: Engels, Spaans, Frans, Duits, Japans, Chinees, Koreaans, Portugees, Russisch, Italiaans. App Store vereist ten minste Engelse lokalisatie. Elke extra lokalisatie vergroot het potentiële publiek. Voor de lokale markt zijn 1–2 talen voldoende.

Samenvatting

  • Globalisering (i18n) — architectonische voorbereiding van de app voor meerdere talen en regio's
  • NSLocalizedString — Swift-macro voor het vertalen van strings via Localizable.strings + XLIFF-export
  • strings.xml — Android-bron met vertalingen in mappen values-{lang}
  • RTL — verplichte ondersteuning voor Arabisch, Hebreeuws, Urdu en Perzisch
  • Formaten — datums en getallen worden strikt via Locale API geformatteerd, niet handmatig
  • Meervoudsvormen — iOS: stringsdict, Android: <plurals> met zes kwantiteitsvormen
  • Pseudolokalisatie — techniek om i18n te testen vóór vertaling (detecteert 80% van problemen)

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook