Как в yii2 прикрутить многоязычность?

Проблема: не меняется язык при изменении его в контроллере, а если менять его прямо во вьюхе, то язык меняется.

Вообщем пытаюсь прикрутить многоязычность к yii2. В yii2 текущий язык меняется через:
\Yii::$app->language = "ru-RU";

В данный момент у меня в главном лейауте(/view/layouts/main) есть 2 изображения со ссылками, которые присутствуют на всех страницах:
<a id="enLang" href="/site/lang?lang=en"><img src="/images/england.png" class="image-responsive" /></a>
<a id="ruLang" href="/site/lang?lang=ru"><img src="/images/russia.png" class="image-responsive" /></a>


При нажатии на ссылку нас перебрасывает на action lang контроллера site. Здесь мы меняем язык в зависимости от параметра $_GET['lang'] и делаем редирект пользователя на страницу где он был.
public function actionLang(){
        switch ($_GET['lang']){
            case 'ru':
                \Yii::$app->language = "ru-RU";
                break;
            case 'en':
                \Yii::$app->language = "en-EN";
                break;
        }
        return $this->redirect(Url::previous());
    }

Но язык НЕ меняется. Также если менять его в layout(view/layouts/main), то тоже не меняется. Однако если менять его прямо во вьюхе, то все работает.

Вопрос: Почему язык не меняется в контроллере? Как сделать правильно/красиво?

Thanks in advance

P.S. В данный момент сделано так: при нажатии на ссылку с языком, в сессию записывается какой язык выбрал пользователь и делается редирект обратно на страницу. А во вьюхе код, который проверяет, если переменная сессии lang не пустая, то меняем язык . Но в каждой вьюхе добавлять такой код глупо.
if(!empty(\Yii::$app->session["lang"])){
    \Yii::$app->language = \Yii::$app->session["lang"];
}
  • Вопрос задан
  • 8703 просмотра
Решения вопроса 1
вы загружаете инстанс приложения, попадая в actionLang, в нем переопределяете language из конфига, затем делаете редирект на другой урл, загружая новый инстанс приложения с НЕпереопредленным language (грузится language из конфига).
Хак с сессией выглядит неплохим, но, конечно, проверять его следует в компоненте, загружающемся в бутстрапе.
yiiframework.ru/forum/viewtopic.php?f=19&t=19390 вот например свежая тема на форуме. Посмотрите примеры, походите по ссылкам.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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