Skip to main content

Pilnīgs iOS lietotņu lokalizācijas ceļvedis

No Localizable.strings līdz App Store metadatiem: lokalizējiet iOS lietotni ar Xcode, SwiftUI, Fastlane un automatizētu MI tulkošanu.

1

Iespējot lokalizāciju Xcode

Atveriet Xcode projekta iestatījumus, pārejiet uz Info > Localizations un pievienojiet valodas, kuras vēlaties atbalstīt. Xcode automātiski izveido .lproj direktoriju katrai valodai.

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
Pamata lokalizācija atdala UI no tā virknēm. Pievienojot valodu, Xcode piedāvā izveidot lokalizētas montāžas paneļu, XIB un virkņu failu versijas.
2

Izveidot Localizable.strings

Standarta iOS lokalizācijas failā tiek izmantoti ar vienādības zīmēm atdalīti atslēgu un vērtību pāri, un katra rinda beidzas ar semikolu. Ievietojiet avota valodas failu Base.lproj mapē.

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
Trūkstošu semikolu dēļ rodas klusas kļūmes — fails tiek ielādēts bez kļūdas, bet tulkojumi ir tukši. Pārliecinieties arī, ka fails ir pievienots mērķa Copy Bundle Resources būvējuma posmam, citādi tas netiks iekļauts lietotnes komplektā.
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

Migrēt uz virkņu katalogiem (Xcode 15+)

Virkņu katalogi (.xcstrings) ir Apple mūsdienīgais .strings failu aizstājējs. Tie piedāvā vizuālu redaktoru Xcode, automātisku virkņu izvilkšanu no SwiftUI skatiem un iebūvētu daudzskaitļa atbalstu.

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")
Virkņu katalogi glabā VISAS valodas vienā .xcstrings JSON failā. Komandās tas nozīmē biežus Git sapludināšanas konfliktus, kad virknes pievieno vairāki cilvēki. Lielos projektos apsveriet vienu katalogu katram modulim.
4

Izmantot lokalizētas virknes SwiftUI un UIKit

SwiftUI skats Text automātiski lokalizē virkņu literāļus. UIKit izmanto NSLocalizedString. iOS 16+ mūsdienīgā String(localized:comment:) API piedāvā skaidrāku sintaksi un iebūvētu kompilatora atbalstu.

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)") lokalizācija klusām neizdodas, ja name ir parasts String mainīgais. SwiftUI virkņu interpolācija izveido LocalizedStringKey, taču pareizi tiek interpolēti tikai noteikti tipi (Int, Double un citi). String mainīgajiem vispirms izveidojiet lokalizēto virkni ar String(localized:).
5

Apstrādāt daudzskaitli

iOS daudzskaitļa kārtulām izmanto .stringsdict failus un atbalsta visas CLDR daudzskaitļa kategorijas: zero, one, two, few, many, other. Virkņu katalogos daudzskaitli pārvalda ar vizuālu Xcode redaktoru — tas ir daudz vienkāršāk nekā rakstīt stringsdict XML ar roku.

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)
Tādās valodās kā arābu ir 6 daudzskaitļa formas, krievu — 3, japāņu — 1. Vienmēr definējiet visas mērķa valodām vajadzīgās CLDR kategorijas. Virkņu katalogu vizuālais daudzskaitļa redaktors to atvieglo.
6

Lokalizēt App Store metadatus ar Fastlane

Ar Fastlane rīku deliver glabājiet App Store metadatus — lietotnes nosaukumu, apakšvirsrakstu, aprakstu, atslēgvārdus un laidiena piezīmes — savā repozitorijā kā vienkārša teksta failus, kas sakārtoti pēc lokalizācijas.

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
Šķērslokalizācija: ASV App Store indeksē gan angļu, gan spāņu atslēgvārdus. Lokalizējot metadatus spāņu valodā, varat aptvert spāniski runājošo ASV lietotāju meklējumus, nemērķējot uz atsevišķu tirgu.
7

Testēt lokalizāciju

Testējiet lokalizēto saturu, nemainot ierīces valodu. Izmantojiet Xcode shēmas pārrakstīšanu, lai palaistu lietotni jebkurā valodā, SwiftUI priekšskatījumus ar lokalizācijas vidi un XCUITest ar palaišanas argumentiem automatizētai testēšanai.

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ējiet vācu valodu (virknes ir par aptuveni 30% garākas nekā angļu) un japāņu valodu (virknes ir par aptuveni 50% īsākas), lai laikus atrastu izkārtojuma problēmas. Izmantojiet Xcode pseidolokalizāciju, lai pārbaudītu izkārtojumus bez īstiem tulkojumiem.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas, bojātos vietturus un daudzskaitļa problēmas. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.
8

Automatizēt tulkošanu

Tulkojiet .strings, .xcstrings un Fastlane metadatu failus ar MI. Automatizējiet gan lietotnes virkņu, gan App Store metadatu tulkošanu, lai nodrošinātu pilnībā lokalizētu klātbūtni.

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
Lokalizēta klātbūtne App Store tirgos, kuros nerunā angliski, palielina lejupielāžu skaitu par vairāk nekā 30%. Tulkojiet metadatus kopā ar lietotnes virknēm — tas ir lokalizācijas darbs ar visaugstāko atdevi.
+

Papildus: vieda lokalizācijas atkāpšanās ar LocaleChain

Pēc noklusējuma iOS atkāpjas uz izstrādes valodu, ja lietotāja precīzā lokalizācija nav pieejama. pt-BR lietotājs, kam ir tikai pt-PT tulkojumi, redz angļu, nevis portugāļu valodu. LocaleChain to novērš ar konfigurējamām atkāpšanās ķēdēm.

LocaleChain ir atvērtā pirmkoda Swift pakotne. Skatīt 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"]]
)

Biežākās kļūdas

.strings faila sintakses kļūdas

Trūkstoši semikoli, neekranētas pēdiņas vai nepareizs kodējums izraisa klusas kļūmes. Fails tiek ielādēts, bet tulkojumi ir tukši. Vienmēr validējiet .strings failus pirms komitēšanas.

SwiftUI Text interpolācija netiek lokalizēta

Text("Hello \(stringVar)") netiek lokalizēts, kā paredzēts. Aprēķinātām virknēm izmantojiet String(localized:) vai pārliecinieties, ka interpolētie mainīgie ir pareizā tipa LocalizedStringKey.StringInterpolation.

Logrīki / paplašinājumi rāda neapstrādātas atslēgas

Lietotņu paplašinājumiem ir atsevišķi komplekti. Pārliecinieties, ka .strings vai .xcstrings faili ir pievienoti paplašinājuma mērķa Copy Bundle Resources posmam, nevis tikai galvenās lietotnes mērķim.

Ja trūkst tulkojuma, produkcijas vidē redzamas atslēgas

Ja atslēgai nav tulkojuma lietotāja valodā, iOS rāda pašu atslēgu. Izmantojiet atkāpšanās valodas stratēģiju un pirms izlaišanas pārbaudiet visas atbalstītās lokalizācijas.

Ieteicamā failu 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

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Lokalizācijas atkāpšanās ar ios-localechain

Ja reģionālajā lokalizācijā, piemēram, de-AT, trūkst tulkojuma atslēgas, iOS uzreiz pāriet uz izstrādes valodu, nevis vispirms pārbauda vecāklokalizāciju 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"],
])

Pilnu atbalstīto sistēmu sarakstu un 75 iebūvētās ķēdes skatiet mūsu lokalizāciju atkāpšanās ceļvedī. Learn more →

Bieži uzdotie jautājumi par iOS lokalizāciju