5 уроков локализации из разработки игры в Telegram

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Многие разработчики хотят, чтобы их продукт был доступен максимально широкому кругу пользователей. И локализация на языки целевой аудитории может достаточно положительно сказаться на её росте. Вряд ли в данной статье будет что-то новое для людей, которые собаку съели на локализации, однако постараюсь поделиться максимально полезными советы по реализации для тех, кто только начинает свой путь.

Я являюсь выпускником МИП-15 2023. В свободное от работы время делаю фэнтезийное MMORPG в телеграме - Krezar Tavern. Не модные нынче миниаппы, а классический чат-бот, без монетизации, блокчейнов и прочего, чисто пет-проект для души. Все исходники лежат в открытом доступе на гитхабе.

Урок 1. Форматирование строк

Дано: два персонажа имеют возможность устроить дуэль. У текста начала дуэли может быть 1 и более вариаций для каждого языка. В каждом тексте упоминаются два участника в произвольном порядке.

Давайте напишем наивную реализацию и попробуем её улучшить:

public static String initDuel(Language language, Personage initiator, Personage acceptor) {
   final var templates = switch (language) {
       case RU -> List.of(
           initiator.badgeWithName() + " явно намеревается дать по щам " + acceptor.badgeWithName() + "!",
           "Гоп стоп! " + acceptor.badgeWithName() + " стопанули за углом таверны! " + initiator.badgeWithName()
               + " - серьезная персона и не собирается церемониться на дуэли!"
       );
       case EN -> List.of(initiator.badgeWithName() + " starts a duel with " + acceptor.badgeWithName() + "!");
   };
   return RandomUtils.getRandomElement(templates);
}

Какие тут недостатки?

  • Лишние конкатенации строк. По факту нам нужна одна готовая строка, а не все.

  • Легко ошибиться при копипасте. Субъективно, но по ощущением именно так.

  • Сложно читать

Форматирование в стиле СИ-строк

"%s явно намеревается дать по щам %s!".formatted(initiator.badgeWithName(), acceptor.badgeWithName())

Выглядит уже красивее, однако лишнее создание строк никуда не делось.

Форматирование с позиционными аргументами

"{0} явно намеревается дать по щам {1}!";
....
MessageFormat.format(RandomUtils.getRandomElement(templates), initiator.badgeWithName(), acceptor.badgeWithName())

Уже лучше, мы контролируем порядок слов, не создаем строки лишний раз, но страдает читаемость. Без контекста не понять, что такое 0, а что такое 1. На этом примере не так видно, но посмотрим сюда:

final var template = """
						
Источник: https://habr.com/ru/companies/miip/articles/832950/


Интересные статьи

Интересные статьи

Разбираемся как создать приложение внутри Telegram на примере кликера. Добавляем работу с интерфейсом Telergam и авторизацию через его Telegram аккаунт. Часть 2 из цикла TMA на KMP.
В марте 2008-го на Ютубе появился самый короткий рассказ про неношеные ботиночки детектив. Кажется, что суть видео — раскрыть тайну убийства за одну минуту. Но не все так просто, если учитывать, что в...
Где-то в Европе. Цель игры: из пункта А попасть в пункт Б и затем вернуться в пункт А.Проснувшись наутро, вы понимаете, что нужно собрать документы для выписки удаленно из одного реестра. Какие докуме...
Предыстория Год назад решил я создать телеграм бот для того, чтобы поиграть в достаточно популярную новогоднюю игру «Тайный Санта». Вдохновился я тем, что пару лет назад мы на работе компани...
[Первая, вторая и третья части туториала] Поддержка разных типов башен. Создание башни-мортиры. Вычисление параболических траекторий. Запуск взрывающихся снарядов. Это четвёртая часть ...