Yii2 — сделать гиперссылку для переключения между языками

Привет.

В Yii1.1 я мог сделать действие в siteController и затем использовать: Yii::app()->controller->createUrl('actionname', array('language'=>'new language to toggle'));

Мне удалось создать гиперссылки с CHTML в индексном файле, и при нажатии эти гиперссылки изменили весь перевод сайта с португальского на другой язык и наоборот.

Теперь я начинаю с Yii2, и у контроллера больше нет функции createUrl (). Также другие методы не работают таким образом. Я попытался запустить, runAction, попытался с классом Url :: и ничего.

Кроме того, в Yii2 делает <?php echo Html::a('Portuguese', Yii::$app->language = "pt"); ?>
Ничего не делает !!! При нажатии гиперссылка не меняет язык сайта.


Кто-нибудь знает, как создать гиперссылку или каким-либо другим способом в Yii 2, который переключает полностью весь язык сайта. Мне нужно иметь две версии этого сайта -> английский и португальский.

Мне нужно выступить так -> при щелчке по английскому слову оно переводится на английский, а при щелчке по португальскому слову — сайт меняется на португальский.

Есть идеи ??

Спасибо заранее.


НОВОЕ РЕДАКТИРОВАНИЕ ВОПРОСА
Я написал этот код в моем siteController, и теперь сайты переключают языки, но только при втором щелчке мыши происходит переключение, и содержимое обновляется. Кто-нибудь знает почему?

Вот мои действия

public function beforeAction($action) {
if (Yii::$app->session->has('lang')) {
Yii::$app->language = Yii::$app->session->get('lang');
} else {
Yii::$app->language = 'us';
}
return parent::beforeAction($action);
}

public function actionLangus(){
Yii::$app->session->set('lang', 'us'); //or $_GET['lang']
return $this->render('index');
}

public function actionLangpt(){
Yii::$app->session->set('lang', 'pt'); //or $_GET['lang']
return $this->render('index');
}

Я выбрал рендер (‘index’), потому что редирект не находил представление для отображения.

Большое спасибо за решение …

2

Решение

Вы можете сделать как ниже в Yii2:

\yii\helpers\Html::a('Change Language',\yii\helpers\Url::toRoute(['controller/action',['language'=>'NEW_LANGUAGE']]));
\yii\helpers\Html::a('Change Language',['controller/action',['language'=>'NEW_LANGUAGE']]);

Или же:

use yii\helpers\Html;
use yii\helpers\Url;

Html::a('Change Language',Url::toRoute(['controller/action',['language'=>'NEW_LANGUAGE']]));
Html::a('Change Language',['controller/action',['language'=>'NEW_LANGUAGE']]);

Затем в вашем действии вам нужно сделать:

//validation
Yii::$app->language= "NEW_LANGIAGE";
// store current language using state or cookie or database

ОБНОВИТЬ

код действия:

//please put some validation on $_GET['lang']
Yii::$app->session->set('lang', 'us'); //or $_GET['lang']
$this->redirect('controller/action'); // redirecting user to somewhere

Тогда в вашем контроллере beforeAction:

public function beforeAction($action) {
if (Yii::$app->session->has('lang')) {
Yii::$app->language = Yii::$app->session->get('lang');
} else {
//or you may want to set lang session, this is just a sample
Yii::$app->language = 'us';
}
return parent::beforeAction($action);
}

По приведенному выше коду в каждом действии он проверяет, установлен ли язык в сеансе или нет. Если да, это меняет язык. Если нет, он устанавливает язык us по умолчанию. В вашем действии по изменению языка он просто устанавливает новый язык, который дается из $_GET запрос, в сессию. Затем он перенаправляет пользователя на другую страницу.
Обратите внимание, что это всего лишь предложение, другие могут использовать разные способы, такие как создание загрузочного компонента с использованием контроллера. init() метод, хранение lang в cookie или базу данных и так далее.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]