public function createUrl($params)
{
if ($this->ignoreLanguageUrlPatterns) {
$params = (array) $params;
$route = trim($params[0], '/');
foreach ($this->ignoreLanguageUrlPatterns as $pattern => $v) {
if (preg_match($pattern, $route)) {
return parent::createUrl($params);
}
}
}
if ($this->enableLocaleUrls && $this->languages) {
$params = (array) $params;
if (isset($params[$this->languageParam])) {
$language = $params[$this->languageParam];
unset($params[$this->languageParam]);
$languageRequired = true;
} else {
$language = Yii::$app->language;
$languageRequired = false;
}
// Do not use prefix for default language to prevent unnecessary redirect if there's no persistence and no detection
if ($languageRequired && $language === $this->getDefaultLanguage() && !$this->enableDefaultLanguageUrlCode && !$this->enableLanguagePersistence && !$this->enableLanguageDetection) {
$languageRequired = false;
}
$url = parent::createUrl($params);
// Unless a language was explicitely specified in the parameters we can return a URL without any prefix
// for the default language, if suffixes are disabled for the default language. In any other case we
// always add the suffix, e.g. to create "reset" URLs that explicitely contain the default language.
if (!$languageRequired && !$this->enableDefaultLanguageUrlCode && $language === $this->getDefaultLanguage()) {
return $url;
} else {
$key = array_search($language, $this->languages);
if (is_string($key)) {
$language = $key;
}
if (!$this->keepUppercaseLanguageCode) {
$language = strtolower($language);
}
// Remove any trailing slashes unless one is configured as suffix
if ($this->suffix !== '/') {
if (count($params) !== 1) {
$url = preg_replace('#/\\?#', '?', $url);
} else {
$url = rtrim($url, '/');
}
}
// /foo/bar -> /de/foo/bar
// /base/url/foo/bar -> /base/url/de/foo/bar
// /base/index.php/foo/bar -> /base/index.php/de/foo/bar
// http://www.example.com/base/url/foo/bar -> http://www.example.com/base/de/foo/bar
$needle = $this->showScriptName ? $this->getScriptUrl() : $this->getBaseUrl();
// Check for server name URL
if (strpos($url, '://') !== false) {
if (($pos = strpos($url, '/', 8)) !== false || ($pos = strpos($url, '?', 8)) !== false) {
$needle = substr($url, 0, $pos) . $needle;
} else {
$needle = $url . $needle;
}
}
$needleLength = strlen($needle);
return $needleLength ? substr_replace($url, "{$needle}/{$language}", 0, $needleLength) : "/{$language}{$url}";
}
} else {
return parent::createUrl($params);
}
}