Интернационализация (i18n) в Swift: Полный гайд для iOS и macOS
Интернационализация (сокращённо i18n) — это процесс проектирования приложения таким образом, чтобы оно могло быть адаптировано под различные языки и регионы без изменения исходного кода. Для разработчиков под платформы Apple (iOS, macOS, watchOS, tvOS) Swift предлагает мощный, но при этом элегантный набор инструментов. В этой статье мы детально разберём, как настроить i18n в вашем Swift-проекте, используя встроенные механизмы Apple.
Почему i18n критически важен?
Даже если ваше приложение изначально создаётся на одном языке, интернационализация должна закладываться на этапе архитектуры. Это позволяет:
- Расширить аудиторию: Пользователи из разных стран предпочитают приложения на родном языке.
- Упростить локализацию: Правильная i18n превращает добавление нового языка в простую операцию с файлами.
- Избежать хардкода: Все строки выносятся в отдельные ресурсы, что улучшает читаемость и поддержку кода.
Основной инструмент: NSLocalizedString
Сердцем интернационализации в Swift является макрос NSLocalizedString. Он ищет строку в файлах локализации (.strings) и возвращает переведённую версию. Если перевод не найден, используется ключ (обычно английская строка).
// Пример использования в Swift
let welcomeMessage = NSLocalizedString("welcome_message", comment: "Приветствие на главном экране")
label.text = welcomeMessage
Рекомендуется всегда указывать comment — он помогает переводчикам понять контекст.
Структура файлов локализации
В Xcode языки добавляются через Project Settings > Info > Localizations. После этого создаются папки xx.lproj (например, en.lproj, ru.lproj). Внутри них хранятся:
- Localizable.strings — основной файл с парами "ключ" = "значение";
- InfoPlist.strings — для локализации названия приложения и системных строк;
- Storyboard.strings — автоматически генерируемый файл для интерфейсов, созданных в сторибордах.
Формат Localizable.strings
Файл имеет простой синтаксис:
// English (en.lproj/Localizable.strings)
"welcome_message" = "Welcome to our app!";
"login_button" = "Log In";
// Русский (ru.lproj/Localizable.strings)
"welcome_message" = "Добро пожаловать в наше приложение!";
"login_button" = "Войти";
Важно: Строки завершаются точкой с запятой. Кодировка файла должна быть UTF-8 или UTF-16.
Форматирование строк с параметрами
Часто требуется вставить в строку динамические данные (имя пользователя, количество элементов). Для этого используется String(format:):
// В Localizable.strings:
"items_count" = "You have %d items.";
"user_greeting" = "Hello, %@!";
// В коде Swift:
let count = 5
let itemsText = String(format: NSLocalizedString("items_count", comment: "Количество предметов"), count)
let userName = "Алексей"
let greeting = String(format: NSLocalizedString("user_greeting", comment: "Приветствие пользователя"), userName)
Для поддержки плюральных форм (1 яблоко, 2 яблока, 5 яблок) используйте StringDict (файлы .stringsdict).
Работа с XLIFF для переводчиков
Apple поддерживает формат XLIFF (XML Localisation Interchange File). Это индустриальный стандарт для обмена переводами. В Xcode вы можете экспортировать все строки в XLIFF-файл, отдать его переводчику, а затем импортировать обратно.
// Команда в терминале для экспорта:
xcodebuild -exportLocalizations -localizationPath ./translations -project YourProject.xcodeproj
// Импорт готовых переводов:
xcodebuild -importLocalizations -localizationPath ./translations -project YourProject.xcodeproj
Локализация изображений и ресурсов
Не только текст требует интернационализации. Изображения с текстом, видео, аудиофайлы — всё это можно локализовать. В Xcode просто добавьте файл в ассеты и отметьте его как локализуемый. Система автоматически выберет нужную версию в зависимости от языка устройства.
Проверка локализации в коде
Иногда нужно программно определить теку