Skip to main content

Der vollständige Leitfaden zur Lokalisierung von iOS-Apps

Von Localizable.strings bis zu App-Store-Metadaten: Lokalisieren Sie Ihre iOS-App mit Xcode, SwiftUI, Fastlane und automatisierter KI-Übersetzung.

1

Lokalisierung in Xcode aktivieren

Öffnen Sie die Einstellungen Ihres Xcode-Projekts, wählen Sie Info > Localizations und fügen Sie die Sprachen hinzu, die Sie unterstützen möchten. Xcode erstellt automatisch .lproj-Verzeichnisse für jede Sprache.

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
Die Basislokalisierung trennt Ihre Benutzeroberfläche von ihren Zeichenfolgen. Wenn Sie eine Sprache hinzufügen, bietet Xcode an, lokalisierte Versionen Ihrer Storyboards, XIBs und Zeichenfolgendateien zu erstellen.
2

Localizable.strings erstellen

Die Standarddatei für die iOS-Lokalisierung verwendet durch Gleichheitszeichen getrennte Schlüssel-Wert-Paare; jede Zeile endet mit einem Semikolon. Legen Sie sie für die Ausgangssprache in Ihrem Base.lproj-Ordner ab.

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
Fehlende Semikolons verursachen unbemerkte Fehler: Die Datei wird ohne Fehlermeldung geladen, aber die Übersetzungen sind leer. Stellen Sie außerdem sicher, dass die Datei der Build-Phase Copy Bundle Resources Ihres Targets hinzugefügt wurde, sonst wird sie nicht in das App-Bundle aufgenommen.
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

Zu Stringkatalogen migrieren (Xcode 15+)

Stringkataloge (.xcstrings) sind Apples moderner Ersatz für .strings-Dateien. Sie bieten einen visuellen Editor in Xcode, die automatische Extraktion von Zeichenfolgen aus Ihren SwiftUI-Ansichten und integrierte Unterstützung für Pluralformen.

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")
Stringkataloge speichern ALLE Sprachen in einer einzigen .xcstrings-JSON-Datei. In Teams führt dies häufig zu Git-Zusammenführungskonflikten, wenn mehrere Personen Zeichenfolgen hinzufügen. Erwägen Sie bei großen Projekten einen Katalog pro Modul.
4

Lokalisierte Zeichenfolgen in SwiftUI und UIKit verwenden

Die Text-Ansicht von SwiftUI lokalisiert Zeichenfolgenliterale automatisch. UIKit verwendet NSLocalizedString. Ab iOS 16 bietet die moderne API String(localized:comment:) eine übersichtlichere Syntax mit integrierter Compilerunterstützung.

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)") lässt sich unbemerkt nicht lokalisieren, wenn name eine einfache String-Variable ist. Die Zeichenfolgeninterpolation von SwiftUI erzeugt einen LocalizedStringKey, aber nur bestimmte Typen (Int, Double usw.) werden korrekt interpoliert. Erstellen Sie bei String-Variablen die lokalisierte Zeichenfolge zuerst mit String(localized:).
5

Pluralformen verarbeiten

iOS verwendet .stringsdict-Dateien für Pluralregeln und unterstützt alle CLDR-Pluralkategorien: zero, one, two, few, many, other. Stringkataloge verarbeiten Pluralformen mit einem visuellen Editor in Xcode – deutlich einfacher, als stringsdict-XML manuell zu schreiben.

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)
Sprachen wie Arabisch haben sechs Pluralformen, Russisch drei und Japanisch eine. Definieren Sie stets alle CLDR-Kategorien, die Ihre Zielsprachen benötigen. Der visuelle Pluraleditor der Stringkataloge vereinfacht dies.
6

App-Store-Metadaten mit Fastlane lokalisieren

Verwenden Sie das Fastlane-Werkzeug deliver, um App-Store-Metadaten – App-Name, Untertitel, Beschreibung, Schlüsselwörter und Versionshinweise – als nach Locale gegliederte Nur-Text-Dateien mit Versionsverwaltung in Ihrem Repository zu pflegen.

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
Übergreifende Lokalisierung: Der US-amerikanische App Store indexiert sowohl englische als auch spanische Schlüsselwörter. Mit spanischen Metadaten erreichen Sie Suchanfragen hispanischer Personen in den USA, ohne einen eigenen Markt ansprechen zu müssen.
7

Lokalisierung testen

Testen Sie lokalisierte Inhalte, ohne die Gerätesprache zu ändern. Verwenden Sie Schemaüberschreibungen in Xcode, um die App in jeder Sprache auszuführen, SwiftUI-Vorschauen mit Locale-Umgebung und XCUITest mit Startargumenten für automatisierte 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()
Testen Sie mit Deutsch (Zeichenfolgen sind etwa 30 % länger als im Englischen) und Japanisch (etwa 50 % kürzer), um Layoutprobleme frühzeitig zu erkennen. Belastungstesten Sie Layouts ohne echte Übersetzungen mit der Pseudolokalisierung von Xcode.

Übersetzungsqualität automatisieren

Erkennen Sie mit i18n-validate fehlende Schlüssel, beschädigte Platzhalter und Probleme mit Pluralformen vor der Veröffentlichung. Testen Sie Ihre Benutzeroberfläche mit i18n-pseudo und Pseudoübersetzungen, bevor echte Übersetzungen vorliegen.
8

Übersetzungen automatisieren

Übersetzen Sie Ihre .strings-, .xcstrings- und Fastlane-Metadatendateien mit KI. Automatisieren Sie sowohl die Übersetzung der Zeichenfolgen in der App als auch der App-Store-Metadaten für einen vollständig lokalisierten Auftritt.

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
Ein lokalisierter App-Store-Auftritt steigert Downloads in nicht englischsprachigen Märkten um mehr als 30 %. Übersetzen Sie Ihre Metadaten zusammen mit den App-Zeichenfolgen – dies ist die Lokalisierungsmaßnahme mit der höchsten Rendite.
+

Bonus: intelligenter Locale-Fallback mit LocaleChain

Standardmäßig wechselt iOS zur Entwicklungssprache, wenn die genaue Locale einer Person nicht verfügbar ist. Eine Person mit pt-BR sieht bei ausschließlich vorhandenen pt-PT-Übersetzungen Englisch statt Portugiesisch. LocaleChain behebt dies mit konfigurierbaren Fallback-Ketten.

LocaleChain ist ein quelloffenes Swift-Paket. Auf GitHub ansehen

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"]]
)

Häufige Fallstricke

Syntaxfehler in .strings-Dateien

Fehlende Semikolons, nicht maskierte Anführungszeichen oder eine falsche Kodierung führen zu unbemerkten Fehlern. Die Datei wird geladen, doch die Übersetzungen erscheinen leer. Validieren Sie .strings-Dateien stets vor dem Commit.

SwiftUI-Textinterpolation wird nicht lokalisiert

Text("Hello \(stringVar)") wird nicht wie erwartet lokalisiert. Verwenden Sie String(localized:) für berechnete Zeichenfolgen oder stellen Sie sicher, dass interpolierte Variablen den richtigen Typ für LocalizedStringKey.StringInterpolation besitzen.

Widgets/Erweiterungen zeigen unverarbeitete Schlüssel

App-Erweiterungen besitzen separate Bundles. Stellen Sie sicher, dass Ihre .strings- oder .xcstrings-Dateien der Phase Copy Bundle Resources des Erweiterungs-Targets hinzugefügt wurden und nicht nur dem Haupt-App-Target.

Fehlende Übersetzungen zeigen im Produktivbetrieb Schlüssel

Wenn für einen Schlüssel keine Übersetzung in der Sprache der Person vorhanden ist, zeigt iOS den Schlüssel selbst an. Verwenden Sie eine Fallback-Sprachstrategie und testen Sie vor der Veröffentlichung alle unterstützten Locales.

Empfohlene Dateistruktur

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

i18n Agent jetzt testen

Legen Sie Ihre Übersetzungsdatei hier ab

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

oder zum Auswählen klicken

Zielsprachen

Keine Registrierung erforderlichSofortiges Angebot

Locale-Fallback mit ios-localechain

Fehlt ein Übersetzungsschlüssel in einer regionalen Locale wie de-AT, wechselt iOS direkt zur Entwicklungssprache, statt zuerst die übergeordnete Locale de zu prüfen.

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"],
])

In unserem Leitfaden zu Locale-Fallbacks finden Sie die vollständige Liste unterstützter Frameworks und 75 integrierter Ketten. Learn more →

Häufig gestellte Fragen zur iOS-Lokalisierung