Skip to main content

De complete handleiding voor lokalisatie van iOS-apps

Van Localizable.strings tot App Store-metadata: lokaliseer je iOS-app met Xcode, SwiftUI, Fastlane en geautomatiseerde AI-vertalingen.

1

Lokalisatie inschakelen in Xcode

Open de projectinstellingen in Xcode, ga naar Info > Localizations en voeg de talen toe die je wilt ondersteunen. Xcode maakt automatisch voor elke taal een .lproj-map aan.

Xcode Project Settings
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.strings
Met basislokalisatie houd je de gebruikersinterface gescheiden van de bijbehorende tekenreeksen. Wanneer je een taal toevoegt, biedt Xcode aan om gelokaliseerde versies van je storyboards, XIBs en tekenreeksbestanden te maken.
2

Localizable.strings maken

Het standaardbestand voor iOS-lokalisatie gebruikt sleutel-waardeparen met een gelijkteken ertussen en een puntkomma aan het einde van elke regel. Plaats het voor de brontaal in de map Base.lproj.

Base.lproj/Localizable.strings
// Base.lproj/Localizable.strings

"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!";    // %@ = string placeholder
"item_count" = "%d items";     // %d = integer placeholder
Ontbrekende puntkomma's veroorzaken stille fouten: het bestand wordt zonder foutmelding geladen, maar de vertalingen blijven leeg. Zorg er ook voor dat het bestand is toegevoegd aan de buildfase Copy Bundle Resources van je target, anders komt het niet in de appbundel terecht.
Common .strings Mistakes
// ❌ Common mistakes in .strings files:

// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"

// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";

// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";
3

Migreren naar String Catalogs (Xcode 15 en hoger)

String Catalogs (.xcstrings) zijn de moderne vervanging van Apple voor .strings-bestanden. Ze bieden een visuele editor in Xcode, halen automatisch tekenreeksen uit je SwiftUI-views en ondersteunen standaard meervoudsvormen.

Localizable.xcstrings
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.

// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")

// Mark strings explicitly:
let title = String(localized: "welcome_title")
String Catalogs slaan ALLE talen op in één .xcstrings-JSON-bestand. In teams leidt dit vaak tot Git-mergeconflicten wanneer meerdere mensen tekenreeksen toevoegen. Overweeg voor grote projecten één catalogus per module.
4

Gelokaliseerde tekenreeksen gebruiken in SwiftUI en UIKit

De Text-weergave van SwiftUI lokaliseert letterlijke tekenreeksen automatisch. UIKit gebruikt NSLocalizedString. Vanaf iOS 16 biedt de moderne API String(localized:comment:) een overzichtelijkere syntaxis met ingebouwde compilerondersteuning.

ContentView.swift
import SwiftUI

struct ContentView: View {
    let userName: String

    var body: some View {
        VStack {
            // ✅ SwiftUI auto-localizes string literals
            Text("welcome_title")

            // ⚠️ This does NOT localize (String interpolation)
            // Text("Hello, \(userName)")

            // ✅ Use String(localized:) for dynamic strings
            Text(String(localized: "greeting \(userName)"))

            // ✅ UIKit style (works everywhere)
            let title = NSLocalizedString(
                "settings_label",
                comment: "Settings screen title"
            )

            // ✅ Modern API (iOS 16+)
            let modern = String(
                localized: "welcome_title",
                comment: "Main screen title"
            )
        }
    }
}
Text("Hello \(name)") wordt stilzwijgend niet gelokaliseerd wanneer name een gewone String-variabele is. Tekenreeksinterpolatie in SwiftUI maakt een LocalizedStringKey, maar alleen specifieke typen (Int, Double enz.) worden correct geïnterpoleerd. Gebruik voor String-variabelen eerst String(localized:) om de gelokaliseerde tekenreeks op te bouwen.
5

Meervoudsvormen verwerken

iOS gebruikt .stringsdict-bestanden voor meervoudsregels en ondersteunt alle CLDR-meervoudscategorieën: zero, one, two, few, many, other. In String Catalogs verwerk je meervoudsvormen met een visuele editor in Xcode, wat veel eenvoudiger is dan zelf stringsdict-XML schrijven.

Localizable.stringsdict
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@count@</string>
        <key>count</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>%d item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
       itemCount)
Talen zoals Arabisch hebben 6 meervoudsvormen, Russisch heeft er 3 en Japans 1. Definieer altijd alle CLDR-categorieën die je doeltalen nodig hebben. String Catalogs maken dit eenvoudiger met hun visuele editor voor meervoudsvormen.
6

App Store-metadata lokaliseren met Fastlane

Gebruik de tool deliver van Fastlane om App Store-metadata, zoals de appnaam, ondertitel, beschrijving, trefwoorden en releaseopmerkingen, als platte tekstbestanden per locale in je repository te bewaren en onder versiebeheer te plaatsen.

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize deliver for App Store metadata
$ fastlane deliver init

# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │   ├── name.txt            # App name (30 chars)
# │   ├── subtitle.txt        # Subtitle (30 chars)
# │   ├── description.txt     # Full description
# │   ├── keywords.txt        # Search keywords (100 chars)
# │   ├── release_notes.txt   # What's New
# │   └── promotional_text.txt
# ├── de-DE/
# │   └── ...
# └── ja/
#     └── ...

# Push metadata to App Store Connect:
$ fastlane deliver
Kruislokalisatie: de Amerikaanse App Store indexeert zowel Engelse als Spaanse trefwoorden. Door je metadata in het Spaans te lokaliseren, bereik je zoekopdrachten van Spaanstalige Amerikaanse gebruikers zonder je op een afzonderlijke markt te richten.
7

Je lokalisatie testen

Test gelokaliseerde inhoud zonder de taal van je apparaat te wijzigen. Gebruik schema-overschrijvingen in Xcode om de app in elke gewenste taal uit te voeren, SwiftUI-previews met een locale-omgeving en XCUITest met startargumenten voor geautomatiseerde tests.

Testing Localization
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language

// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.locale, Locale(identifier: "de"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ja"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ar"))
    }
}

// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()
Test met Duits (tekenreeksen worden circa 30% langer dan in het Engels) en Japans (tekenreeksen worden circa 50% korter) om indelingsproblemen vroeg te ontdekken. Gebruik de pseudolokalisatie van Xcode om indelingen zonder echte vertalingen grondig te testen.

De vertaalkwaliteit automatisch controleren

Spoor met i18n-validate ontbrekende sleutels, defecte plaatsaanduidingen en problemen met meervoudsvormen op voordat ze in een release terechtkomen. Test je gebruikersinterface met pseudovertalingen uit i18n-pseudo voordat de echte vertalingen klaar zijn.
8

Vertalingen automatiseren

Vertaal je .strings-, .xcstrings- en Fastlane-metadatabestanden met AI. Automatiseer zowel de vertaling van tekenreeksen in de app als die van App Store-metadata voor een volledig gelokaliseerde aanwezigheid.

Terminal
# Translate .strings files
> Translate Base.lproj/Localizable.strings
  to Japanese, German, and Spanish

# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
  to de-DE, ja, es-MX

✓ 6 files translated in 3.2s
Een gelokaliseerde aanwezigheid in de App Store verhoogt het aantal downloads in niet-Engelstalige markten met meer dan 30%. Vertaal je metadata tegelijk met de tekenreeksen van je app: dit levert het hoogste rendement op van alle lokalisatiewerkzaamheden.
+

Bonus: slimme terugval voor locales met LocaleChain

Standaard valt iOS terug op je ontwikkeltaal wanneer de exacte locale van een gebruiker niet beschikbaar is. Een gebruiker met pt-BR ziet bij uitsluitend pt-PT-vertalingen dus Engels in plaats van Portugees. LocaleChain lost dit op met configureerbare terugvalketens.

LocaleChain is een opensource-Swift-pakket. Bekijken op GitHub

Package Dependencies
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.git
MyApp.swift
import LocaleChain

// In your App init or AppDelegate:
LocaleChain.configure()  // Activates all default chains

// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English

// Custom overrides for your specific locales:
LocaleChain.configure(
    overrides: ["es-MX": ["es-419", "es"]]
)

Veelvoorkomende valkuilen

Syntaxisfouten in .strings-bestanden

Ontbrekende puntkomma's, aanhalingstekens zonder escapes of een onjuiste codering veroorzaken stille fouten. Het bestand wordt geladen, maar vertalingen blijven leeg. Valideer .strings-bestanden altijd voordat je ze commit.

SwiftUI-tekstinterpolatie wordt niet gelokaliseerd

Text("Hello \(stringVar)") wordt niet gelokaliseerd zoals verwacht. Gebruik String(localized:) voor berekende tekenreeksen of zorg dat geïnterpoleerde variabelen het juiste type voor LocalizedStringKey.StringInterpolation hebben.

Widgets en extensies tonen onbewerkte sleutels

App-extensies hebben afzonderlijke bundels. Zorg ervoor dat je .strings- of .xcstrings-bestanden aan de fase Copy Bundle Resources van de extensietarget zijn toegevoegd en niet alleen aan die van de hoofdapp.

Ontbrekende vertalingen tonen sleutels in productie

Wanneer een sleutel geen vertaling voor de taal van de gebruiker heeft, toont iOS de sleutel zelf. Gebruik een terugvalstrategie voor talen en test vóór de release alle ondersteunde locales.

Aanbevolen bestandsstructuur

Project Structure
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│   ├── Base.lproj/
│   │   ├── Localizable.strings       # Source strings
│   │   └── Localizable.stringsdict   # Plural rules
│   ├── en.lproj/
│   │   └── Localizable.strings
│   ├── de.lproj/
│   │   └── Localizable.strings
│   ├── ja.lproj/
│   │   └── Localizable.strings
│   ├── Localizable.xcstrings          # OR String Catalog
│   └── Info.plist
├── MyAppTests/
├── fastlane/
│   ├── Fastfile
│   └── metadata/
│       ├── en-US/
│       │   ├── name.txt
│       │   ├── description.txt
│       │   └── keywords.txt
│       ├── de-DE/
│       └── ja/
└── Package.swift

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

JSON, YAML, PO, XML, CSV, Markdown, Properties

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

Terugval voor locales met ios-localechain

Wanneer een vertaalsleutel ontbreekt in een regionale locale zoals de-AT, springt iOS rechtstreeks naar de ontwikkeltaal in plaats van eerst de bovenliggende locale de te controleren.

Terminal
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechain
Configuration
import LocaleChain

LocaleChain.configure(overrides: [
    "de": ["en-GB", "en"],
    "pt-BR": ["pt", "en"],
    "zh-Hant-HK": ["zh-Hant", "zh", "en"],
])

Bekijk onze handleiding over terugval voor locales voor de volledige lijst met ondersteunde frameworks en 75 ingebouwde ketens. Learn more →

Veelgestelde vragen over iOS-lokalisatie