Перейти к содержимому
Все руководства
Практическое руководство30 мин чтения

Как локализовать скриншоты App Store на 30+ языков

Практическое руководство по выпуску локализованных скриншотов App Store и Google Play без создания отдельных шаблонов под каждый язык. Охватывает структуру ключей перевода, мультиязычную генерацию, обработку RTL, фолбэки шрифтов и автоматизированный QA макета.

Eric Isensee
Eric IsenseeFounder · Last updated 5 мая 2026 г.

Кратко

Вынесите каждую подпись в ключ перевода, переводите ключи (а не графику), затем отправьте один API-запрос со списком локалей. Screenshots.live параллельно отрисовывает каждую локаль из одного и того же шаблона — RTL, CJK и переопределения для конкретных локалей обрабатываются рендерером.

Зачем вообще локализовать скриншоты?

Собственное исследование разработчиков Apple показывает, что пользователи значительно чаще устанавливают приложение, когда страница в App Store представлена на их родном языке. То же самое описано в чек-листе локализации Google: локализованные карточки лучше конвертируют и выше ранжируются в поиске. Перевод только метаданных — заголовка, подзаголовка, ключевых слов — без перевода скриншотов является самой распространённой полумерой и оставляет реальную конверсию на столе, потому что главный визуальный актив остаётся на английском.

Препятствие для большинства команд носит операционный, а не стратегический характер. Перевод набора из пяти скриншотов на 30 языков вручную означает 150 файлов дизайна, 150 циклов проверки и 150 шансов на опечатку. Решение — относиться к скриншотам так же, как к любому другому локализованному UI: ключи в коде, тексты в TMS, макет отрисовывается на этапе сборки.

Как структурировать ключи перевода?

Используйте ту же структуру ключей, что и для переводов внутри приложения. Группируйте ключи по ID скриншота, затем по роли элемента:

translations/en.json
json
{
  "screenshots": {
    "01_home": {
      "headline": "Build faster.",
      "subhead": "Ship every store size in one API call.",
      "badge": "New"
    },
    "02_pricing": {
      "headline": "Plans for every team.",
      "cta": "Start free"
    },
    "03_api": {
      "headline": "Built for developers.",
      "subhead": "REST, Fastlane, and GitHub Actions out of the box."
    }
  }
}

Затем соответствующий немецкий файл:

translations/de.json
json
{
  "screenshots": {
    "01_home": {
      "headline": "Schneller bauen.",
      "subhead": "Alle Store-Formate mit einem API-Call.",
      "badge": "Neu"
    },
    "02_pricing": {
      "headline": "Pläne für jedes Team.",
      "cta": "Kostenlos starten"
    }
  }
}

Ключи никогда не меняются. Меняются только значения. Переводчики работают со столбцом значений в своей TMS, не затрагивая шаблон Screenshots.live.

Какие коды локалей использовать?

Используйте BCP-47 единообразно. Применяйте только подтег языка, если нет региональных вариаций (de, fr, ja), и добавляйте регион только тогда, когда варианты значимо различаются (en-GB и en-US, pt-BR и pt-PT, zh-Hans и zh-Hant). И Apple, и Google принимают BCP-47, хотя их внутренние коды немного различаются — см. список локалей App Store Connect и поддерживаемые языки Google Play. Сопоставьте их один раз в своём CI-скрипте.

Как развернуть рендеринг по локалям?

API принимает ID шаблона, каталог переводов и массив локалей. В ответ возвращается по одному отрисованному PNG на каждую локаль и устройство:

render.sh
bash
curl -X POST https://api.screenshots.live/v1/renders \
  -H "Authorization: Bearer $SCREENSHOTSLIVE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "tpl_app_release_v3",
    "locales": ["en", "de", "es", "fr", "pt-BR", "it", "nl", "ja", "ko", "zh-Hans", "ar", "he"],
    "devices": ["iphone-6.7", "iphone-6.1", "ipad-12.9", "phone-android"],
    "translations": {
      "en": "@translations/en.json",
      "de": "@translations/de.json",
      "es": "@translations/es.json"
    }
  }'

Под капотом рендерер распараллеливает работу по локалям и устройствам. Рендеринг 12 локалей × 4 устройства — 48 PNG-файлов — обычно завершается менее чем за 90 секунд. Полный формат запроса см. в документации API по рендерингу.

Как обрабатывать языки с письмом справа налево?

Арабский (ar), иврит (he), персидский (fa) и урду (ur) требуют зеркалирования всего макета — выравнивания текста, положения изображений, иконок-стрелок и даже порядка групп из нескольких элементов. Частичное зеркалирование (только переворот текста, но не макета) выглядит для носителей языка неправильно и подрывает доверие.

В Screenshots.live пометьте шаблон как direction: "auto", и рендерер автоматически перевернёт макет, выравнивание текста и декоративные шевроны при отрисовке RTL-локалей. Переопределяйте отдельные элементы значением direction: "ltr", когда что-то должно остаться слева направо (номер телефона, URL, блок кода).

А как насчёт переопределений текста для отдельных локалей?

Некоторые языки просто не помещаются в один и тот же блок подписи. Немецкие составные существительные могут быть на 40% длиннее английских; японский и китайский — на 50% короче. Разрешите переопределения текста для отдельных локалей без создания форка шаблона:

translations/overrides.json
json
{
  "screenshots.01_home.headline": {
    "en": "Build faster.",
    "de": "Schneller bauen.",
    "fi": "Rakenna nopeammin.",
    "ja": "もっと速く。"
  },
  "screenshots.01_home.subhead": {
    "en": "Ship every store size in one API call.",
    "de": "Alle Formate mit einem Aufruf.",
    "ja": "ワンコールで全サイズ対応。"
  }
}

А как насчёт шрифтов и глифов CJK?

Шрифты латиницы (Inter, SF Pro, Roboto) часто не имеют глифов CJK, кириллицы, деванагари или арабицы — текст отображается как пустые квадратики (тофу). Настройте фолбэки шрифтов для каждой системы письма:

  • Латиница / Кириллица / Греческий: Inter, SF Pro, Roboto
  • CJK (японский / корейский / китайский): Noto Sans CJK
  • Арабский / Персидский / Урду: Noto Sans Arabic, IBM Plex Sans Arabic
  • Деванагари (хинди): Noto Sans Devanagari
  • Тайский: Noto Sans Thai, Sarabun

Семейство Noto покрывает все системы письма, поддерживаемые Apple и Google. Установите его как цепочку фолбэков в шаблоне — рендерер выберет правильный шрифт для каждой кодовой точки без ручного вмешательства.

Как проводить QA макетов в масштабе?

Ручная проверка 30 локалей не масштабируется. Автоматизируйте очевидные сценарии сбоев:

  • Переполнение текста: отрисуйте в четверти разрешения, прогоните результат через OCR, сравните с исходной строкой. Несовпадения означают, что текст был обрезан.
  • Отсутствующие глифы: посчитайте квадратики тофу в отрисованном PNG с помощью vision-модели или гистограммы пикселей по символу замены Unicode.
  • Пустые переводы: завершайте сборку с ошибкой, если в какой-либо локали отсутствует более 5% ключей по сравнению с английским.
  • Бюджеты по длине: установите жёсткое ограничение длины для каждого ключа. Если немецкий перевод его превышает, валите сборку, а не давайте переполнению попасть в релиз.

Как загружать скриншоты по локалям?

И App Store Connect, и Google Play принимают скриншоты для каждой локали. Fastlane deliver читает из fastlane/screenshots/<locale>/, а Fastlane supply — из fastlane/metadata/android/<locale>/images/phoneScreenshots/. Сопоставьте вывод вашего рендерера с этими путями — и всё, что останется, это fastlane deliver / fastlane supply --skip_upload_apk.

Что делать дальше?

Объедините это с нашим руководством по автоматизации CI/CD, чтобы локализация запускалась при каждом релизе. Используйте возможность мультиплатформенной поддержки, чтобы развернуть генерацию на iOS, Android и веб-магазины из одного и того же каталога.

30+ локалей, один шаблон

Создавайте все эти размеры автоматически

Перестаньте менять размер скриншотов вручную. Создайте один шаблон и получите все размеры, устройства и локали одним вызовом API.

Начните бесплатно — попробуйте Screenshots.live