Answer the question
In order to leave comments, you need to log in
Yii2 redirect() not working correctly in multilingual site?
Hello!
I made a website while reading this article
,
but when redirecting something went wrong,
for example, if I write like this
$this->redirect(['login']);
или
$this->redirect(['/login']);
<?php
namespace app\components;
use Yii;
use yii\web\Request;
use app\models\Language;
class LangRequest extends Request{
private $_lang_url;
public function getLangUrl(){
if ($this->_lang_url === null) {
$this->_lang_url = $this->getUrl();
if(empty(Yii::$app->controller->module)){
$url_list = explode('/', $this->_lang_url);
if(isset($url_list[1]) && $url_list[1] !== Yii::$app->session->get('__lang')){
Language::setCurrent($url_list[1]);
}
$lang_url = Yii::$app->session->get('__lang');
if( $lang_url !== null && $lang_url === Yii::$app->session->get('__lang') && strpos($this->_lang_url, Yii::$app->session->get('__lang')) === 1 ){
$this->_lang_url = substr($this->_lang_url, strlen(Yii::$app->session->get('__lang'))+1);
}
}
}
return $this->_lang_url;
}
protected function resolvePathInfo(){
$pathInfo = $this->getLangUrl();
if (($pos = strpos($pathInfo, '?')) !== false) {
$pathInfo = substr($pathInfo, 0, $pos);
}
$pathInfo = urldecode($pathInfo);
if (!preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $pathInfo)) {
$pathInfo = utf8_encode($pathInfo);
}
$scriptUrl = $this->getScriptUrl();
$baseUrl = $this->getBaseUrl();
if (strpos($pathInfo, $scriptUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($scriptUrl));
} elseif ($baseUrl === '' || strpos($pathInfo, $baseUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($baseUrl));
} elseif (isset($_SERVER['PHP_SELF']) && strpos($_SERVER['PHP_SELF'], $scriptUrl) === 0) {
$pathInfo = substr($_SERVER['PHP_SELF'], strlen($scriptUrl));
} else {
throw new InvalidConfigException('Unable to determine the path info of the current request.');
}
if ($pathInfo[0] === '/') {
$pathInfo = substr($pathInfo, 1);
}
return (string) $pathInfo;
}
}
Answer the question
In order to leave comments, you need to log in
Ready and working UrlManager for multilingualism, with help and docs: https://github.com/codemix/yii2-localeurls
Video on multilingualism in general:
https://youtu.be/J9IZFXcIKb4
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question