
Повний посібник із локалізації застосунків iOS
Від Localizable.strings до метаданих App Store: локалізуйте свій застосунок iOS за допомогою Xcode, SwiftUI, Fastlane й автоматизованого перекладу на основі ШІ.
Увімкніть локалізацію в Xcode
Відкрийте налаштування свого проєкту Xcode, перейдіть до Info > Localizations і додайте мови, які бажаєте підтримувати. Xcode автоматично створить каталоги .lproj для кожної мови.
// 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Створіть Localizable.strings
Стандартний файл локалізації iOS містить пари «ключ — значення», розділені знаками рівності, а кожен рядок завершується крапкою з комою. Розмістіть його в папці Base.lproj для вихідної мови.
// 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// ❌ 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";Перейдіть на String Catalogs (Xcode 15+)
String Catalogs (.xcstrings) — сучасна заміна файлів .strings від Apple. Вони надають візуальний редактор у Xcode, автоматично видобувають рядки з Ваших подань SwiftUI та мають вбудовану підтримку форм множини.
// 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")Використовуйте локалізовані рядки у SwiftUI та UIKit
Подання Text у SwiftUI автоматично локалізує рядкові літерали. UIKit використовує NSLocalizedString. В iOS 16+ сучасний API String(localized:comment:) пропонує зрозуміліший синтаксис із вбудованою підтримкою компілятора.
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"
)
}
}
}Опрацюйте форми множини
iOS використовує файли .stringsdict для правил множини й підтримує всі категорії множини CLDR: zero, one, two, few, many, other. У String Catalogs форми множини можна опрацьовувати у візуальному редакторі Xcode — це значно простіше, ніж писати XML 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)Локалізуйте метадані App Store за допомогою Fastlane
Використовуйте інструмент deliver із Fastlane, щоб зберігати метадані App Store — назву застосунку, підзаголовок, опис, ключові слова та примітки до випуску — у своєму репозиторії під контролем версій як звичайні текстові файли, упорядковані за локалями.
# 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Перевірте локалізацію
Перевіряйте локалізований вміст, не змінюючи мову пристрою. Використовуйте перевизначення схеми Xcode, щоб запускати застосунок будь-якою мовою, попередні перегляди SwiftUI із середовищем locale та XCUITest з аргументами запуску для автоматизованого тестування.
// 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()Автоматизуйте контроль якості перекладу
Автоматизуйте переклад
Перекладайте файли .strings, .xcstrings і метадані Fastlane за допомогою ШІ. Автоматизуйте переклад рядків у застосунку та метаданих App Store, щоб повністю локалізувати свою присутність.
# 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Додатково: розумний резервний вибір локалі з LocaleChain
За замовчуванням iOS повертається до Вашої мови розробки, якщо точна локаль користувача недоступна. Користувач із локаллю pt-BR, для якого є лише переклади pt-PT, побачить англійську замість португальської. LocaleChain розв’язує цю проблему за допомогою налаштовуваних ланцюжків резервного вибору.
LocaleChain — пакет Swift із відкритим кодом. Переглянути на GitHub
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.gitimport 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
Інтерполяція Text у SwiftUI не локалізується
Віджети та розширення показують необроблені ключі
У виробничому середовищі замість відсутніх перекладів показуються ключі
Рекомендована структура файлів
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.
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechainimport LocaleChain
LocaleChain.configure(overrides: [
"de": ["en-GB", "en"],
"pt-BR": ["pt", "en"],
"zh-Hant-HK": ["zh-Hant", "zh", "en"],
])Перегляньте наш посібник із резервного вибору локалі, щоб ознайомитися з повним переліком підтримуваних фреймворків і 75 вбудованими ланцюжками. Learn more →