Skip to main content

Potpun vodič za lokalizaciju iOS aplikacije

Od Localizable.strings datoteke do App Store metapodataka: lokalizujte iOS aplikaciju pomoću Xcode, SwiftUI, Fastlane i automatizovanog AI prevođenja.

1

Omogućite lokalizaciju u Xcode okruženju

Otvorite podešavanja Xcode projekta, idite na Info > Localizations i dodajte jezike koje želite da podržite. Xcode automatski pravi .lproj direktorijume za svaki jezik.

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
Osnovna lokalizacija razdvaja UI od njegovih tekstova. Kada dodate jezik, Xcode nudi da napravi lokalizovane verzije storyboard, XIB i string datoteka.
2

Napravite Localizable.strings

Standardna iOS datoteka lokalizacije koristi parove ključeva i vrednosti razdvojene znakom jednakosti, a svaki red se završava tačkom i zarezom. Stavite je u fasciklu Base.lproj za izvorni jezik.

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
Nedostajuće tačke i zarezi izazivaju neprimetan otkaz — datoteka se učita bez greške, ali su prevodi prazni. Proverite i da li je datoteka dodata u fazu komponovanja Copy Bundle Resources ciljne aplikacije, inače neće biti uključena u paket aplikacije.
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

Pređite na String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) su savremena Apple zamena za .strings datoteke. Nude vizuelni uređivač u Xcode okruženju, automatsko izdvajanje tekstova iz SwiftUI prikaza i ugrađenu podršku za množinu.

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 čuvaju SVE jezike u jednoj .xcstrings JSON datoteci. U timovima to znači česte Git konflikte spajanja kada više ljudi dodaje tekstove. Za velike projekte razmotrite jedan katalog po modulu.
4

Koristite lokalizovane tekstove u SwiftUI i UIKit okruženju

SwiftUI prikaz Text automatski lokalizuje tekstualne literale. UIKit koristi NSLocalizedString. Za iOS 16+ savremeni API String(localized:comment:) pruža pregledniju sintaksu i ugrađenu podršku kompajlera.

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)") neprimetno ne uspeva da se lokalizuje kada je name obična String promenljiva. SwiftUI interpolacija teksta pravi LocalizedStringKey, ali se samo određeni tipovi (Int, Double i drugi) pravilno interpoliraju. Za String promenljive najpre napravite lokalizovani tekst pomoću String(localized:).
5

Obradite množinu

iOS koristi .stringsdict datoteke za pravila množine i podržava sve CLDR kategorije: zero, one, two, few, many, other. String Catalogs obrađuju množinu vizuelnim uređivačem u Xcode okruženju — mnogo jednostavnije od ručnog pisanja stringsdict XML datoteke.

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)
Jezici kao što je arapski imaju šest oblika množine, ruski tri, a japanski jedan. Uvek definišite sve CLDR kategorije potrebne ciljnim jezicima. String Catalogs to olakšavaju vizuelnim uređivačem množine.
6

Lokalizujte App Store metapodatke pomoću Fastlane

Koristite Fastlane alat deliver da App Store metapodatke — naziv aplikacije, podnaslov, opis, ključne reči i napomene o izdanju — čuvate sa verzijama u repozitorijumu kao obične tekstualne datoteke organizovane po lokalu.

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
Unakrsna lokalizacija: američki App Store indeksira engleske i španske ključne reči. Lokalizacijom metapodataka na španski obuhvatate pretrage hispanoameričkih korisnika u SAD bez ciljanja posebnog tržišta.
7

Testirajte lokalizaciju

Testirajte lokalizovani sadržaj bez promene jezika uređaja. Koristite zamene Xcode šeme da pokrenete aplikaciju na bilo kom jeziku, SwiftUI preglede sa okruženjem lokala i XCUITest sa argumentima pokretanja za automatizovano testiranje.

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()
Testirajte na nemačkom (tekstovi su oko 30% duži od engleskih) i japanskom (tekstovi su oko 50% kraći) da rano otkrijete probleme rasporeda. Koristite Xcode pseudolokalizaciju za testiranje rasporeda bez pravih prevoda.

Automatizujte kvalitet prevoda

Otkrijte nedostajuće ključeve, neispravna mesta za promenljive i probleme množine pomoću i18n-validate pre objavljivanja. Testirajte UI pseudoprevodima pomoću i18n-pseudo pre nego što stignu pravi prevodi.
8

Automatizujte prevode

Prevedite .strings, .xcstrings i Fastlane datoteke metapodataka pomoću AI. Automatizujte prevođenje tekstova u aplikaciji i App Store metapodataka radi potpuno lokalizovanog prisustva.

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
Lokalizovano prisustvo u App Store prodavnici povećava preuzimanja za više od 30% na tržištima van engleskog govornog područja. Prevedite metapodatke zajedno sa tekstovima aplikacije — to je lokalizacija sa najvećim povraćajem ulaganja.
+

Dodatno: pametni rezervni lokal sa LocaleChain

iOS podrazumevano prelazi na razvojni jezik kada tačan lokal korisnika nije dostupan. Korisnik pt-BR lokala koji ima samo pt-PT prevode vidi engleski umesto portugalskog. LocaleChain to ispravlja podesivim lancima rezervnih lokala.

LocaleChain je Swift paket otvorenog koda. Pogledajte na GitHub-u

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

Uobičajene zamke

Sintaksne greške u .strings datoteci

Nedostajuće tačke i zarezi, navodnici bez izlaza ili pogrešno kodiranje izazivaju neprimetan otkaz. Datoteka se učita, ali su prevodi prazni. Uvek proverite .strings datoteke pre commit-a.

SwiftUI interpolacija teksta se ne lokalizuje

Text("Hello \(stringVar)") se ne lokalizuje kako se očekuje. Za izračunate tekstove koristite String(localized:) ili proverite da interpolirane promenljive imaju ispravan tip za LocalizedStringKey.StringInterpolation.

Widget-i i proširenja prikazuju neobrađene ključeve

Proširenja aplikacije imaju zasebne pakete. Proverite da li su .strings ili .xcstrings datoteke dodate fazi Copy Bundle Resources cilja proširenja, a ne samo cilja glavne aplikacije.

Nedostajući prevodi prikazuju ključeve u produkciji

Kada ključ nema prevod za jezik korisnika, iOS prikazuje sam ključ. Koristite strategiju rezervnog jezika i testirajte sve podržane lokale pre izdanja.

Preporučena struktura datoteka

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

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Rezervni lokali sa ios-localechain

Kada u regionalnom lokalu kao što je de-AT nedostaje ključ prevoda, iOS odmah prelazi na razvojni jezik umesto da najpre proveri nadređeni 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"],
])

Pogledajte naš vodič za rezervne lokale za celu listu podržanih sistema i 75 ugrađenih lanaca. Learn more →

Česta pitanja o iOS lokalizaciji