Skip to main content

Išsamus iOS programų lokalizavimo vadovas

Nuo Localizable.strings iki App Store metaduomenų: lokalizuokite iOS programą naudodami Xcode, SwiftUI, Fastlane ir automatizuotą DI vertimą.

1

Įjungti lokalizavimą Xcode

Atidarykite Xcode projekto nuostatas, eikite į Info > Localizations ir pridėkite norimas palaikyti kalbas. Xcode automatiškai sukuria kiekvienos kalbos .lproj katalogus.

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
Pagrindinis lokalizavimas atskiria UI nuo jo eilučių. Pridėjus kalbą Xcode pasiūlo sukurti lokalizuotas siužetinių linijų, XIB ir eilučių failų versijas.
2

Sukurti Localizable.strings

Standartiniame iOS lokalizavimo faile naudojamos lygybės ženklais atskirtos raktų ir reikšmių poros, o kiekviena eilutė baigiasi kabliataškiu. Įdėkite šaltinio kalbos failą į Base.lproj aplanką.

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
Dėl trūkstamų kabliataškių įvyksta tylios klaidos – failas įkeliamas be klaidos, bet vertimai būna tušti. Taip pat įsitikinkite, kad failas pridėtas prie tikslinio objekto Copy Bundle Resources komponavimo etapo, kitaip jis nebus įtrauktas į programos paketą.
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

Pereiti prie eilučių katalogų (Xcode 15+)

Eilučių katalogai (.xcstrings) yra šiuolaikinė Apple .strings failų alternatyva. Jie suteikia Xcode vaizdinį redaktorių, automatiškai išskiria eilutes iš SwiftUI rodinių ir turi integruotą daugiskaitos palaikymą.

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")
Eilučių katalogai saugo VISAS kalbas viename .xcstrings JSON faile. Komandose tai reiškia dažnus Git sujungimo konfliktus, kai eilutes prideda keli žmonės. Dideliuose projektuose apsvarstykite po vieną katalogą kiekvienam moduliui.
4

Naudoti lokalizuotas eilutes SwiftUI ir UIKit

SwiftUI rodinys Text automatiškai lokalizuoja eilučių literalus. UIKit naudoja NSLocalizedString. iOS 16+ šiuolaikinė String(localized:comment:) API suteikia aiškesnę sintaksę ir integruotą kompiliatoriaus palaikymą.

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)") lokalizavimas tyliai nepavyksta, kai name yra paprastas String kintamasis. SwiftUI eilučių interpoliavimas sukuria LocalizedStringKey, tačiau tinkamai interpoliuojami tik konkretūs tipai (Int, Double ir kiti). String kintamiesiems pirmiausia sukurkite lokalizuotą eilutę naudodami String(localized:).
5

Apdoroti daugiskaitą

iOS daugiskaitos taisyklėms naudoja .stringsdict failus ir palaiko visas CLDR daugiskaitos kategorijas: zero, one, two, few, many, other. Eilučių kataloguose daugiskaita tvarkoma vaizdiniu Xcode redaktoriumi – daug paprasčiau nei rankomis rašyti stringsdict XML.

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)
Tokiose kalbose kaip arabų yra 6 daugiskaitos formos, rusų – 3, japonų – 1. Visada apibrėžkite visas tikslinėms kalboms būtinas CLDR kategorijas. Vaizdinis eilučių katalogų daugiskaitos redaktorius tai palengvina.
6

Lokalizuoti App Store metaduomenis naudojant Fastlane

Naudodami Fastlane įrankį deliver laikykite App Store metaduomenis – programos pavadinimą, paantraštę, aprašą, raktažodžius ir leidimo pastabas – savo saugykloje kaip paprasto teksto failus, sutvarkytus pagal lokalę.

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
Kryžminis lokalizavimas: JAV App Store indeksuoja ir angliškus, ir ispaniškus raktažodžius. Lokalizavę metaduomenis į ispanų kalbą pasieksite JAV ispanakalbių naudotojų paieškas nenutaikydami į atskirą rinką.
7

Išbandyti lokalizavimą

Išbandykite lokalizuotą turinį nekeisdami įrenginio kalbos. Naudokite Xcode schemos keitimus programai bet kuria kalba paleisti, SwiftUI peržiūras su lokalės aplinka ir XCUITest su paleidimo argumentais automatiniam testavimui.

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()
Išbandykite vokiečių (eilutės maždaug 30 % ilgesnės nei anglų) ir japonų (eilutės maždaug 50 % trumpesnės) kalbas, kad anksti aptiktumėte maketo problemas. Naudodami Xcode pseudolokalizavimą atlikite maketų apkrovos bandymą be tikrų vertimų.

Automatizuoti vertimo kokybę

Naudodami i18n-validate prieš išleidimą aptikite trūkstamus raktus, sugadintus vietos rezervavimo ženklus ir daugiskaitos problemas. Kol dar nėra tikrų vertimų, patikrinkite UI su i18n-pseudo pseudoverstimais.
8

Automatizuoti vertimus

Išverskite .strings, .xcstrings ir Fastlane metaduomenų failus naudodami DI. Automatizuokite ir programos eilučių, ir App Store metaduomenų vertimą, kad viskas būtų visiškai lokalizuota.

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
Lokalizuotas App Store puslapis ne anglakalbėse rinkose padidina atsisiuntimų skaičių daugiau nei 30 %. Verskite metaduomenis kartu su programos eilutėmis – tai didžiausią grąžą teikiantis lokalizavimo darbas.
+

Papildomai: išmani atsarginė lokalė su LocaleChain

Pagal numatytąją nuostatą iOS grįžta prie kūrimo kalbos, kai nėra tikslios naudotojo lokalės. pt-BR naudotojas, turintis tik pt-PT vertimus, mato anglų, o ne portugalų kalbą. LocaleChain tai ištaiso konfigūruojamomis atsarginėmis grandinėmis.

LocaleChain yra atvirojo kodo Swift paketas. Peržiūrėti 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"]]
)

Dažnos klaidos

.strings failo sintaksės klaidos

Trūkstami kabliataškiai, neekranizuotos kabutės ar netinkama koduotė sukelia tylias klaidas. Failas įkeliamas, bet vertimai rodomi tušti. Visada patikrinkite .strings failus prieš įtraukdami į saugyklą.

SwiftUI Text interpoliavimas nelokalizuojamas

Text("Hello \(stringVar)") nelokalizuojamas kaip tikėtasi. Apskaičiuotoms eilutėms naudokite String(localized:) arba įsitikinkite, kad interpoliuojami kintamieji yra tinkamo tipo LocalizedStringKey.StringInterpolation.

Valdikliai / plėtiniai rodo neapdorotus raktus

Programų plėtiniai turi atskirus paketus. Įsitikinkite, kad .strings ar .xcstrings failai pridėti prie plėtinio tikslinio objekto Copy Bundle Resources etapo, o ne tik prie pagrindinės programos tikslinio objekto.

Kai nėra vertimo, gamybinėje aplinkoje rodomi raktai

Kai nėra rakto vertimo į naudotojo kalbą, iOS rodo patį raktą. Naudokite atsarginės kalbos strategiją ir prieš išleisdami išbandykite visas palaikomas lokales.

Rekomenduojama failų struktūra

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

Išbandykite i18n Agent dabar

Nuvilkite vertimo failą čia

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

arba spustelėkite norėdami pasirinkti

Tikslinės kalbos

Registruotis nereikiaMomentinis įvertis

Atsarginė lokalė su ios-localechain

Kai regioninėje lokalėje, pavyzdžiui, de-AT, nėra vertimo rakto, iOS iškart pereina prie kūrimo kalbos, užuot pirmiausia patikrinusi pirminę lokalę 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"],
])

Visą palaikomų sistemų sąrašą ir 75 integruotas grandines rasite mūsų atsarginių lokalių vadove. Learn more →

DUK apie iOS lokalizavimą