Skip to main content

Celovit vodnik po lokalizaciji aplikacij iOS

Od Localizable.strings do metapodatkov App Store: lokalizirajte svojo aplikacijo iOS z Xcode, SwiftUI, Fastlane in samodejnim prevajanjem z umetno inteligenco.

1

Omogočite lokalizacijo v Xcode

Odprite nastavitve svojega projekta Xcode, pojdite na Info > Localizations in dodajte jezike, ki jih želite podpirati. Xcode za vsak jezik samodejno ustvari imenike .lproj.

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 loči Vaš uporabniški vmesnik od njegovih besedil. Ko dodate jezik, Xcode ponudi ustvarjanje lokaliziranih različic Vaših storyboardov, datotek XIB in datotek z besedili.
2

Ustvarite Localizable.strings

Standardna lokalizacijska datoteka iOS uporablja pare ključev in vrednosti, ločene z enačaji, vsaka vrstica pa se konča s podpičjem. Za izvorni jezik jo postavite v mapo Base.lproj.

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
Manjkajoča podpičja povzročijo neopazne napake: datoteka se naloži brez napake, prevodi pa so prazni. Poskrbite tudi, da je datoteka dodana v fazo gradnje Copy Bundle Resources Vašega cilja, sicer ne bo vključena v 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

Preselite se na kataloge String Catalog (Xcode 15+)

Katalogi String Catalog (.xcstrings) so Applova sodobna zamenjava za datoteke .strings. Ponujajo vizualni urejevalnik v Xcode, samodejno pridobivanje besedil iz Vaših pogledov SwiftUI in vgrajeno podporo za množinske oblike.

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")
Katalogi String Catalog shranijo VSE jezike v eno datoteko JSON .xcstrings. V ekipah to pomeni pogoste spore Git pri združevanju, kadar besedila hkrati dodaja več ljudi. Pri velikih projektih razmislite o enem katalogu na modul.
4

Uporabljajte lokalizirana besedila v SwiftUI in UIKit

Pogled Text v SwiftUI samodejno lokalizira besedilne literale. UIKit uporablja NSLocalizedString. Za iOS 16+ sodobni API String(localized:comment:) ponuja čistejšo skladnjo z vgrajeno podporo prevajalnika.

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)") se neopazno ne lokalizira, kadar je name navadna spremenljivka String. Interpolacija nizov v SwiftUI ustvari LocalizedStringKey, vendar pravilno interpolira samo določene vrste (Int, Double itd.). Pri spremenljivkah String najprej zgradite lokalizirano besedilo s String(localized:).
5

Obravnavajte množinske oblike

iOS za množinska pravila uporablja datoteke .stringsdict in podpira vse množinske kategorije CLDR: zero, one, two, few, many in other. Katalogi String Catalog množinske oblike obravnavajo z vizualnim urejevalnikom v Xcode, kar je veliko preprosteje od ročnega pisanja 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)
Jeziki, kot je arabščina, imajo 6 množinskih oblik, ruščina 3, japonščina pa 1. Vedno določite vse kategorije CLDR, ki jih potrebujejo Vaši ciljni jeziki. Katalogi String Catalog to olajšajo z vizualnim urejevalnikom množinskih oblik.
6

Lokalizirajte metapodatke App Store z orodjem Fastlane

Z orodjem deliver iz Fastlane hranite metapodatke App Store — ime aplikacije, podnaslov, opis, ključne besede in opombe ob izdaji — v svojem repozitoriju pod nadzorom različic kot navadne besedilne datoteke, razvrščene po jezikovnih različicah.

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
Navzkrižna lokalizacija: ameriški App Store indeksira angleške in španske ključne besede. Z lokalizacijo metapodatkov v španščino zajamete iskanja špansko govorečih uporabnikov v ZDA, ne da bi ciljali ločen trg.
7

Preizkusite svojo lokalizacijo

Lokalizirano vsebino preizkusite, ne da bi spremenili jezik naprave. Z zamenjavami sheme Xcode zaženite aplikacijo v katerem koli jeziku, uporabite predoglede SwiftUI z okoljem jezikovne različice in XCUITest z zagonskimi argumenti za samodejno 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()
Preizkusite z nemščino (besedila se v primerjavi z angleščino podaljšajo za približno 30 %) in japonščino (besedila se skrajšajo za približno 50 %), da zgodaj odkrijete težave s postavitvijo. S psevdolokalizacijo v Xcode obremenitveno preizkusite postavitve brez pravih prevodov.

Avtomatizirajte kakovost prevodov

Z i18n-validate odkrijte manjkajoče ključe, poškodovane označbe mest in težave z množinskimi oblikami, preden dosežejo uporabnike. Z i18n-pseudo preizkusite uporabniški vmesnik s psevdoprevodi, preden prispejo pravi prevodi.
8

Avtomatizirajte prevode

Svoje datoteke .strings, .xcstrings in metapodatke Fastlane prevedite z umetno inteligenco. Avtomatizirajte prevajanje besedil v aplikaciji in metapodatkov App Store za povsem lokalizirano prisotnost.

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 prisotnost v App Store na neangleških trgih poveča število prenosov za več kot 30 %. Metapodatke prevajajte skupaj z besedili aplikacije: to je lokalizacija z največjo donosnostjo, ki jo lahko izvedete.
+

Dodatek: pametno nadomeščanje jezikovnih različic z LocaleChain

iOS se privzeto vrne k Vašemu razvojnemu jeziku, kadar uporabnikova točna jezikovna različica ni na voljo. Uporabnik pt-BR, ki ima na voljo samo prevode pt-PT, namesto portugalščine vidi angleščino. LocaleChain to odpravi z nastavljivimi nadomestnimi verigami.

LocaleChain je odprtokodni paket Swift. Oglejte si ga na GitHubu

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

Pogoste pasti

Napake skladnje v datotekah .strings

Manjkajoča podpičja, neubežani narekovaji ali napačno kodiranje povzročijo neopazne napake. Datoteka se naloži, prevodi pa so prazni. Datoteke .strings vedno preverite pred commitom.

Interpolacija Text v SwiftUI se ne lokalizira

Text("Hello \(stringVar)") se ne lokalizira po pričakovanjih. Za izračunana besedila uporabite String(localized:) ali pa poskrbite, da so interpolirane spremenljivke pravilne vrste za LocalizedStringKey.StringInterpolation.

Gradniki in razširitve kažejo neobdelane ključe

Razširitve aplikacije imajo ločene pakete. Poskrbite, da so Vaše datoteke .strings ali .xcstrings dodane fazi Copy Bundle Resources cilja razširitve, ne samo cilju glavne aplikacije.

Manjkajoči prevodi v produkciji kažejo ključe

Kadar ključ nima prevoda za uporabnikov jezik, iOS pokaže sam ključ. Uporabite strategijo nadomestnega jezika in pred izdajo preizkusite vse podprte jezikovne različice.

Priporočena struktura datotek

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

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Nadomestne jezikovne različice z ios-localechain

Ko v regionalni jezikovni različici, kot je de-AT, manjka prevajalski ključ, iOS preskoči naravnost na razvojni jezik, namesto da bi najprej preveril nadrejeno različico 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"],
])

V našem vodniku po nadomestnih jezikovnih različicah si oglejte celoten seznam podprtih ogrodij in 75 vgrajenih verig. Learn more →

Pogosta vprašanja o lokalizaciji iOS