Skip to main content

Az iOS-alkalmazások lokalizációjának teljes útmutatója

A Localizable.strings fájltól az App Store metaadataiig: lokalizálja iOS-alkalmazását Xcode-dal, SwiftUI-val, Fastlane-nel és automatizált AI-fordítással.

1

Lokalizáció engedélyezése az Xcode-ban

Nyissa meg az Xcode-projekt beállításait, lépjen az Info > Localizations menübe, és adja hozzá a támogatni kívánt nyelveket. Az Xcode automatikusan létrehozza minden nyelv .lproj könyvtárát.

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
Az alaplokalizáció elválasztja a felületet a karakterláncoktól. Nyelv hozzáadásakor az Xcode felajánlja a storyboardok, XIB-k és karakterláncfájlok lokalizált változatainak létrehozását.
2

Localizable.strings létrehozása

A szabványos iOS-lokalizációs fájl egyenlőségjellel elválasztott kulcs-érték párokat használ, és minden sor pontosvesszővel végződik. A forrásnyelvhez helyezze a Base.lproj mappába.

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
A hiányzó pontosvesszők észrevétlen hibát okoznak: a fájl hiba nélkül betöltődik, de a fordítások üresek. Győződjön meg arról is, hogy a fájl szerepel a cél Copy Bundle Resources buildfázisában, különben nem kerül be az alkalmazáscsomagba.
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

Átállás String Catalogs formátumra (Xcode 15+)

A String Catalogs (.xcstrings) az Apple korszerű megoldása a .strings fájlok helyett. Vizuális Xcode-szerkesztőt, a SwiftUI-nézetekből történő automatikus karakterlánc-kinyerést és beépített többesszám-támogatást kínál.

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")
A String Catalogs MINDEN nyelvet egyetlen .xcstrings JSON-fájlban tárol. Csapatban ez gyakori Git-egyesítési ütközéseket okoz, amikor egyszerre többen adnak hozzá karakterláncokat. Nagy projekteknél érdemes modulonként külön katalógust használni.
4

Lokalizált karakterláncok használata SwiftUI-ban és UIKitben

A SwiftUI Text nézete automatikusan lokalizálja a karakterlánc-literálokat. A UIKit az NSLocalizedString függvényt használja. iOS 16-tól a korszerű String(localized:comment:) API letisztultabb szintaxist és beépített fordítótámogatást kínál.

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"
            )
        }
    }
}
A Text("Hello \(name)") észrevétlenül nem lokalizálódik, ha a name egyszerű String változó. A SwiftUI karakterlánc-interpolációja LocalizedStringKey értéket hoz létre, de csak bizonyos típusokat — Int, Double stb. — interpolál helyesen. String változóknál előbb a String(localized:) segítségével hozza létre a lokalizált karakterláncot.
5

Többes számok kezelése

Az iOS .stringsdict fájlokban kezeli a többes számú szabályokat, és az összes CLDR-kategóriát támogatja: zero, one, two, few, many, other. A String Catalogs vizuális Xcode-szerkesztővel kezeli a többes számokat, ami sokkal egyszerűbb a stringsdict XML kézi megírásánál.

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)
Az arabhoz hasonló nyelveknek 6, az orosznak 3, a japánnak 1 többes számú alakja van. Mindig határozza meg a célnyelvek összes szükséges CLDR-kategóriáját. A String Catalogs vizuális többesszám-szerkesztője megkönnyíti ezt.
6

App Store-metaadatok lokalizálása Fastlane-nel

A Fastlane deliver eszközével az App Store metaadatait — az alkalmazás nevét, alcímét, leírását, kulcsszavait és kiadási megjegyzéseit — területi beállítás szerint rendezett egyszerű szövegfájlokként, verziókövetetten tarthatja a repozitoriumban.

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
Keresztlokalizáció: az amerikai App Store az angol és a spanyol kulcsszavakat is indexeli. A metaadatok spanyolra fordításával külön piac megcélzása nélkül érheti el a spanyolul kereső amerikai felhasználókat.
7

A lokalizáció tesztelése

A lokalizált tartalmat az eszköz nyelvének módosítása nélkül tesztelheti. Az Xcode-sémák felülbírálásával bármely nyelven futtathatja az alkalmazást, a SwiftUI előnézetekben területi környezetet használhat, az XCUITestben pedig indítási argumentumokkal automatizálhatja a tesztelést.

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()
Teszteljen némettel — a szöveg körülbelül 30%-kal hosszabb az angolnál — és japánnal — a szöveg körülbelül 50%-kal rövidebb —, hogy időben észlelje az elrendezési hibákat. Valódi fordítások nélkül az Xcode ál-lokalizációjával terhelheti az elrendezéseket.

A fordítási minőség automatizálása

Az i18n-validate segítségével még kiadás előtt észlelheti a hiányzó kulcsokat, hibás helyőrzőket és többesszám-problémákat. A valódi fordítások elkészülte előtt az i18n-pseudo álfordításaival tesztelheti a felületet.
8

Fordítások automatizálása

AI segítségével fordítsa le a .strings, .xcstrings és Fastlane-metaadatfájlokat. Automatizálja az alkalmazáson belüli karakterláncok és az App Store-metaadatok fordítását a teljesen lokalizált megjelenésért.

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
A lokalizált App Store-jelenlét több mint 30%-kal növeli a letöltéseket a nem angol piacokon. A metaadatokat az alkalmazás karakterláncaival együtt fordítsa le — ez a legjobb megtérülésű lokalizációs feladat.
+

Bónusz: intelligens területi tartalék a LocaleChainnel

Az iOS alapértelmezés szerint a fejlesztési nyelvre vált, ha a felhasználó pontos területi beállítása nem érhető el. A csak pt-PT fordítással rendelkező pt-BR felhasználó portugál helyett angolt lát. A LocaleChain konfigurálható tartalékláncokkal javítja ezt.

A LocaleChain nyílt forráskódú Swift-csomag. Megtekintés a GitHubon

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

Gyakori buktatók

.strings fájlok szintaktikai hibái

A hiányzó pontosvesszők, escape-karakter nélküli idézőjelek és hibás kódolás észrevétlen hibát okoznak. A fájl betöltődik, de a fordítások üresnek látszanak. Beküldés előtt mindig ellenőrizze a .strings fájlokat.

A SwiftUI Text interpolációja nem lokalizálódik

A Text("Hello \(stringVar)") nem a várt módon lokalizálódik. Számított karakterláncokhoz használja a String(localized:) függvényt, vagy győződjön meg róla, hogy az interpolált változók típusa megfelel a LocalizedStringKey.StringInterpolation követelményeinek.

A widgetek és bővítmények nyers kulcsokat jelenítenek meg

Az alkalmazásbővítmények külön csomaggal rendelkeznek. Győződjön meg róla, hogy a .strings vagy .xcstrings fájlok a bővítmény céljának Copy Bundle Resources fázisához is hozzá vannak adva, nem csak a fő alkalmazáséhoz.

A hiányzó fordítások kulcsként jelennek meg éles környezetben

Ha egy kulcshoz nincs fordítás a felhasználó nyelvén, az iOS magát a kulcsot jeleníti meg. Használjon tartaléknyelvi stratégiát, és kiadás előtt tesztelje az összes támogatott területi beállítást.

Ajánlott fájlszerkezet

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

Try i18n Agent Now

Drop your translation file here

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

or click to browse

Target languages

No signup requiredInstant estimate

Területi tartalék az ios-localechain segítségével

Ha egy fordítási kulcs hiányzik egy regionális területi beállításból — például de-AT —, az iOS a szülő de területi beállítás ellenőrzése helyett közvetlenül a fejlesztési nyelvre vált.

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

A támogatott keretrendszerek és a 75 beépített lánc teljes listájáért tekintse meg Területi tartalék útmutatónkat. Learn more →

iOS-lokalizációs GYIK