Локализация
На клиентской стороне для обеспечении локализации используется класс Lang public/js/app/lang.js
.
Основное назначение этого класса - это получить с серверной стороны
(если это необходимо) данные перевода для текущего языка и сохранить их в
локальной базе данных. Организация локальной базы данных обеспечивается
библиотекой public/js/lib/jstorage/jstorage.js
.
Подробности по библиотеке jStorage можно посмотреть здесь.
Получить данные для перевода
Данные в локальной базе данных хранятся определенное время. Время хранения
данных в локальной базе задается переменной ttl_jstorage
в функции инициализации init
класса System public/js/app/system.js
.
Пример кода приведен ниже:
...
init: function () {
this.settings = {
message_box: 'msg-box', // 'alert-box', 'alert-block-box'
ttl_jstorage: 3600000 // 1h=3600000
};
...
Данные для перевода мы получаем методом getTransData
класса Lang public/js/app/lang.js
.
В методе getTransData
мы проверяем изменились ли данные перевода на сервере
по сравнению с данными в локальной базе данных. Если не изменились, то данные
перевода с сервера не грузятся.
Пример проверки приведен ниже:
...
// Get translation data
translate = $.jStorage.get("trans");
if (translate) {
hash = translate.hash;
if (this.lang_hash === hash) {
return;
}
}
...
Если данные перевода изменились или они отсутствуют в локальной базе данных, то происходит запрос на обновление данных перевода с сервера.
Пример запроса на обновление данных перевода с сервера приведен ниже:
...
onAjaxSuccess = function (jsonData) {
// Get language data
if (jsonData.hash) {
// Set data for TTL
$.jStorage.set("trans", jsonData);
$.jStorage.setTTL("trans", ttl_jstorage);
}
};
// Send ajax request to the server
url = this['urlBase'] + '/lang';
this.sys.post(url, {hash: hash}, onAjaxSuccess, false);
...
Обработка запроса на сервере происходит с помощью метода langAction
в классе IndexController app/Controllers/IndexController.php
Пример кода приведен ниже:
...
if ($this->isAjaxRequest()) {
// get hash for translation messages
$hash = $this->getLangHash();
if (isset($this->params['hash']) && $this->params['hash'] !== $hash) {
$arTrans = $this->getLangMsgs();
$data['hash'] = $hash;
$data['values'] = $arTrans;
}
return $this->sendJson($data);
}
...
Использование
Функция перевода реализована с помощью метода trans
класса Lang public/js/app/lang.js
.
На клиенте метод trans можно использовать так:
remaining == 1 ? app.lb.trans('task').capitalize() : app.lb.trans('tasks').capitalize()