LangUrlManager

Выкладываем свои наработки
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: LangUrlManager

Сообщение BuCeFaL »

Работает, спасибо !
kdmult
Сообщения: 1
Зарегистрирован: 2011.03.22, 12:54

Re: LangUrlManager

Сообщение kdmult »

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

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

$this->redirect(Yii::app()->user->returnUrl) 
В returnUrl (и в homeUrl) лежит строка '/index.php'. В результате после редиректа в Yii::app()->language лежит значение из конфига, а не то, что было выбрано до логина.
Как правильно побороть это?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

Ну можно выбранный язык в куки класть.
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: LangUrlManager

Сообщение 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();
        } 
 
Аватара пользователя
pls-kick-me
Сообщения: 42
Зарегистрирован: 2011.02.05, 22:39
Откуда: Украина, Донецк

Re: LangUrlManager

Сообщение 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 (поставил её на втором месте)
Yes I'm Insistent
cheater
Сообщения: 1
Зарегистрирован: 2011.10.20, 14:31

Re: LangUrlManager

Сообщение cheater »

А каким образом можно исключить из URL язык по умолчанию. Т.е. когда дефолтный язык например ru то вместо http://site/ru писало просто http://site ?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

Пока занят. Пишите свои предложения в google code svn.
PlutDem
Сообщения: 6
Зарегистрирован: 2012.01.08, 16:29

Re: LangUrlManager

Сообщение PlutDem »

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

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

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

Re: LangUrlManager

Сообщение 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
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

CHtml::normalizeUrl(array('')+$_GET) разве не подходит ?
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: LangUrlManager

Сообщение TBIKC »

Расширение до сих пор актуально для текущей версии yii 1.1.10 ?
А то немного смутило Last updated: Jul 16, 2010
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

Да. api не менялось кардинально. Однако, новая версия все же планируется.
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: LangUrlManager

Сообщение TBIKC »

Как скоро ?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

Пока неизвестно, но ничего кроме поддержки хранения языка в куках и сессии не будет. Текущая версия вполне работоспособна. Так что используйте её пока.
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: LangUrlManager

Сообщение TBIKC »

Ну что насчёт поддержки хранения языка в куках и сессии ?
Прошло достаточно много времени )
Alex.Sh
Сообщения: 80
Зарегистрирован: 2011.08.05, 12:38
Контактная информация:

Re: LangUrlManager

Сообщение 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' 
Спасибо
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

strictParsing что-то типа того
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: LangUrlManager

Сообщение TBIKC »

Здравствуйте :)

Не обновили ли случаем компонент ? :)
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: LangUrlManager

Сообщение Ekstazi »

Нет, но он вполне работоспособен. А что нужно в новой версии ?
Аватара пользователя
TBIKC
Сообщения: 133
Зарегистрирован: 2011.07.23, 16:30

Re: LangUrlManager

Сообщение TBIKC »

поддержка хранения языка в куках и сессии
Ответить