codemix\localeurls\UrlManager::processLocaleUrl PHP Метод

processLocaleUrl() защищенный Метод

If no parameter is found it will try to detect the language from persistent storage (session / cookie) or from browser settings.
protected processLocaleUrl ( $request )
    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));
        }
    }