Skip to main content

Kompletný sprievodca lokalizáciou aplikácií pre iOS

Od Localizable.strings po metadáta App Store: lokalizujte svoju aplikáciu pre iOS pomocou Xcode, SwiftUI, Fastlane a automatizovaného prekladu s využitím AI.

1

Povoľte lokalizáciu v Xcode

Otvorte nastavenia svojho projektu Xcode, prejdite do časti Info > Localizations a pridajte jazyky, ktoré chcete podporovať. Xcode automaticky vytvorí priečinky .lproj pre 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
Základná lokalizácia oddeľuje Vaše používateľské rozhranie od jeho textových reťazcov. Keď pridáte jazyk, Xcode ponúkne vytvorenie lokalizovaných verzií Vašich storyboardov, súborov XIB a súborov s reťazcami.
2

Vytvorte Localizable.strings

Štandardný lokalizačný súbor systému iOS používa páry kľúčov a hodnôt oddelené znamienkami rovnosti, pričom každý riadok sa končí bodkočiarkou. Pre zdrojový jazyk ho umiestnite do zložky 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
Chýbajúce bodkočiarky spôsobujú zlyhania bez upozornenia — súbor sa načíta bez chyby, ale preklady zostanú prázdne. Skontrolujte tiež, či je súbor pridaný do fázy zostavenia Copy Bundle Resources Vášho cieľa, inak sa nezahrnie do balíka aplikácie.
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

Prejdite na String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) predstavujú modernú náhradu súborov .strings od spoločnosti Apple. Ponúkajú vizuálny editor v Xcode, automatické získavanie reťazcov z Vašich zobrazení SwiftUI a vstavanú podporu množného čísla.

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 ukladajú VŠETKY jazyky do jedného súboru JSON .xcstrings. V tímoch to znamená časté konflikty pri zlučovaní v Gite, keď reťazce pridáva viacero ľudí. Pri veľkých projektoch zvážte samostatný katalóg pre každý modul.
4

Používajte lokalizované reťazce v SwiftUI a UIKit

Zobrazenie Text v SwiftUI automaticky lokalizuje reťazcové literály. UIKit používa NSLocalizedString. V systéme iOS 16+ poskytuje moderné API String(localized:comment:) prehľadnejšiu syntax so vstavanou podporou kompilátora.

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)") sa bez upozornenia nelokalizuje, keď je name obyčajná premenná typu String. Interpolácia reťazcov v SwiftUI vytvorí LocalizedStringKey, ale správne interpoluje iba určité typy (Int, Double atď.). Pri premenných typu String najprv vytvorte lokalizovaný reťazec pomocou String(localized:).
5

Spracujte množné číslo

iOS používa súbory .stringsdict pre pravidlá množného čísla a podporuje všetky kategórie množného čísla CLDR: zero, one, two, few, many, other. String Catalogs spracúvajú množné číslo pomocou vizuálneho editora v Xcode — je to oveľa jednoduchšie než ručné písanie XML súborov stringsdict.

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 ako arabčina majú 6 tvarov množného čísla, ruština 3 a japončina 1. Vždy definujte všetky kategórie CLDR, ktoré Vaše cieľové jazyky potrebujú. String Catalogs to zjednodušujú pomocou vizuálneho editora množného čísla.
6

Lokalizujte metadáta App Store pomocou Fastlane

Pomocou nástroja deliver zo sady Fastlane uchovávajte metadáta App Store — názov aplikácie, podnadpis, opis, kľúčové slová a poznámky k vydaniu — vo svojom úložisku so správou verzií ako obyčajné textové súbory usporiadané podľa miestneho nastavenia.

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
Krížová lokalizácia: App Store v USA indexuje anglické aj španielske kľúčové slová. Lokalizáciou metadát do španielčiny zachytíte vyhľadávania hispánskych používateľov v USA bez toho, aby ste museli cieliť na samostatný trh.
7

Otestujte svoju lokalizáciu

Testujte lokalizovaný obsah bez zmeny jazyka zariadenia. Pomocou prepísaní schémy Xcode spúšťajte aplikáciu v ľubovoľnom jazyku, používajte náhľady SwiftUI s prostredím miestneho nastavenia a XCUITest s argumentmi spustenia na automatizované testovanie.

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 nemčinou (reťazce sa v porovnaní s angličtinou predĺžia približne o 30 %) a japončinou (reťazce sa skrátia približne o 50 %), aby ste včas odhalili problémy s rozložením. Pomocou pseudolokalizácie v Xcode záťažovo otestujte rozloženia bez skutočných prekladov.

Automatizujte kontrolu kvality prekladov

Pomocou i18n-validate zachyťte chýbajúce kľúče, poškodené zástupné symboly a problémy s množným číslom ešte pred vydaním. Pred doručením skutočných prekladov otestujte svoje používateľské rozhranie pomocou pseudoprekladov vytvorených nástrojom i18n-pseudo.
8

Automatizujte preklady

Prekladajte svoje súbory .strings, .xcstrings a súbory metadát Fastlane pomocou AI. Automatizujte preklad reťazcov v aplikácii aj metadát App Store a zabezpečte tak úplne lokalizovanú prezentáciu.

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á prezentácia v App Store zvyšuje počet stiahnutí na neanglicky hovoriacich trhoch o viac ako 30 %. Prekladajte metadáta spolu s reťazcami aplikácie — ide o lokalizáciu s najvyššou návratnosťou investícií, akú môžete vykonať.
+

Bonus: inteligentný záložný výber miestneho nastavenia pomocou LocaleChain

Keď presné miestne nastavenie používateľa nie je predvolene dostupné, iOS použije Váš vývojový jazyk. Používateľ s miestnym nastavením pt-BR, pre ktorého sú k dispozícii iba preklady pt-PT, tak uvidí namiesto portugalčiny angličtinu. LocaleChain tento problém rieši pomocou konfigurovateľných reťazcov záložných miestnych nastavení.

LocaleChain je balík Swift s otvoreným zdrojovým kódom. Zobraziť na GitHube

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

Bežné úskalia

Syntaktické chyby v súboroch .strings

Chýbajúce bodkočiarky, úvodzovky neošetrené únikovými znakmi alebo nesprávne kódovanie spôsobujú zlyhania bez upozornenia. Súbor sa načíta, ale preklady zostanú prázdne. Pred odovzdaním zmien vždy overte súbory .strings.

Interpolácia Text v SwiftUI sa nelokalizuje

Text("Hello \(stringVar)") sa nelokalizuje podľa očakávania. Pri vypočítaných reťazcoch použite String(localized:) alebo skontrolujte, či majú interpolované premenné správny typ pre LocalizedStringKey.StringInterpolation.

Widgety a rozšírenia zobrazujú nespracované kľúče

Rozšírenia aplikácie majú samostatné balíky. Skontrolujte, či sú Vaše súbory .strings alebo .xcstrings pridané do fázy Copy Bundle Resources cieľa rozšírenia, nielen do cieľa hlavnej aplikácie.

Chýbajúce preklady zobrazujú v produkcii kľúče

Keď kľúč nemá preklad do jazyka používateľa, iOS zobrazí samotný kľúč. Používajte stratégiu záložného jazyka a pred vydaním otestujte všetky podporované miestne nastavenia.

Odporúčaná štruktúra súborov

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

Vyskúšajte i18n Agent teraz

Potiahnite súbor na preklad sem

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

alebo kliknite a vyberte súbor

Cieľové jazyky

Bez registrácieOkamžitý odhad

Záložný výber miestneho nastavenia pomocou ios-localechain

Keď v regionálnom miestnom nastavení, ako je de-AT, chýba kľúč prekladu, iOS prejde priamo na vývojový jazyk namiesto toho, aby najprv skontroloval nadradené miestne nastavenie 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"],
])

Úplný zoznam podporovaných rámcov a 75 vstavaných reťazcov nájdete v našom sprievodcovi záložným výberom miestneho nastavenia. Learn more →

Časté otázky o lokalizácii pre iOS