Баннер записи 'Veresk: исправляем переводы в игре без нового билда'

Veresk: исправляем переводы в игре без нового билда

Вы: в испанской локализации "Jugar ahora" не влезает в кнопку — поставь "Jugar", мы уже проверили на экране, опубликуй.

Агент: публикую уже проверенную строку. Готово: localization_es обновлён в production.

Игрок: О, теперь влезает!

Разберём ниже, а пока...


Начинаем серию практических разборов Veresk. В предыдущем посте мы познакомили вас с сервисом, а сегодня покажем, как использовать его для обновления переводов.

Правка опечатки в локализации без системы конфигурации

Знакомая ситуация

Игра вышла, переводы на пять языков залиты, всё работает. А потом начинается привычная для любого разработчика история.

Испанский перевод кнопки «Играть» оказывается длиннее макета — и вместо кнопки на экране обрезанный текст. Переводчик пропустил строку в немецком файле — и часть текста осталась на английском, хотя релиз уже вышел. QA находит опечатку в описании сезонного события за два часа до старта, когда доставить исправление игрокам до старта уже не успеть.

Формально это несложная правка — одна строка текста. Но «исправить» на практике значит: поменять строку в ресурсах, пересобрать клиент, дождаться ревью в App Store и Google Play (от нескольких часов до нескольких дней), и только потом выпустить патч — ради одного слова. Если у игры живая экономика ивентов и сезонных баннеров, такие правки в локализации случаются регулярно, а не раз в полгода. Умножьте это на количество языков — и починка переводов превращается в отдельный, скучный и дорогой процесс, который добавляет сборку и выпуск обновления к каждой правке текста.

Что такое Veresk

Если вы не читали введение в Veresk — коротко: Veresk — это сервис удалённой конфигурации. Значения лежат в файлах (часто JSON, но не только), которые редактируются в браузере и публикуются на CDN версиями. Игра забирает их через SDK (Node.js, Unity) или по HTTP — без пересборки и без похода в сторы. Подробнее — в предыдущем посте о Veresk.

Для локализации это означает одно: переводы — такой же конфиг, как и здоровье босса. Поменять строку в проде можно за минуту, без релиза.

Пример файла локализации
Пример файла локализации

Чиним перевод кнопки

Возьмём кнопку «Играть» и её испанский перевод. Подпись Jugar ahora не помещается в кнопку — меняем её на Jugar, публикуем тестовую версию и проверяем интерфейс. После проверки переносим файл в production — новую сборку игры выпускать не нужно.

Предполагается, что строки локализации уже вынесены в конфиг — по файлу на язык, например localization_ru, localization_en, localization_es. Каждый файл — плоский словарь: ключ строки → перевод.

Код
{
  "button.play": "Jugar",
  "button.settings": "Ajustes",
  "event.weekend_boost.title": "¡Fin de semana de XP doble!"
}
Код
- "button.play": "Jugar ahora"
+ "button.play": "Jugar"

Дальше процесс выглядит так:

  1. Переводчик или дизайнер открывает Veresk в браузере и находит файл localization_es в staging-версии.
  2. Меняет значение по ключу button.play с Jugar ahora на Jugar.
  3. Смотрит diff — Veresk показывает, что изменилось относительно текущей production-версии.
  4. Публикует staging-версию, чтобы изменение стало доступно тестовой сборке.
  5. Тестирует на staging-сборке, которая тянет конфиг из staging-версии, и проверяет, что подпись помещается в кнопку.
  6. Если всё ок — переносит изменённый файл из staging в production одним действием в интерфейсе.
  7. Публикует production-версию. После того как игра в следующий раз загрузит конфигурацию и применит новые строки в интерфейсе, игрок увидит исправленный перевод.

В этой игре локализация загружается при старте: клиент один раз запрашивает файл для текущего языка и подставляет строки в интерфейс. Поэтому исправленный перевод игрок увидит при следующем запуске игры, а не мгновенно, пока сессия уже идёт. Если нужного ключа в файле нет — используем английский как резервный язык; если CDN недоступен — Unity SDK отдаёт последнюю закэшированную на устройстве версию конфига.

Коротко про код

Загрузка конфига по языку игрока выглядит так же, как для любого другого конфига в Veresk. На Unity:

Код
var locale = GameSettings.Language; // код языка берём из настроек игры: "es", "ru", "en"...
var configs = await VereskAPI.LoadConfigs(new[] { $"localization_{locale}" });
var strings = JsonConvert.DeserializeObject<Dictionary<string, string>>(configs[$"localization_{locale}"]);
playButton.text = strings.TryGetValue("button.play", out var label) ? label : "Play";

Для серверной части (например, если вы рендерите пуш-уведомления или письма на нескольких языках) — то же самое через Node.js SDK.

Если вы работаете с AI-агентами

Агент может не только менять числа в балансе, но и работать со строками. Например, добавить новый ключ сразу во все языковые файлы (с временным плейсхолдером там, где перевода ещё нет) или поправить конкретную строку по описанию проблемы:

Вы: В немецком файле для ключа button.play стоит заглушка на английском, переведи и опубликуй в staging.
Агент: читаю localization_en и localization_de, перевожу строку, публикую. Готово: button.play = "Spielen" в staging localization_de.

Создавать новые проекты или менять роли агент через MCP не может — это вне доступа токена. А вот создать версию (create_version) агенту вполне по силам.

Попробовать на своём проекте

Если игра уже загружает переводы из словарей по ключам, начните с одного языка: перенесите его файл в Veresk и подключите получение опубликованной версии — остальные языки можно перенести позже.

Запустить Veresk на своём проекте можно без долгих интеграций — с чего начать, смотрите в быстром старте, условия использования — на сайте. SDK есть для Unity и Node.js; другие движки могут получать опубликованные файлы HTTP-запросами к CDN. Если нужна интеграция с другим движком (привет, Godot) — пишите, расширяем по запросам сообщества.

Комментарии (1)

Войдите, чтобы написать комментарий

Войти
Large Spinner