Skip to main content

Potpun vodič za lokalizaciju iOS aplikacije

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

1

Omogućite lokalizaciju u Xcode okruženju

Otvorite postavke projekta Xcode, idite na Info > Localizations i dodajte jezike koje želite podržavati. Xcode automatski stvara direktorije .lproj 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 odvaja korisničko sučelje od njegovih nizova. Kada dodate jezik, Xcode nudi izradu lokaliziranih inačica Vaših storyboardova te datoteka XIB i nizova.
2

Napravite Localizable.strings

Standardna lokalizacijska datoteka iOS-a upotrebljava parove ključeva i vrijednosti odvojene znakom jednakosti, a svaki redak završava točkom sa zarezom. Smjestite je u mapu Base.lproj izvornog jezika.

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
Točke sa zarezom koje nedostaju uzrokuju tihi neuspjeh — datoteka se učita bez pogreške, ali prijevodi ostaju prazni. Provjerite i je li datoteka dodana u fazu izgradnje Copy Bundle Resources cilja jer 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

Prijeđite na String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) Appleova su suvremena zamjena za datoteke .strings. Nude vizualni uređivač u Xcodeu, automatsko izdvajanje nizova iz SwiftUI prikaza i ugrađenu podršku za oblike množine.

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 pohranjuju SVE jezike u jednoj JSON datoteci .xcstrings. U timovima to znači česte Git sukobe pri spajanju kada više osoba dodaje nizove. Za velike projekte razmotrite zaseban katalog za svaki modul.
4

Koristite lokalizirane tekstove u SwiftUI i UIKit okruženju

Prikaz Text u SwiftUI-ju automatski lokalizira literale nizova. UIKit upotrebljava NSLocalizedString. Za iOS 16+ suvremeni API String(localized:comment:) pruža čišću sintaksu i ugrađenu podršku prevoditelja.

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)") neprimjetno se ne lokalizira kada je name obična varijabla String. Interpolacija nizova u SwiftUI-ju stvara LocalizedStringKey, ali se ispravno interpoliraju samo određeni tipovi (Int, Double itd.). Za varijable String najprije sastavite lokalizirani niz 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 vizualnim 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. Uvijek definirajte sve CLDR kategorije potrebne ciljnim jezicima. String Catalogs to olakšavaju vizualnim uređivačem množine.
6

Lokalizirajte App Store metapodatke pomoću Fastlane

Upotrijebite Fastlaneov alat deliver kako biste metapodatke za App Store — naziv aplikacije, podnaslov, opis, ključne riječi i napomene o izdanju — držali pod nadzorom inačica u repozitoriju kao obične tekstne datoteke organizirane prema lokalnoj postavci.

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 ključne riječi na engleskom i španjolskom. Lokaliziranjem metapodataka na španjolski obuhvaćate pretraživanja latinoameričkih korisnika u SAD-u bez ciljanja zasebnog tržišta.
7

Testirajte lokalizaciju

Testirajte lokalizirani sadržaj bez promjene jezika uređaja. Upotrijebite nadjačavanja sheme Xcode za pokretanje aplikacije na bilo kojem jeziku, SwiftUI pretpreglede s okruženjem lokalne postavke i XCUITest s argumentima pokretanja za automatizirano 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 njemačkom (nizovi su oko 30% dulji nego na engleskom) i japanskom (oko 50% kraći) kako biste rano otkrili probleme s rasporedom. Upotrijebite pseudolokalizaciju u Xcodeu za opterećenje rasporeda bez stvarnih prijevoda.

Automatizirajte kvalitetu prijevoda

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

Automatizirajte prevođenje

Prevedite .strings, .xcstrings i Fastlane datoteke metapodataka pomoću AI. Automatizirajte prevođenje tekstova u aplikaciji i App Store metapodataka radi potpuno lokaliziranog 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
Lokalizirana prisutnost u trgovini App Store povećava preuzimanja za više od 30% na tržištima izvan engleskoga govornog područja. Prevedite metapodatke zajedno s nizovima aplikacije — to je lokalizacija s najvećim povratom ulaganja.
+

Dodatno: pametni pričuvni odabir lokalne postavke uz LocaleChain

iOS zadano prelazi na Vaš razvojni jezik kada točna lokalna postavka korisnika nije dostupna. Korisnik postavke pt-BR koji ima samo prijevode za pt-PT vidi engleski umjesto portugalskog. LocaleChain to ispravlja prilagodljivim pričuvnim lancima.

LocaleChain je Swift paket otvorenog izvornog 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 pogreške u .strings datoteci

Nedostajuće točke i zarezi, navodnici bez izlaza ili pogrešno kodiranje izazivaju neprimjetan otkaz. Datoteka se učita, ali su prijevodi prazni. Uvijek provjerite .strings datoteke prije commit-a.

SwiftUI interpolacija teksta se ne lokalizira

Text("Hello \(stringVar)") ne lokalizira se na očekivani način. Za izračunate nizove upotrijebite String(localized:) ili provjerite jesu li interpolirane varijable odgovarajućeg tipa za LocalizedStringKey.StringInterpolation.

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

Proširenja aplikacije imaju zasebne pakete. Provjerite jesu li .strings ili .xcstrings datoteke dodane fazi Copy Bundle Resources cilja proširenja, a ne samo cilja glavne aplikacije.

Nedostajući prijevodi prikazuju ključeve u produkciji

Kada ključ nema prijevod za jezik korisnika, iOS prikazuje sam ključ. Koristite strategiju rezervnog jezika i testirajte sve podržane lokale prije 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 odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Pričuvni odabir lokalne postavke uz ios-localechain

Kada u regionalnoj lokalnoj postavci poput de-AT nedostaje ključ prijevoda, iOS izravno prelazi na razvojni jezik umjesto da najprije provjeri nadređenu lokalnu postavku 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 cijelu listu podržanih sustava i 75 ugrađenih lanaca. Learn more →

Česta pitanja o iOS lokalizaciji