Задать вопрос
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']);?>

Но это может означать привязку к каждому контроллеру, в поведении - что не совсем адекватно.
В общем, какие мысли, советы, соображения на этот счёт?
  • Вопрос задан
  • 203 просмотра
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 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 - значит сможем определить откуда берётся вьюшка, потому как у бекенда и фронтенда контроллеры разные.
Если не понятно, дам инструкции индивидуально, писать на мою электронную почту.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы