Skip to main content

Kompletní průvodce lokalizací iOS aplikací

Od Localizable.strings po metadata v App Store: lokalizujte svou iOS aplikaci pomocí Xcode, SwiftUI, Fastlane a automatizovaného AI překladu.

1

Zapnout lokalizaci v Xcode

Otevřete nastavení projektu v Xcode, přejděte na Info > Localizations a přidejte jazyky, které chcete podporovat. Xcode automaticky vytvoří adresáře .lproj pro každý jazyk.

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
Base localization odděluje Vaše UI od textů. Když přidáte jazyk, Xcode nabídne vytvoření lokalizovaných verzí storyboardů, XIBů a souborů se stringy.
2

Vytvořit Localizable.strings

Standardní soubor pro lokalizaci v iOS používá dvojice klíč–hodnota oddělené rovnítkem a každý řádek končí středníkem. Umístěte jej do složky Base.lproj pro zdrojový jazyk.

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
Chybějící středníky způsobují tiché chyby — soubor se načte bez chyby, ale překlady jsou prázdné. Zároveň se ujistěte, že je soubor přidán do build fáze Copy Bundle Resources příslušného targetu, jinak nebude zahrnut do balíčku aplikace.
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

Migrovat na String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) jsou moderní náhradou od Apple za soubory .strings. Nabízejí vizuální editor v Xcode, automatickou extrakci řetězců z Vašich SwiftUI views a vestavěnou podporu množných tvarů.

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 ukládají VŠECHNY jazyky do jednoho JSON souboru .xcstrings. V týmech to znamená časté Git merge konflikty, když více lidí přidává řetězce. U velkých projektů zvažte jeden katalog na modul.
4

Používat lokalizované řetězce ve SwiftUI a UIKit

Text ve SwiftUI automaticky lokalizuje string literály. UIKit používá NSLocalizedString. Pro iOS 16+ poskytuje moderní API String(localized:comment:) čistší syntaxi s vestavěnou podporou na úrovni kompilátoru.

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)") se tiše nelokalizuje, když je name obyčejná proměnná typu String. String interpolace ve SwiftUI vytvoří LocalizedStringKey, ale správně se interpolují jen některé typy (Int, Double atd.). Pro proměnné typu String nejdřív sestavte lokalizovaný řetězec pomocí String(localized:).
5

Řešit množné tvary

iOS používá pro pravidla množných tvarů soubory .stringsdict a podporuje všechny kategorie množného čísla dle CLDR: zero, one, two, few, many, other. String Catalogs řeší množné tvary přes vizuální editor v Xcode — je to výrazně jednodušší než psát XML stringsdict ručně.

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)
Jazyky jako arabština mají 6 tvarů, ruština 3 a japonština 1. Vždy definujte všechny kategorie CLDR, které Vaše cílové jazyky potřebují. String Catalogs to usnadňují vizuálním editorem množných tvarů.
6

Lokalizovat metadata v App Store pomocí Fastlane

Použijte nástroj deliver z Fastlane, abyste měli metadata v App Store — název aplikace, podtitul, popis, klíčová slova, poznámky k vydání — pod správou verzí ve Vašem repozitáři jako prosté textové soubory uspořádané podle locale.

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
Cross-localization: App Store v USA indexuje klíčová slova v angličtině i španělštině. Lokalizací metadat do španělštiny zachytíte vyhledávání hispánských uživatelů v USA, aniž byste cílili na samostatný trh.
7

Otestovat lokalizaci

Testujte lokalizovaný obsah, aniž byste měnili jazyk zařízení. Použijte Xcode scheme overrides ke spuštění aplikace v libovolném jazyce, SwiftUI previews s locale environment a XCUITest s launch arguments pro automatizované testování.

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()
Testujte s němčinou (řetězce se oproti angličtině rozšíří přibližně o 30 %) a japonštinou (řetězce se zkrátí přibližně o 50 %), abyste včas odhalili problémy s rozložením. Použijte pseudolokalizaci v Xcode ke stresovému testování layoutů bez skutečných překladů.

Automatizovat kontrolu kvality překladu

Odhalte chybějící klíče, rozbité placeholdery a problémy s množnými tvary dřív, než se dostanou do produkce, pomocí i18n-validate. Otestujte UI s pseudopřeklady pomocí i18n-pseudo ještě předtím, než dorazí skutečné překlady.
8

Automatizovat překlady

Přeložte své soubory .strings, .xcstrings a soubory metadat Fastlane pomocí AI. Automatizujte překlad jak řetězců v aplikaci, tak metadat v App Store, abyste měli plně lokalizovanou prezentaci.

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
Lokalizovaná prezentace v App Store zvyšuje počet stažení o 30%+ na neanglických trzích. Přeložte metadata spolu s řetězci v aplikaci — jde o lokalizaci s nejvyšším ROI, kterou můžete udělat.
+

Bonus: Chytré řetězce záložních locale s LocaleChain

Ve výchozím nastavení iOS při nedostupnosti přesného locale uživatele přejde na vývojový jazyk. Uživatel pt-BR, pro kterého máte jen překlady pt-PT, tak uvidí angličtinu místo portugalštiny. LocaleChain to řeší konfigurovatelnými fallback řetězci.

LocaleChain je open-source Swift balíček. Zobrazit na GitHubu

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

Častá úskalí

Chyby syntaxe souboru .strings

Chybějící středníky, neescapované uvozovky nebo nesprávné kódování způsobují tiché chyby. Soubor se načte, ale překlady se zobrazí prázdné. Před commitem vždy validujte soubory .strings.

Interpolace v Text ve SwiftUI se nelokalizuje

Text("Hello \(stringVar)") se nelokalizuje podle očekávání. Pro vypočítané řetězce použijte String(localized:) nebo zajistěte, že interpolované proměnné mají správný typ pro LocalizedStringKey.StringInterpolation.

Widgety/rozšíření zobrazují nezpracované klíče

Rozšíření aplikace mají samostatné bundly. Ujistěte se, že jsou soubory .strings nebo .xcstrings přidány do fáze Copy Bundle Resources targetu rozšíření, ne jen do targetu hlavní aplikace.

Chybějící překlady v produkci zobrazují klíče

Když klíč nemá překlad pro jazyk uživatele, iOS zobrazí samotný klíč. Použijte strategii záložního jazyka a před vydáním otestujte všechna podporovaná locale.

Doporučená struktura souborů

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

Vyzkoušejte i18n Agent nyní

Sem přetáhněte svůj překladový soubor

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

nebo klikněte a vyberte soubor

Cílové jazyky

Bez registraceOkamžitý odhad

Fallback locale s ios-localechain

Když chybí překladový klíč v regionálním locale, jako je de-AT, iOS skočí rovnou na vývojový jazyk místo toho, aby nejdřív zkontroloval nadřazené locale de.

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

Podívejte se na náš Locale Fallback Guide, kde najdete úplný seznam podporovaných frameworků a 75 vestavěných řetězců. Learn more →

FAQ k lokalizaci iOS