Интернационализация (i18n) в Swift для iOS и macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Интернационализация (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 просто добавьте файл в ассеты и отметьте его как локализуемый. Система автоматически выберет нужную версию в зависимости от языка устройства.

Проверка локализации в коде

Иногда нужно программно определить теку

Рекомендаций