LangUrlManager
Re: LangUrlManager
Если использовать это расширение как есть, то появляется проблема с редиректом.Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Например, в стандартном сгенерированном приложении, при успешном выполнении действия login происходит такой редирект:
Код: Выделить всё
$this->redirect(Yii::app()->user->returnUrl)
Как правильно побороть это?
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
Ну можно выбранный язык в куки класть.
Re: LangUrlManager
kdmult писал(а):Если использовать это расширение как есть, то появляется проблема с редиректом.Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Например, в стандартном сгенерированном приложении, при успешном выполнении действия login происходит такой редирект:В returnUrl (и в homeUrl) лежит строка '/index.php'. В результате после редиректа в Yii::app()->language лежит значение из конфига, а не то, что было выбрано до логина.Код: Выделить всё
$this->redirect(Yii::app()->user->returnUrl)
Как правильно побороть это?
Можете использовать мои наработки на основе кода Ekstazi. Там есть возможность запоминания в кукиз.
Вот последняя версия:
Код: Выделить всё
<?php
/**
* This extension allows you to pass the application language via an url
* and then use it for all further generated urls.
* @author Ekstazi http://yii-blog.blogspot.com
* @author Pelesh Yaroslav aka Tokolist http://tokolist.com
* @version 1.0
*/
class LangUrlManager extends CUrlManager
{
public $languages=array('en');
public $langParam='lang';
public $langCookieName=false;
public $langCookieDomain=false;
protected function getCookieLang()
{
$cookieLang = false;
if(!empty($this->langCookieName))
{
$cookies = Yii::app()->getRequest()->getCookies();
if(isset($cookies[$this->langCookieName]))
{
$cookieLang = $cookies[$this->langCookieName]->value;
}
}
return $cookieLang;
}
protected function setCookieLang()
{
if(!empty($this->langCookieName))
{
$cookies = Yii::app()->getRequest()->getCookies();
if(!isset($cookies[$this->langCookieName])
|| $cookies[$this->langCookieName]->value != Yii::app()->language)
{
$cookie = new CHttpCookie($this->langCookieName,Yii::app()->language);
$cookie->expire = time() + 60*60*24*365; //1 year
if(!empty($this->langCookieDomain))
$cookie->domain = $this->langCookieDomain;
$cookies[$this->langCookieName] = $cookie;
}
}
}
protected function getPreferredLang()
{
return Yii::app()->getRequest()->getPreferredLanguage();
}
public function setAppLanguage()
{
//If language pass via url use it
if(isset($_GET[$this->langParam]) && in_array($_GET[$this->langParam],$this->languages))
{
Yii::app()->language = $_GET[$this->langParam];
}
//Else if lang cookie is setted
elseif(in_array($cookieLang=$this->getCookieLang(),$this->languages))
{
Yii::app()->language = $cookieLang;
}
//Else if preffered language is allowed
elseif(in_array($prefferedLang=$this->getPreferredLang(),$this->languages))
{
Yii::app()->language = $prefferedLang;
}
//Else use the first language from the list
else
{
Yii::app()->language = $this->languages[0];
}
//Remember lang in cookies
$this->setCookieLang();
}
public function createUrl($route, $params=array(), $ampersand='&')
{
if(!isset($params[$this->langParam]))
{
$params[$this->langParam]=Yii::app()->language;
}
return parent::createUrl($route,$params,$ampersand);
}
public function createLangUrl($language, $ampersand='&')
{
$route = Yii::app()->controller->route;
$params = $_GET;
unset($params[$this->routeVar]);
$params[$this->langParam] = $language;
return parent::createUrl($route,$params,$ampersand);
}
}
Код: Выделить всё
public function init()
{
parent::init();
Yii::app()->urlManager->setAppLanguage();
}
- pls-kick-me
- Сообщения: 42
- Зарегистрирован: 2011.02.05, 22:39
- Откуда: Украина, Донецк
Re: LangUrlManager
Скажите можно сделать так :
?
Что я сделал:
1. Взял готовый код версии 1.2
2. добавил в первую ветку if метода "parsePathInfo" запись в куки
3. Добавил еще одну ветку ifelse (поставил её на втором месте)
Код: Выделить всё
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of LangUrlManager
*
* @author Ekstazi
* @ver 1.2
*/
class LangUrlManager extends CUrlManager{
public $languages=array('ru', 'en');
public $langParam='language';
public function parsePathInfo($pathInfo)
{
parent::parsePathInfo($pathInfo);
$userLang=Yii::app()->getRequest()->getPreferredLanguage();
//if language pass via url use it
if(isset($_GET[$this->langParam])&&in_array($_GET[$this->langParam],$this->languages)){
Yii::app()->language=$_GET[$this->langParam];
Yii::app()->request->cookies[$this->langParam] = new CHttpCookie($this->langParam, $_GET[$this->langParam]);
//else if isset lang in cookies
}elseif(isset( Yii::app()->request->cookies[$this->langParam] )){
Yii::app()->language = Yii::app()->request->cookies[$this->langParam]->value;
//else if preffered language is allowed
}elseif(in_array($userLang,$this->languages)) {
Yii::app()->language=$userLang;
//else use the first language from the list
}else Yii::app()->language=$this->languages[0];
}
//put your code here
public function createUrl($route, $params=array(), $ampersand='&'){
if(!isset($params[$this->langParam])) $params[$this->langParam]=Yii::app()->language;
return parent::createUrl($route,$params,$ampersand);
}
//put your code here
}
Что я сделал:
1. Взял готовый код версии 1.2
2. добавил в первую ветку if метода "parsePathInfo" запись в куки
3. Добавил еще одну ветку ifelse (поставил её на втором месте)
Yes I'm Insistent
Re: LangUrlManager
А каким образом можно исключить из URL язык по умолчанию. Т.е. когда дефолтный язык например ru то вместо http://site/ru писало просто http://site ?
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
Пока занят. Пишите свои предложения в google code svn.
Re: LangUrlManager
Господа, а как ссылки, то создать для переключения языка, что бы ссылались на текущую страницу?
Сделал вот так
,но в этом случае к ссылке не присоединяются $_GET параметры.
Как это привольно сделать ?
Сделал вот так
Код: Выделить всё
<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(),
Yii::app()->urlManager->langParam=>'ru'),
));?>
Как это привольно сделать ?
Re: LangUrlManager
Я так сделалPlutDem писал(а):Господа, а как ссылки, то создать для переключения языка, что бы ссылались на текущую страницу?
Сделал вот так,но в этом случае к ссылке не присоединяются $_GET параметры.Код: Выделить всё
<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(), Yii::app()->urlManager->langParam=>'ru'), ));?>
Как это привольно сделать ?
Код: Выделить всё
<?php
$route = Yii::app()->urlManager->parseUrl(Yii::app()->getRequest());
$params = $_GET;
$params['lang'] = 'en';
$url = $this->createUrl('/'.$route,$params);
?>
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
CHtml::normalizeUrl(array('')+$_GET) разве не подходит ?
Re: LangUrlManager
Расширение до сих пор актуально для текущей версии yii 1.1.10 ?
А то немного смутило Last updated: Jul 16, 2010
А то немного смутило Last updated: Jul 16, 2010
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
Да. api не менялось кардинально. Однако, новая версия все же планируется.
Re: LangUrlManager
Как скоро ?
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
Пока неизвестно, но ничего кроме поддержки хранения языка в куках и сессии не будет. Текущая версия вполне работоспособна. Так что используйте её пока.
Re: LangUrlManager
Ну что насчёт поддержки хранения языка в куках и сессии ?
Прошло достаточно много времени )
Прошло достаточно много времени )
Re: LangUrlManager
Пара вопросов, если правила написаны в виде
то работают ссылки site.com/en/login и site.com/login . Как запретить последнее?
И еще, по адресам с defaultAction например site.com/post (полный адрес -site.com/post/index ) выдает 404. Что можно придумать?
Решено добавлением
Спасибо
Код: Выделить всё
'<language:ru|en>/<controller:\w+>/<id:\d+>' => '<controller>/view'
'<language:ru|en>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>'
'<language:ru|en>/<controller:\w+>/<action:\w+>' => '<controller>/<action>'
И еще, по адресам с defaultAction например site.com/post (полный адрес -site.com/post/index ) выдает 404. Что можно придумать?
Решено добавлением
Код: Выделить всё
'<language:ru|en>/<controller:\w+>' => '<controller>/index'
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
strictParsing что-то типа того
Re: LangUrlManager
Здравствуйте
Не обновили ли случаем компонент ?
Не обновили ли случаем компонент ?
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: LangUrlManager
Нет, но он вполне работоспособен. А что нужно в новой версии ?
Re: LangUrlManager
поддержка хранения языка в куках и сессии