protected function processLocaleUrl($request)
{
$this->_request = $request;
$pathInfo = $request->getPathInfo();
$parts = [];
foreach ($this->languages as $k => $v) {
$value = is_string($k) ? $k : $v;
if (substr($value, -2) === '-*') {
$lng = substr($value, 0, -2);
$parts[] = "{$lng}\\-[a-z]{2,3}";
$parts[] = $lng;
} else {
$parts[] = $value;
}
}
$pattern = implode('|', $parts);
if (preg_match("#^({$pattern})\\b(/?)#i", $pathInfo, $m)) {
$request->setPathInfo(mb_substr($pathInfo, mb_strlen($m[1] . $m[2])));
$code = $m[1];
if (isset($this->languages[$code])) {
// Replace alias with language code
$language = $this->languages[$code];
} else {
// lowercase language, uppercase country
list($language, $country) = $this->matchCode($code);
if ($country !== null) {
if ($code === "{$language}-{$country}" && !$this->keepUppercaseLanguageCode) {
$this->redirectToLanguage(strtolower($code));
// Redirect ll-CC to ll-cc
} else {
$language = "{$language}-{$country}";
}
}
if ($language === null) {
$language = $code;
}
}
Yii::$app->language = $language;
Yii::trace("Language code found in URL. Setting application language to '{$language}'.", __METHOD__);
if ($this->enableLanguagePersistence) {
Yii::$app->session[$this->languageSessionKey] = $language;
Yii::trace("Persisting language '{$language}' in session.", __METHOD__);
if ($this->languageCookieDuration) {
$cookie = new Cookie(array_merge(['httpOnly' => true], $this->languageCookieOptions, ['name' => $this->languageCookieName, 'value' => $language, 'expire' => time() + (int) $this->languageCookieDuration]));
Yii::$app->getResponse()->getCookies()->add($cookie);
Yii::trace("Persisting language '{$language}' in cookie.", __METHOD__);
}
}
// "Reset" case: We called e.g. /fr/demo/page so the persisted language was set back to "fr".
// Now we can redirect to the URL without language prefix, if default prefixes are disabled.
if (!$this->enableDefaultLanguageUrlCode && $language === $this->_defaultLanguage) {
$this->redirectToLanguage('');
}
} else {
$language = null;
if ($this->enableLanguagePersistence) {
$language = Yii::$app->session->get($this->languageSessionKey);
$language !== null && Yii::trace("Found persisted language '{$language}' in session.", __METHOD__);
if ($language === null) {
$language = $request->getCookies()->getValue($this->languageCookieName);
$language !== null && Yii::trace("Found persisted language '{$language}' in cookie.", __METHOD__);
}
}
if ($language === null && $this->enableLanguageDetection) {
foreach ($request->getAcceptableLanguages() as $acceptable) {
list($language, $country) = $this->matchCode($acceptable);
if ($language !== null) {
$language = $country === null ? $language : "{$language}-{$country}";
Yii::trace("Detected browser language '{$language}'.", __METHOD__);
break;
}
}
}
if ($language === null || $language === $this->_defaultLanguage) {
if (!$this->enableDefaultLanguageUrlCode) {
return;
} else {
$language = $this->_defaultLanguage;
}
}
// #35: Only redirect if a valid language was found
if ($this->matchCode($language) === [null, null]) {
return;
}
$key = array_search($language, $this->languages);
if ($key && is_string($key)) {
$language = $key;
}
$this->redirectToLanguage($this->keepUppercaseLanguageCode ? $language : strtolower($language));
}
}