|
Документация
Заказать демоПлатформа
ПлатформаMCPCLIAPIРабочие процессы
Руководства
Журнал изменений

Локализация

  • Обзор
  • API локализации
  • Локализация веб-приложений
  • Локализация мобильных приложений
  • iOS и String Catalogs
  • Android и strings.xml
  • Локализация email-писем
  • Статический контент, например .md и .json
  • Next.js с Markdoc
  • Rails с i18n

Рабочие процессы

  • Настройка движка с MCP
  • Jira Triage
  • CI/CD

Локализация iOS-приложения через Xcode String Catalogs

Lingo.dev CLI переводит Xcode String Catalogs (.xcstrings) через настроенный движок локализации. String Catalogs — это современный формат локализации от Apple, представленный в Xcode 15, где все языки хранятся в одном JSON-файле. CLI изменяет этот файл напрямую — отдельные папки для каждой локали не нужны.

Это руководство проведёт вас через полную локализацию iOS-приложения: настройка CLI, перевод на локальной машине и автоматизация через GitHub App, чтобы переводы выходили с каждым пушем.

Демо-репозиторий

Чтобы следовать руководству, клонируйте или создайте форк lingodotdev/ios-app-localization-example. В репозитории — рабочий Xcode-проект со String Catalogs и готовой конфигурацией Lingo.dev CLI.

Как работают String Catalogs#

До Xcode 15 локализация iOS требовала поддерживать отдельные файлы .strings и .stringsdict в каталогах [locale].lproj/. String Catalogs заменяют всё это одним файлом Localizable.xcstrings, который Xcode поддерживает автоматически.

Когда вы помечаете строку как локализуемую в SwiftUI или UIKit, Xcode обнаруживает её во время сборки и добавляет запись в String Catalog. В каждой записи хранится исходная строка, её переводы для всех настроенных локалей и необязательное поле комментария, которое даёт переводчикам дополнительный контекст.

ПараметрУстаревшие .stringsString Catalogs .xcstrings
Количество файловОдин на локаль для каждой таблицыОдин файл для всех локалей
ФорматТекст в формате ключ-значениеСтруктурированный JSON
Поддержка множественного числаОтдельный файл .stringsdictВстроенные правила множественного числа
Интеграция с XcodeРучной экспорт и импортАвтоматическое определение
Заметки для переводчиковНе поддерживаютсяПоле комментария для каждой записи

CLI определяет формат .xcstrings по расширению файла, разбирает JSON-структуру, переводит каждую запись через движок локализации и записывает результаты обратно в тот же файл — комментарии, правила множественного числа и метаданные сохраняются.

Что понадобится#

1

Создайте движок локализации

Каждый перевод проходит через движок локализации — настройку, которая задаёт LLM-модель, глоссарий, тональность бренда и правила. Создайте его в Lingo.dev dashboard и получите API-ключ.

2

Проверьте Node.js

Для работы CLI нужен Node.js версии 22 или выше:

bash
node -v
3

Включите локализацию в Xcode

В проекте Xcode откройте Project Settings > Info > Localizations и добавьте нужные целевые языки. Xcode создаст записи в String Catalog для каждой добавленной локали. Подробнее — в документации Apple по локализации.

Установка и конфигурация CLI#

Установите CLI, пройдите аутентификацию и настройте проект. Полное пошаговое руководство — в разделе Быстрый старт.

bash
npm install -g @lingo.dev/cli
lingo login

Запустите lingo init в корне проекта и ответьте на вопросы (исходная локаль, целевые локали и шаблон пути к вашему String Catalog), затем lingo link, чтобы привязать проект к организации и движку. В итоге будет создан файл .lingo/config.json:

json
{
  "orgId": "org_...",
  "engineId": "eng_...",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de", "ja"],
  "files": [{ "pattern": "MyApp/Localizable.xcstrings" }]
}

Зафиксируйте .lingo/config.json — это источник истины о том, что переводится. Формат .xcstrings определяется по расширению файла. Поскольку String Catalogs хранят все локали в одном файле, плейсхолдер локали в шаблоне не нужен: CLI читает записи исходного языка и записывает все целевые языки обратно в тот же файл. Полная схема — в справочнике по конфигурации.

Несколько String Catalogs

Если в проекте несколько файлов String Catalog (например, по одному на каждый фреймворк-таргет), добавьте запись files для каждого из них:

json
{
  "files": [
    { "pattern": "MyApp/Localizable.xcstrings" },
    { "pattern": "MyAppWidgets/Localizable.xcstrings" }
  ]
}

Локальный перевод#

Запустите первый перевод из корня проекта:

bash
lingo push --backfill-missing

CLI читает ваш String Catalog, переводит все недостающие записи через движок локализации, ждёт завершения и записывает результаты обратно в файл .xcstrings. Откройте его в Xcode — переводы будут заполнены для каждой настроенной локали.

После редактирования исходных строк обычный lingo push переводит только изменения — записи, исходный текст которых не изменился, пропускаются на стороне сервера и отслеживаются через lockfile:

bash
lingo push

Заметки для переводчиков#

String Catalogs поддерживают поле комментария для каждой записи, и CLI включает его в запросы на перевод. Эти комментарии дают контекст движку локализации: помогают снять неоднозначность терминов, задать нужный тон или объяснить, где строка отображается в интерфейсе.

В Xcode выберите строку в редакторе String Catalog и добавьте комментарий в панели инспектора. Комментарий сохраняется в JSON .xcstrings:

json
{
  "sourceLanguage": "en",
  "strings": {
    "Set": {
      "comment": "Refers to a collection of items, not the verb",
      "localizations": { }
    }
  }
}

CLI отправляет этот комментарий вместе со строкой, помогая модели выбрать правильную интерпретацию. Без контекста "Set" во многих языках может переводиться как глагол — комментарий снимает эту неоднозначность. Больше примеров — в разделе Translator Notes.

Множественное число#

String Catalogs изначально поддерживают формы множественного числа на основе CLDR plural rules. Когда вы задаёте вариант множественного числа в Xcode, String Catalog сохраняет правила для каждой категории множественного числа (zero, one, two, few, many, other), которая нужна целевому языку.

CLI сохраняет эту структуру при переводе и создаёт правильные категории множественного числа для каждой целевой локали. В английском их две (one и other), в арабском — шесть, в польском — четыре, а в японском — одна. Движок локализации учитывает эти различия автоматически.

Автоматизация через GitHub App#

Установите GitHub App Lingo.dev в репозиторий для непрерывной локализации — без CI-раннера, секрета с API-ключом и lockfile. После установки и привязки к .lingo/config.json (с его engineId) он автоматически реагирует на пуши и пул-реквесты: находит изменённые исходные строки, переводит их через ваш движок и коммитит обновлённый .xcstrings в ветку или открывает пул-реквест.

Хотите запускать самостоятельно?

Вы также можете запустить lingo push из своего CI-задания (любой раннер с Node.js) и зафиксировать результаты, используя LINGO_API_KEY для аутентификации. Паттерны для раннеров — в разделе Рабочие процессы CI/CD.

Проверка перед деплоем#

Используйте lingo check как условие деплоя, чтобы непереведённые строки не попали в продакшен. Команда сообщает об отсутствующих или устаревших переводах и завершается с ненулевым кодом, если работа ещё не завершена:

bash
lingo check

Добавьте её отдельным шагом CI перед сборкой.

Что дальше#

Локализация мобильных приложений
Обзор всех мобильных платформ — iOS, Android, Flutter и React Native
Процессы CI/CD
GitHub App и паттерны CI на основе раннеров
Глоссарии
Зафиксируйте названия брендов и технические термины, чтобы они не переводились
Заметки для переводчиков
Добавьте контекст, чтобы повысить точность перевода

Эта страница была полезной?

Max PrilutskiyMax Prilutskiy·Обновлено 8 дней назад·4 минуты чтения