«Локализация — это перевод и культурная адаптация продукта к особенностям определенной страны, региона или группы населения». — Википедия
Это значит, что при создании любой игры, рассчитанной на широкую аудиторию, неизбежно возникает задача локализации — перевода игры на те языки, на которых общаются игроки.
Одного перевода недостаточно. В любой стране существуют и свои культурные особенности. К ним также относятся особенности религии, традиций, вкусов и даже законодательства. Мы не будем детально рассматривать этот вопрос. Подробнее о задачах локализации игр можно почитать, например, в статье на сайте разработчиков игр DTF.
Займёмся рассмотрением подзадач локализации, связанных с переводом. Scratch поможет понять основные принципы разработки многоязычных игр и программ (приложений), которые несложно реализовать и на любых других языках программирования. Чтобы было всё логично и понятно даже новичкам, приведём примеры нескольких заготовок многоязычного проекта, в которых поэтапно приближаемся к итоговому проекту.
Локализация — 1 заготовка
Базовый функционал (нажать на зелёный флажок):
— изменение костюма спрайта при наведении мыши на кнопку
— вывод языкового сообщения-подсказки при наведении мыши на кнопку
— два вспомогательных блока для переключения языка русский/английский:
задаём значение переменной language — ru или en, соответственно. Сменить язык можно, войдя внутрь проекта и кликнув мышью по одному из этих вспомогательных блоков.
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508340187/
Локализация — 2 заготовка
Это продолжение предыдущего проекта.
Базовый функционал (нажать на зелёный флажок):
— добавлены кнопки переключения языка русский/английский
— клик по кнопка переключения языка задает соответствующее значение переменной language
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508344783/
Локализация — 3 заготовка
Базовый функционал (нажать на зелёный флажок):
— добавлены состояния активности для кнопок переключения языка русский/английский для индикации текущего выбранного языка
— задано значение по умолчанию — русский язык
— добавлен перевод надписи на кнопке Старт/Start на выбранный язык. В результате у спрайта кнопки теперь не 2, а 4 костюма. А в скрипте дополнительное ветвление для смены костюмов в зависимости от языка (значения переменной language).
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508350044/
Локализация — 4 заготовка
Базовый функционал (нажать на зелёный флажок):
— добавлены персонажи, которые общаются на двух языках (урок по созданию диалога здесь)
— персонажи появляются после нажатия кнопки Старт/Start (как это сделать, см. во 2-й части того же урока)
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508368111/
А что если у нас не 2, а намного больше языков?
Рассмотрим аналогичным образом ещё несколько заготовок.
Локализация (много языков) — 1 заготовка
Базовый функционал (нажать на зелёный флажок):
— изменение костюма спрайта при наведении мыши на кнопку
— вывод языкового сообщения-подсказки при наведении мыши на кнопку
— четыре вспомогательных блока для переключения языка русский/английский/немецкий/белорусский: задаём значение переменной language — ru, en, de или by, соответственно. Сменить язык можно, войдя внутрь проекта и кликнув мышью по одному из этих вспомогательных блоков.
По сравнению с заготовкой для двух языков (https://scratch.mit.edu/projects/508340187/) видим более сложное вложенное ветвление и более длинный код. Если языков будет ещё больше, ветвление будет ещё глубже.
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508375527/
Локализация (много языков) — 2 заготовка
По сравнению с 1-й заготовкой выносим ветвление для анализа заданного языка в
Другой блок Определить язык и вывести …
Базовый функционал (остаётся прежним):
— изменение костюма спрайта при наведении мыши на кнопку
— вывод языкового сообщения-подсказки при наведении мыши на кнопку
— четыре вспомогательных блока для переключения языка русский/английский/немецкий/белорусский: задаём значение переменной language — ru, en, de или by, соответственно
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508621387/
Локализация (много языков) — 3 заготовка
Даже использование Другого блока во 2-й заготовке не решает проблему, которая возникнет, если языков будете ещё больше.
Поэтому начнём использовать списки.
В данной заготовке пока не совсем ясно, что нам это даёт (профессиональные программисты такие преобразования кода называют рефакторингом). Продолжение — в заготовке 4.
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508623308/
Локализация (много языков) — 4 заготовка
Продолжаем совершенствовать проект на базе 3-й заготовки:
— добавляем новый спрайт-кнопку переключения языков. Костюмы этого спрайта имеют имена ru, en, de, by — точно такие, какими должны становиться значения переменной language
— клик по кнопке переключения языков задаёт значение переменной language, беря его из имени костюма этого спрайта
— добавляем спрайт Text-Start для вывода надписей на кнопке Старт на разных языках. Костюмы этого спрайта тоже имеют имена ru, en, de, by. Это позволяет одной командой смены костюма с параметром — переменной language заменить надпись.
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508628582/
Локализация (много языков) — 5 заготовка
Продолжаем совершенствовать проект на базе 4-й заготовки:
— добавляем спрайты для участников диалога игровых персонажей
— дополняем списки для вывода сообщений и реплик диалога
— пишем скрипт диалога персонажей (пример такого диалога на основе списков здесь, а урок здесь (см. часть 1). Но в данном проекте мы немного изменили тактику, и для всех реплик обоих персонажей используем один и тот же список. Реплики в нём идут через одну: одна первого персонажа, вторая — второго и т.д. И так для каждой языковой версии. Если списки продолжить (добавить элементы с новыми репликами), продолжится и диалог персонажей (без необходимости писать новый код).
Войти внутрь проекта можно по ссылке https://scratch.mit.edu/projects/508654906/
Какие ещё задачи мы не рассмотрели?