Интернационализация и локализации
Я обещал своей тёте, что закончу с игрой и она сможет поиграть. Поэтому решил реализовать возможность перевести игру
на русский или другой язык. Такая возможность называется интернационализацией, и в кругу разработчиков обозначается
i18n, потому что в английском слове internacionalization между первой i и последней n стоят 18 символов.
В голову пришла настолько простая идея реализации i18n, что даже не пришлось искать готовых решений.
Для каждого HTML элемента, в котором содержится языковой текст, был указан класс 'i18n'. Например:
<span class='i18n'>simple graphics</span>.
В коде игры, заведена структура I18N, в которой содержатся переводы
всех фраз:
// переводы фраз
var I18N = {
"OK": {
ru: "OK",
fr: "bon",
de: "OK",
zh: "确定" },
"simple graphics": {
ru: "простая графика",
fr: "graphiques simple",
de: "einfache Graphik",
zh: "简单图形" },
...
}
При смене языка, для всех элементов класса i18n, их оригинальное содержимое сохраняется в поле origHTML и заменяется
на перевод, указанный в структуре I18N.
Фраза 'N секунд/минут/часов/дней назад' потребовала контекстнозвисимого перевода. Для этого пришлось немного усложнить
логику. В структуре I18N вместо перевода, можно указывать функцию, которая переводит в зависимости от контекста:
"seconds ago": {
en: i18nSecondsAgoEn,
ru: i18nSecondsAgoRu,
fr: " il y a quelques seconds",
de: i18nSecondsAgoDe,
zh: " 秒钟前" },
...
function i18nSecondsAgoRu(context) {
return i18nNumberRu(context, 'секунд', 'секунду', 'секунды');
}
...
function i18nNumberRu(context, num0, num1, num2) {
var num = +context;
var result;
if (num >= 20) {
num = num % 10;
}
if (num == 1) {
result = num1;
} else if (2 <= num && num <= 4) {
result = num2;
} else {
result = num0;
}
return context + ' ' + result + ' назад';
}
Русскую локализацию (l10n = localization) делал я сам, французскую, немецкую и китайскую мне сделали друзья: Юля, Маша
с Сергеем и Алексей.
Таблица достижений
Для игроков, которым важен соревновательный дух, игра дополнена серверной поддержкой таблицы достижений, которая
доступна с главной страницы игры. В таблице достижений для каждого уровня хранится имя игрока, решившего этот уровень
первым.
Играя в режиме online:
- все игроки видят, кто и как давно первым решил текущий уровень;
- после прохождения каждого уровня на сервер отправляется время прохождения уровня, и если этот уровень ещё никто
не прошел, то можно также занести своё имя в таблицу.
Как взломать игру
Уверен, что найдутся умельцы, которые попытаются записаться в таблицу рекордов, не решая задачи из игры.
Хочу сказать, что в лоб это сделать не получится. Чтобы отметить на сервере своё
прохождение уровня, надо предоставить контрольную сумму решения. Эта контрольная сумма также нужна, для того
чтобы перейти к следующему уровень. То есть, каждый уровень в игре закодирован решением предыдущего.
Я также попытался защитить от взлома серверную часть:
- есть проверки для всех входных параметров;
- экранирование специальных символов в SQL запросах;
- экранирование специальных HTML символов в таблице рекордов.
Легко можно испортить статистику по времени прохождения, но она на игру никак не влияет, и сделана только
для приблизительной оценки сложности уровней.
Вопросы подготовки сайта и размещения игры в интернете
Чтобы поделиться игрой не только с друзьями, но и с многочисленной интернет аудиторией, пришлось погрузится в изучение
большого числа сопутствующих технологий: хостинг, регистрация доменного имени, форумы, социальные сети, web services,
openID, ... Все эти термины на слуху у большинства пользователей, но даже для того, чтобы просто решить, подходит
или нет та или иная технология для решения конкретных задач, приходится изучать её глубже.
Денежные вложения
Оказалось, что не всё в этом мире можно сделать бесплатно. Пока затраты на игру довольно скромные: 150 руб/год
за доменное имя, 300 руб/год за простенький хостинг, не отягощённый рекламой. Недавно я перенёс игру на бесплатно предоставленный друзьями хостинг и установил на нём форумный движок phpBB3. Я не планирую переводить Триплекс на коммерческие рельсы,
и постараюсь, чтобы игра осталась бесплатной и свободной от рекламы. В будущем, возможно, выложу исходники
генератора уровней. Хотя, думаю, любому программисту не составит труда написать его самостоятельно, прочитав эту статью.
Заключение
Ну вот вроде бы и всё, о чём пока нашлось время рассказать. Надеюсь игра вам
понравится настолько, насколько мне было интересно её создавать.
Заходите на форум www.quadpuzzle.ru/forum или пишите письма
TriplexQuad@gmail.com. Буду рад любым вашим комментариям.
-Евгений Рубан