Найти тему

Автоматическое определение языка в Яндекс SDK на Game Maker

Добрый день, дорогие читатели! Это очередная статья, написанная по просьбам читателей. И так уж вышло, что она не совсем для начинающих, а это немного не соответствует тематике моего канала. По этому решил написать так, чтобы сильно не захламлять вам мозг, а выбрать только важную информацию. Думаю эта информация точно хоть кому-то окажется полезной.

Предисловие

Что вообще послужило поводом написать эту статью, помимо того, что меня об этом попросили? А дело вот в чем.

Как-то я на своем канале рассказывал, как пытался пройти модерацию на Яндекс Играх со своей игрой и мне отклонили заявку по причине того, что язык в игре не определялся автоматически на старте. Со статьей можно ознакомиться по этой ссылке:

Т.е. у меня в самой игре был встроен выбор языка (русский, английский, турецкий), в черновике по размещению игры на портале Яндекс Игр я указал, что игра доступна на этих языках, а также подготовил описание страницы на каждом из этих языков. Но условия размещения на портале таковы, что при запуске, например, из Турции, игра по дефолту должна иметь турецкий язык. Т.е. не игрок должен переключить на удобный для него язык при запуске, а игра должна автоматом это сделать за него. Давайте посмотрим, как это сделать на Game Maker.

Теория

Для начала давайте посмотрим, как именно определяется язык. В Yandex SDK есть объект environment, который позволяет получить информацию об окружении, в котором работает игра. По этой ссылке вы можете почитать оригинальную справку СДК Яндекса:

Переменные окружения

Оттуда нас интересует структура i18n, а с нее параметр lang. Сами Яндекс рекомендуют использовать именно этот параметр для автоматического определения языка пользователя.

Это было немного сложным языком. А теперь более простым. Яндекс СДК, который мы встраиваем в нашу игру, созданную на Game Maker, знает откуда эту игру запустили (он "видит" браузер игры, с какого домена запущена игра, на каком языке читают пользователи, запустившие игру и т.д.). Мы можем "попросить" у Яндекс СДК эту информацию и уточнить оттуда то, что нам нужно, а именно родной язык игрока, а уже в зависимости от этого переключить в нашей игре на нужный нам язык. Давайте посмотрим на практике.

Подготовка

Для начала нам нужно скачать уже ранее упомянутое бесплатное расширение "Yandex Games SDK HTML5" по этой ссылке:

Yandex Games SDK HTML5 by trueDev | GameMaker: Marketplace

С него нужно будет создать локальный пакет, для последующего встраивания в нашу игру. Как это делать, я подробно описывал в статье, по встраиванию рекламы с этого расширения:

Повторяться не буду. Единственное, для определения языка нам потребуется экспортировать немного другие компоненты, а именно:

Необходимые для экспорта компоненты при создании локального пакета
Необходимые для экспорта компоненты при создании локального пакета

Вообще, вы можете экспортировать все с этого расширения, нажав "Add All", а потом импортировать в ваш проект только нужные вам компоненты, чтобы по несколько раз не создавать разные пакеты.

Сохраняем этот локальный пакет на жестком диске. Закрываем проект, с которого экспортировали пакет. Открываем проект с вашей игрой и импортируем в него эти два компонента с только что созданного локального пакета:

  • объект obj_button_getEnvironment
  • скрипт isMap

Все! Далее мы готовы к написанию кода для автоматического определения языка.

Делаем автоматическое определение языка из Яндекс SDK

Ну вот мы наконец добрались и до самого главного. Тут не буду много объяснять, так как для новичков это будет очень сложно к пониманию. Если вкратце, то выше я рассказывал, что с Яндекс СДК можно запросить информацию через объект environment. Вся проблема в том, что ответ на наш запрос мы получим вот в таком виде, откуда нам нужно выдернуть данные только о языке (выделил желтым на скриншоте ниже):

Получение информации на запрос от объекта environment из Яндекс СДК
Получение информации на запрос от объекта environment из Яндекс СДК

Как это сделал я? Редактируем наш импортированный из локального пакета объект obj_button_getEnvironment, для начала убедившись, что у него нет никакого родителя (parent) (если есть, то смените на No Object), а так же сделайте этот объект постоянным (Persistent):

Убираем родителя и делаем объект постоянным
Убираем родителя и делаем объект постоянным

Оставьте только следующие события в объекте (какие не нужно - удалите, каких нет - добавьте). Главное событие для нас Async, собственно из за него и импортировали (можно было конечно и с нуля написать).

Список событий в объекте obj_button_getEnvironment
Список событий в объекте obj_button_getEnvironment

Далее в событии создания (Create) пишем код:

Код в событии создания
Код в событии создания

В событии шага (Step) пишем:

Код в событии шага
Код в событии шага

А в событии Async лишь немного редактируем:

Код в событии Async (выделил часть, которую мы редактируем)
Код в событии Async (выделил часть, которую мы редактируем)

Далее создаем этот объект в событии создания вашей самой первой комнаты в игре. По идее все должно работать. Этот объект определит язык и после этого удалится.

Немного разъяснений

Кто не хочет просто бездумно переписывать код, а немного вникнуть, то постараюсь разъяснить, что именно мы сделали.

В событии Async мы выдергиваем из запроса данные о языке и записываем их в переменную lang, а таже переводим переменную done с false, на true. Переменная done отвечает за то, что мы прочитали и получили данные о языке.

В каком виде мы получаем эти данные? Это строковое значение по стандарту ISO639-1, вида "en","ru","tr" и т.д. Полная таблица с расшифровкой ниже.

Поддерживаемые языки и их расшифровка
Поддерживаемые языки и их расшифровка

Далее в событии шага мы проверяем переменную done. Т.е. если она равна true, то язык игрока от Яндекс SDK получен и его можно проверить. Что я и делаю. А потом в зависимости от полученного с SDK языка меняю внутреннюю переменную в самой игре, которая у меня отвечает за смену текстов global.language. После чего нам данный объект не нужен и мы его уничтожаем.

Давайте подробнее остановимся на этом куске кода из события шага:

if lang=="ru" or lang=="be" or lang=="kk" or lang=="uk" or lang=="uz" {
global.language=0
} else if lang=="tr" {
global.language=2
} else {
global.language=1
}

Т.е. я в данном случае проверяю, если от Яндекс СДК получено какое-то из этих значений: "ru","be","kk","uk","uz" (русский, белорусский, казахский, украинский и узбекский соответственно), то переключаю переменную global.language на 0 (а это в свою очередь означает, что весь текст в игре будет на русском).

Если lang не равна этому значению, то проверяю не равна ли она "tr" (турецкий) и если да, то переключаю, global.language на 2 (т.е. весь текст в игре будет на турецком).

И если lang не равна и этому значению, то для всех остальных случаев переключаю переменную global.language на 1 (что означает, что весь текст в игре будет на английском).

Вы код в событии шага можете менять под себя как угодно, главное понимайте, что вы получаете в переменной lang и что нужно вам сделать в зависимости от полученного значения.

Как проверить, что все работает?

По этой ссылке в официальной документации Яндекс СДК есть подсказка, как это можно сделать:

Поддержка языков и доменов

Я сейчас могу ошибиться, пишу по памяти, но если вкратце, то принцип вроде такой. Вы загружаете ваш архив с HTML5 игрой в черновик на Яндекс Играх, дожидаетесь проверки и сохраняете (все как обычно). Когда вам будет предоставлена ссылка, чтобы протестировать игру, вы кликаете по ней, игра запускается.

А после этого вы можете в строке ссылки в браузере внести корректировки, имитируя тем самым запуск с интересующей вас страны: будь то Турции или Испании. Для этого нужно вводить вышеуказанные двузначные коды "tr" или "es" и т.д. в самой ссылке.

Только вот куда именно, я вам не подскажу по памяти. Но думаю разберетесь интуитивно. Либо скинете ссылку в комментарии на игру с вашего черновика и я наглядно увижу и вспомню где и что там нужно подкорректировать для тестов.

А это просто скриншот из моей текущей игры в разработке для обложки статьи :-)
А это просто скриншот из моей текущей игры в разработке для обложки статьи :-)

Спасибо, что вы дочитали статью до конца! Надеюсь, что статья оказалась не такой уж и сложной и что на основании нее вы все таки сможете настроить автоматическое определение языка. Если что-то будет непонятно, то задавайте вопросы, постараюсь подсказать. Ставьте лайки - это единственный показатель для меня, что статья вам понравилась, оказалась полезной и что следует продолжать писать. Так же подписывайтесь на канал, чтобы не пропустить важную, полезную и интересную информацию. Всем спасибо!