Isolution666
@Isolution666
Full-Stack Developer

Как на Yii2 сделать перевод сайта с помощью кеша (куки)?

Предыстория: есть сайт vaigmania.ru
У него меняется язык сайта, замещая переменную. То есть, когда выбирается другой язык, происходит POST запрос, который подставляет переменной иное значение, которое хранится в печеньках ;) [куки] на сутки, потом язык слетает.
По тому же принципу я хочу менять язык на Yii2 advanced
в $cache = \Yii::app()->cache; я буду хранить кеш языка, но хотелось бы чтобы держалось не меньше года.
Как хранить кеш на чистом php - я умею и знаю, с конструкциями Yii cache у нас пока вражда и недопонимание.
Как я вижу этот способ:
'language' => [
        'class' => 'app\modul\languages\Lang',
        'languages' => [        //Языки используемые в приложении
            'English' => 'en',
            'Русский' => 'ru',
        ],   //  или Lang::getArrayLang()
        'default_language' => 'ru', //основной язык (по-умолчанию)
    ],

--------------------------
Альтернатива для расширяемости функционала:
public function getArrayLang()
{
     return  [        //Языки используемые в приложении
            'English' => 'en',
            'Русский' => 'ru',
        ];  // если понадобится можно впихнуть массив из БД, но пока такой нужды нет
}


-------------------------------------------------------------------------------------
То есть создать класс, который будет отслеживать и обрабатывать событие, по клику:
$items = Yii::$app->language->languages;
<?=Html::dropDownList('lang', 'null', $items);?>


Как-то так будет выглядеть сам класс:
<?php 
...
namespace \tram\pam\pam;
...
use Yii;

class Lang extends \yii\web\UrlManager 
{
     static $lang; //строка вида ru|en|
     public $default_language
     public $languages

     public function langManager()
     {
             $params = Yii::$app->request->post();
             $cache = \Yii::app()->cache;
             if (empty($params['lang'])) {
            //текущий язык приложения
            $curentLang = Yii::$app->language->default_language;
           } else {
                  $cache->set('lang');
                  $curentLang = $cache->get('lang')
           }
           return $curentLang;
     }



}

То есть мне нужно получать <?=Lang::langManager();?>
Для <?=Yii::$app->language;?>, но только для frontend

Вопрос: В верном ли направлении я иду? Как получать язык отдельно для backend и отдельно от frontend?
Что дописать, чтобы кеш на язык длился год, или около года? Хранил ли кто-то язык через кеш, не прибегая к смене урлов?
В основном я вижу про мультиязычность сайта, что они подставляют в ссылку нужный адрес, создавая отдельные страницы.
Мне не нужны отдельные страницы, так как через render и я сам могу получить любую страницу или кусок страницы в зависимости от значения текущего языка.

Смысл в том чтобы через POST запрос отправлять в кеш "ru" или "en"
Я вообще хотел сделать через:
<?=Html::a('EN', '/siteen', ['data-method' => 'post']);?>
<?=Html::a('RU', '/siteru', ['data-method' => 'post']);?>

Но это может означать привязку к каждому контроллеру, в поведении - что не совсем адекватно.
В общем, какие мысли, советы, соображения на этот счёт?
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 3
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
У Вас кеш не зависит от пользователя, то есть по сути это общая переменная и как следствие Вася сменит своим post язык для всех остальных.
Так что затея так себе. А чем история с параметром в url не устраивает, это удобно, привычно, хорошо для seo и есть из коробки. В чем смысл Вашей затеи?
Как вариант можно в сессии хранить, но там другие подводные камни.
Ответ написан
@iSensetivity
бухгалтер, програміст-самоук
https://github.com/codemix/yii2-localeurls
Умеет в куки, в автоопредиление язьіка, с префиксом в url или без.
Ответ написан
Isolution666
@Isolution666 Автор вопроса
Full-Stack Developer
Решение найдено!
Надо создать модель, а в ней функцию наследующую от класса преложения, переопределить переменную, отвечающую за вывод языка, и готово!
Естественно надо объявить ещё две переменные, одна будет значением по умолчанию, если язык не выбран, а вторая за хранение куки!
К сожалению, я пока не разобрался как переводить отдельно бекенд и фронтенд, но думаю в скором времени и это сделаю, так как в документации по мультиязычности уже был пример с урлами, значит осталось дописать условия, откуда выводится представление, такой и язык.
Если мы можем определить контроллер Yii::app()->controller->id - значит сможем определить откуда берётся вьюшка, потому как у бекенда и фронтенда контроллеры разные.
Если не понятно, дам инструкции индивидуально, писать на мою электронную почту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы