Привет.
В 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’), потому что редирект не находил представление для отображения.
Большое спасибо за решение …
Вы можете сделать как ниже в 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 или базу данных и так далее.
Других решений пока нет …