Страница 2 из 3

Re: LangUrlManager

Добавлено: 2011.03.03, 21:00
BuCeFaL
Работает, спасибо !

Re: LangUrlManager

Добавлено: 2011.03.22, 14:05
kdmult
Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Если использовать это расширение как есть, то появляется проблема с редиректом.
Например, в стандартном сгенерированном приложении, при успешном выполнении действия login происходит такой редирект:

Код: Выделить всё

$this->redirect(Yii::app()->user->returnUrl) 
В returnUrl (и в homeUrl) лежит строка '/index.php'. В результате после редиректа в Yii::app()->language лежит значение из конфига, а не то, что было выбрано до логина.
Как правильно побороть это?

Re: LangUrlManager

Добавлено: 2011.03.22, 16:27
Ekstazi
Ну можно выбранный язык в куки класть.

Re: LangUrlManager

Добавлено: 2011.03.23, 22:35
Tokolist
kdmult писал(а):
Ekstazi писал(а):Хм, да я могу так кинуть, ща:
Последняя версия. Её пока нигде нет.
Если использовать это расширение как есть, то появляется проблема с редиректом.
Например, в стандартном сгенерированном приложении, при успешном выполнении действия login происходит такой редирект:

Код: Выделить всё

$this->redirect(Yii::app()->user->returnUrl) 
В returnUrl (и в homeUrl) лежит строка '/index.php'. В результате после редиректа в Yii::app()->language лежит значение из конфига, а не то, что было выбрано до логина.
Как правильно побороть это?

Можете использовать мои наработки на основе кода 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);
    }

}
 
protected/components/Controller.php

Код: Выделить всё

        public function init()
        {
            parent::init();
            Yii::app()->urlManager->setAppLanguage();
        } 
 

Re: LangUrlManager

Добавлено: 2011.10.20, 14:52
pls-kick-me
Скажите можно сделать так :

Код: Выделить всё

<?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 (поставил её на втором месте)

Re: LangUrlManager

Добавлено: 2011.12.03, 02:04
cheater
А каким образом можно исключить из URL язык по умолчанию. Т.е. когда дефолтный язык например ru то вместо http://site/ru писало просто http://site ?

Re: LangUrlManager

Добавлено: 2011.12.03, 21:39
Ekstazi
Пока занят. Пишите свои предложения в google code svn.

Re: LangUrlManager

Добавлено: 2012.01.08, 17:43
PlutDem
Господа, а как ссылки, то создать для переключения языка, что бы ссылались на текущую страницу?
Сделал вот так

Код: Выделить всё

<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(), 
Yii::app()->urlManager->langParam=>'ru'), 
));?>
,но в этом случае к ссылке не присоединяются $_GET параметры.
Как это привольно сделать ?

Re: LangUrlManager

Добавлено: 2012.03.11, 11:55
alexbra
PlutDem писал(а):Господа, а как ссылки, то создать для переключения языка, что бы ссылались на текущую страницу?
Сделал вот так

Код: Выделить всё

<?= CHtml::link ('<span class="ru">по-русски</span>', array(''.Yii::app()->request->getQueryString(), 
Yii::app()->urlManager->langParam=>'ru'), 
));?>
,но в этом случае к ссылке не присоединяются $_GET параметры.
Как это привольно сделать ?
Я так сделал

Код: Выделить всё


<?php
 $route = Yii::app()->urlManager->parseUrl(Yii::app()->getRequest());
$params = $_GET;
$params['lang'] = 'en';
$url = $this->createUrl('/'.$route,$params);
?>


И $url передаю в CHtml::link

Re: LangUrlManager

Добавлено: 2012.03.12, 15:02
Ekstazi
CHtml::normalizeUrl(array('')+$_GET) разве не подходит ?

Re: LangUrlManager

Добавлено: 2012.03.26, 20:10
TBIKC
Расширение до сих пор актуально для текущей версии yii 1.1.10 ?
А то немного смутило Last updated: Jul 16, 2010

Re: LangUrlManager

Добавлено: 2012.03.26, 23:55
Ekstazi
Да. api не менялось кардинально. Однако, новая версия все же планируется.

Re: LangUrlManager

Добавлено: 2012.03.27, 19:08
TBIKC
Как скоро ?

Re: LangUrlManager

Добавлено: 2012.03.29, 00:35
Ekstazi
Пока неизвестно, но ничего кроме поддержки хранения языка в куках и сессии не будет. Текущая версия вполне работоспособна. Так что используйте её пока.

Re: LangUrlManager

Добавлено: 2012.09.18, 17:19
TBIKC
Ну что насчёт поддержки хранения языка в куках и сессии ?
Прошло достаточно много времени )

Re: LangUrlManager

Добавлено: 2012.12.04, 03:09
Alex.Sh
Пара вопросов, если правила написаны в виде

Код: Выделить всё

'<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>'
то работают ссылки site.com/en/login и site.com/login . Как запретить последнее?

И еще, по адресам с defaultAction например site.com/post (полный адрес -site.com/post/index ) выдает 404. Что можно придумать?
Решено добавлением

Код: Выделить всё

'<language:ru|en>/<controller:\w+>' => '<controller>/index' 
Спасибо

Re: LangUrlManager

Добавлено: 2012.12.05, 16:03
Ekstazi
strictParsing что-то типа того

Re: LangUrlManager

Добавлено: 2013.03.18, 20:36
TBIKC
Здравствуйте :)

Не обновили ли случаем компонент ? :)

Re: LangUrlManager

Добавлено: 2013.03.20, 18:28
Ekstazi
Нет, но он вполне работоспособен. А что нужно в новой версии ?

Re: LangUrlManager

Добавлено: 2013.03.20, 19:28
TBIKC
поддержка хранения языка в куках и сессии