Как в 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 вот например свежая тема на форуме. Посмотрите примеры, походите по ссылкам.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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