Fork me on GitHub

Локализация

На клиентской стороне для обеспечении локализации используется класс 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()