Skip to content

Instantly share code, notes, and snippets.

@slowli
Created March 24, 2015 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slowli/4f1c2e11c650412b4f43 to your computer and use it in GitHub Desktop.
Save slowli/4f1c2e11c650412b4f43 to your computer and use it in GitHub Desktop.
Правило создания / разбора URL с поддержкой нескольких языков
<?php
class LangUrlRule extends CUrlRule {
/**
* Регулярное выражение для поддерживаемых языков интерфейса.
*/
const LANG_REGEX = '(ru|uk|en)';
/**
* Если значение булевой переменно, то правило ведет себя
* в точности как CUrlRule.
*
* @var boolean
*/
public $neutral = false;
public function __construct($route, $pattern) {
parent::__construct($route, $pattern);
if (is_array($route) && isset($route['neutral'])) {
$this->neutral = $route['neutral'];
}
}
public function parseUrl($manager, $request, $pathInfo, $rawPathInfo) {
if ($this->neutral) {
return parent::parseUrl($manager, $request,
$pathInfo, $rawPathInfo);
}
// Язык должен находиться в начале пути $pathInfo
// и отделяться слэшем '/'
if (preg_match('%^'.self::LANG_REGEX.'(/.*)?$%',
$pathInfo, $matches)) {
// Установить язык исходя из URL
Yii::app()->language = $matches[1];
$pathInfo = (count($matches) > 2)
? substr($matches[2], 1) : '';
return parent::parseUrl($manager, $request,
$pathInfo, $rawPathInfo);
} else if (parent::parseUrl($manager, $request,
$pathInfo, $rawPathInfo) !== false) {
// Установить язык по умолчанию
$lang = 'ru';
// Искать поддерживаемый язык интерфейса в предпочитаемых языках,
// которые были переданы с запросом
foreach ($request->preferredLanguages as $locale) {
$locale = substr($locale, 0, 2);
if (preg_match('%^'.self::LANG_REGEX.'$%', $locale)) {
$lang = $locale;
break;
}
}
$url = Yii::app()->baseUrl . '/' . $lang . '/' . $pathInfo;
if (strlen($request->queryString) > 0) {
$url .= '?' . $request->queryString;
}
$request->redirect($url);
return false;
}
}
public function createUrl($manager, $route, $params, $ampersand) {
if ($this->neutral) {
return parent::createUrl($manager, $route,
$params, $ampersand);
}
$lang = isset($params['lang'])
? $params['lang'] : Yii::app()->language;
$lang = substr($lang, 0, 2); // Обрезать информацию о стране
unset($params['lang']);
$url = parent::createUrl($manager, $route, $params, $ampersand);
if ($url === false) return false;
return $lang.'/'.$url;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment