Skip to main content

Потпун водич за локализацију iOS апликације

Од Localizable.strings датотеке до App Store метаподатака: локализујте iOS апликацију помоћу Xcode, SwiftUI, Fastlane и аутоматизованог AI превођења.

1

Омогућите локализацију у Xcode окружењу

Отворите подешавања Xcode пројекта, идите на Info > Localizations и додајте језике које желите да подржите. Xcode аутоматски прави .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
Основна локализација раздваја UI од његових текстова. Када додате језик, Xcode нуди да направи локализоване верзије storyboard, XIB и string датотека.
2

Направите Localizable.strings

Стандардна iOS датотека локализације користи парове кључева и вредности раздвојене знаком једнакости, а сваки ред се завршава тачком и зарезом. Ставите је у фасциклу 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
Недостајуће тачке и зарези изазивају неприметан отказ — датотека се учита без грешке, али су преводи празни. Проверите и да ли је датотека додата у фазу компоновања Copy Bundle Resources циљне апликације, иначе неће бити укључена у пакет апликације.
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

Пређите на String Catalogs (Xcode 15+)

String Catalogs (.xcstrings) су савремена Apple замена за .strings датотеке. Нуде визуелни уређивач у Xcode окружењу, аутоматско издвајање текстова из SwiftUI приказа и уграђену подршку за множину.

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 чувају СВЕ језике у једној .xcstrings JSON датотеци. У тимовима то значи честе Git конфликте спајања када више људи додаје текстове. За велике пројекте размотрите један каталог по модулу.
4

Користите локализоване текстове у SwiftUI и UIKit окружењу

SwiftUI приказ Text аутоматски локализује текстуалне литерале. UIKit користи NSLocalizedString. За iOS 16+ савремени API String(localized:comment:) пружа прегледнију синтаксу и уграђену подршку компајлера.

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)") неприметно не успева да се локализује када је name обична String променљива. SwiftUI интерполација текста прави LocalizedStringKey, али се само одређени типови (Int, Double и други) правилно интерполирају. За String променљиве најпре направите локализовани текст помоћу String(localized:).
5

Обрадите множину

iOS користи .stringsdict датотеке за правила множине и подржава све CLDR категорије: zero, one, two, few, many, other. String Catalogs обрађују множину визуелним уређивачем у Xcode окружењу — много једноставније од ручног писања stringsdict XML датотеке.

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)
Језици као што је арапски имају шест облика множине, руски три, а јапански један. Увек дефинишите све CLDR категорије потребне циљним језицима. String Catalogs то олакшавају визуелним уређивачем множине.
6

Локализујте App Store метаподатке помоћу Fastlane

Користите Fastlane алат deliver да App Store метаподатке — назив апликације, поднаслов, опис, кључне речи и напомене о издању — чувате са верзијама у репозиторијуму као обичне текстуалне датотеке организоване по локалу.

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
Унакрсна локализација: амерички App Store индексира енглеске и шпанске кључне речи. Локализацијом метаподатака на шпански обухватате претраге хиспаноамеричких корисника у САД без циљања посебног тржишта.
7

Тестирајте локализацију

Тестирајте локализовани садржај без промене језика уређаја. Користите замене Xcode шеме да покренете апликацију на било ком језику, SwiftUI прегледе са окружењем локала и XCUITest са аргументима покретања за аутоматизовано тестирање.

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()
Тестирајте на немачком (текстови су око 30% дужи од енглеских) и јапанском (текстови су око 50% краћи) да рано откријете проблеме распореда. Користите Xcode псеудолокализацију за тестирање распореда без правих превода.

Аутоматизујте квалитет превода

Откријте недостајуће кључеве, неисправна места за променљиве и проблеме множине помоћу i18n-validate пре објављивања. Тестирајте UI псеудопреводима помоћу i18n-pseudo пре него што стигну прави преводи.
8

Аутоматизујте преводе

Преведите .strings, .xcstrings и Fastlane датотеке метаподатака помоћу AI. Аутоматизујте превођење текстова у апликацији и App Store метаподатака ради потпуно локализованог присуства.

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
Локализовано присуство у App Store продавници повећава преузимања за више од 30% на тржиштима ван енглеског говорног подручја. Преведите метаподатке заједно са текстовима апликације — то је локализација са највећим повраћајем улагања.
+

Додатно: паметни резервни локал са LocaleChain

iOS подразумевано прелази на развојни језик када тачан локал корисника није доступан. Корисник pt-BR локала који има само pt-PT преводе види енглески уместо португалског. LocaleChain то исправља подесивим ланцима резервних локала.

LocaleChain је Swift пакет отвореног кода. Погледајте на 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"]]
)

Уобичајене замке

Синтаксне грешке у .strings датотеци

Недостајуће тачке и зарези, наводници без излаза или погрешно кодирање изазивају неприметан отказ. Датотека се учита, али су преводи празни. Увек проверите .strings датотеке пре commit-а.

SwiftUI интерполација текста се не локализује

Text("Hello \(stringVar)") се не локализује како се очекује. За израчунате текстове користите String(localized:) или проверите да интерполиране променљиве имају исправан тип за LocalizedStringKey.StringInterpolation.

Widget-и и проширења приказују необрађене кључеве

Проширења апликације имају засебне пакете. Проверите да ли су .strings или .xcstrings датотеке додате фази Copy Bundle Resources циља проширења, а не само циља главне апликације.

Недостајући преводи приказују кључеве у продукцији

Када кључ нема превод за језик корисника, iOS приказује сам кључ. Користите стратегију резервног језика и тестирајте све подржане локале пре издања.

Препоручена структура датотека

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

Испробајте i18n Agent сада

Пустите датотеку за превођење овде

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

или кликните за избор

Циљни језици

Регистрација није потребнаТренутна процена

Резервни локали са ios-localechain

Када у регионалном локалу као што је de-AT недостаје кључ превода, iOS одмах прелази на развојни језик уместо да најпре провери надређени локал 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"],
])

Погледајте наш водич за резервне локале за целу листу подржаних система и 75 уграђених ланаца. Learn more →

Честа питања о iOS локализацији