Skip to main content

Ghidul complet pentru localizarea aplicațiilor iOS

De la Localizable.strings la metadatele App Store: localizați aplicația iOS cu Xcode, SwiftUI, Fastlane și traducere automată cu IA.

1

Activați localizarea în Xcode

Deschideți setările proiectului Xcode, accesați Info > Localizations și adăugați limbile pentru care doriți să oferiți asistență. Xcode creează automat directoare .lproj pentru fiecare limbă.

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
Localizarea de bază separă interfața de textele sale. Când adăugați o limbă, Xcode vă propune să creeze versiuni localizate ale storyboard-urilor, fișierelor XIB și fișierelor de texte.
2

Creați Localizable.strings

Fișierul standard de localizare iOS folosește perechi cheie-valoare separate prin semne egal, fiecare linie terminându-se cu punct și virgulă. Plasați-l în folderul Base.lproj pentru limba-sursă.

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
Lipsa semnelor punct și virgulă provoacă erori silențioase — fișierul se încarcă fără eroare, dar traducerile sunt goale. De asemenea, asigurați-vă că fișierul este adăugat în etapa de compilare Copy Bundle Resources a țintei, altfel nu va fi inclus în pachetul aplicației.
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

Migrați la String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) reprezintă înlocuitorul modern oferit de Apple pentru fișierele .strings. Acestea oferă un editor vizual în Xcode, extragerea automată a textelor din vizualizările SwiftUI și gestionare integrată a formelor de plural.

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 stochează TOATE limbile într-un singur fișier JSON .xcstrings. În cadrul echipelor, acest lucru înseamnă conflicte frecvente de îmbinare în Git atunci când mai multe persoane adaugă texte. Pentru proiectele mari, luați în considerare câte un catalog pentru fiecare modul.
4

Folosiți texte localizate în SwiftUI și UIKit

Vizualizarea Text din SwiftUI localizează automat literalii de tip șir. UIKit folosește NSLocalizedString. Pentru iOS 16+, API-ul modern String(localized:comment:) oferă o sintaxă mai clară și compatibilitate integrată cu compilatorul.

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)") nu este localizat, fără a afișa vreo eroare, când name este o variabilă String obișnuită. Interpolarea șirurilor din SwiftUI creează o valoare LocalizedStringKey, dar numai anumite tipuri (Int, Double etc.) sunt interpolate corect. Pentru variabile String, folosiți mai întâi String(localized:) pentru a construi șirul localizat.
5

Gestionați formele de plural

iOS folosește fișiere .stringsdict pentru regulile de plural și acceptă toate categoriile CLDR: zero, one, two, few, many, other. String Catalogs gestionează formele de plural printr-un editor vizual în Xcode — mult mai simplu decât scrierea manuală a codului XML 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)
Limbi precum araba au 6 forme de plural, rusa are 3, iar japoneza are una singură. Definiți întotdeauna toate categoriile CLDR necesare limbilor vizate. String Catalogs simplifică acest proces prin editorul vizual pentru formele de plural.
6

Localizați metadatele App Store cu Fastlane

Folosiți instrumentul deliver din Fastlane pentru a păstra metadatele App Store — numele aplicației, subtitlul, descrierea, cuvintele-cheie și notele de versiune — sub controlul versiunilor în depozitul dumneavoastră, ca fișiere text simplu organizate după setările regionale.

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
Localizare încrucișată: App Store din SUA indexează atât cuvintele-cheie în engleză, cât și pe cele în spaniolă. Localizarea metadatelor în spaniolă atrage căutările utilizatorilor hispanici din SUA fără a viza o piață separată.
7

Testați localizarea

Testați conținutul localizat fără a schimba limba dispozitivului. Folosiți suprascrierile schemei Xcode pentru a executa aplicația în orice limbă, previzualizările SwiftUI cu mediul de setări regionale și XCUITest cu argumente de lansare pentru testare automată.

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()
Testați cu germana (textele se extind cu aproximativ 30% față de engleză) și japoneza (textele se restrâng cu aproximativ 50%) pentru a detecta din timp problemele de dispunere. Folosiți pseudolocalizarea din Xcode pentru a supune dispunerile unor teste intensive fără traduceri reale.

Automatizați controlul calității traducerilor

Detectați cheile lipsă, substituenții nevalizi și problemele formelor de plural înainte de lansare cu i18n-validate. Testați interfața cu pseudotraduceri folosind i18n-pseudo înainte de sosirea traducerilor reale.
8

Automatizați traducerile

Traduceți fișierele .strings și .xcstrings, precum și fișierele cu metadate Fastlane, folosind IA. Automatizați traducerea atât a textelor din aplicație, cât și a metadatelor App Store pentru o prezență complet localizată.

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
O prezență localizată în App Store crește descărcările cu peste 30% pe piețele în care nu se vorbește engleza. Traduceți metadatele odată cu textele aplicației — este activitatea de localizare cu cel mai mare randament al investiției.
+

Bonus: revenire inteligentă la alte setări regionale cu LocaleChain

În mod implicit, iOS revine la limba de dezvoltare atunci când setările regionale exacte ale utilizatorului nu sunt disponibile. Un utilizator pt-BR pentru care există numai traduceri pt-PT va vedea engleza în locul portughezei. LocaleChain remediază acest comportament prin lanțuri de revenire configurabile.

LocaleChain este un pachet Swift cu sursă deschisă. Vedeți pe 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"]]
)

Probleme frecvente

Erori de sintaxă în fișierele .strings

Lipsa semnelor punct și virgulă, ghilimelele neprotejate sau codificarea incorectă provoacă erori silențioase. Fișierul se încarcă, dar traducerile apar goale. Validați întotdeauna fișierele .strings înainte de comitere.

Interpolarea Text din SwiftUI nu este localizată

Text("Hello \(stringVar)") nu este localizat conform așteptărilor. Folosiți String(localized:) pentru șirurile calculate sau asigurați-vă că variabilele interpolate au tipul corect pentru LocalizedStringKey.StringInterpolation.

Widgeturile/extensiile afișează cheile brute

Extensiile aplicației au pachete separate. Asigurați-vă că fișierele .strings sau .xcstrings sunt adăugate în etapa Copy Bundle Resources a țintei extensiei, nu doar în cea a aplicației principale.

Traducerile lipsă afișează cheile în producție

Când o cheie nu are o traducere pentru limba utilizatorului, iOS afișează cheia propriu-zisă. Folosiți o strategie de revenire la altă limbă și testați toate setările regionale acceptate înainte de lansare.

Structura recomandată a fișierelor

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

Încercați acum i18n Agent

Plasați aici fișierul de traducere

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

sau faceți clic pentru a-l selecta

Limbi țintă

Nu este necesară înregistrareaEstimare instantanee

Revenirea la alte setări regionale cu ios-localechain

Când lipsește o cheie de traducere dintr-o variantă regională precum de-AT, iOS trece direct la limba de dezvoltare în loc să verifice mai întâi setările regionale părinte 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"],
])

Consultați Ghidul nostru privind revenirea la alte setări regionale pentru lista completă a cadrelor acceptate și a celor 75 de lanțuri integrate. Learn more →

Întrebări frecvente despre localizarea iOS