Многоязычность

Добрый день. Пытаюсь сделать перевод сайта на несколько языков, но не могу разобраться как переключаться между ними.

в config/main.php


 $lang = 'ro';

    if(isset($session['language'])){

        $lang = $session['language'];

    }

return array(

	'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

	'name'=>'mysite',





     'sourceLanguage' => 'ru',

     'language' => $lang,

в ну и в контролере сайт


public function actionChangelang(){

        $session = new CHttpSession;

		if(!$session->open()){

            $session->open();

        }


        if(Yii::app()->language == 'ru'){


            $session['language'] = 'ro';

        }

        elseif(Yii::app()->language == 'ro'){


            $session['language'] = 'ru';

        }


       $this->redirect(Yii::app()->user->returnUrl);

    }

но при нажатии по ссылке язык не переключается

перевод осуществляю посредствам так называемых словарей messages/ro/main.php - файл перевода

Почитайте тут: http://www.yiiframework.com/wiki/26/setting-and-maintaining-the-language-in-application-i18n

Язык можно устанавливать в любом месте приложения, а не только в конфиге.

И еще взгляните на этот коммент: http://www.yiiframework.com/wiki/26/setting-and-maintaining-the-language-in-application-i18n#c1941 Идея с Behavior мне больше нравится :)

я когда пытался сделать Yii::app()->language = ‘ro’; то язык не менялся

Решение найдено, может полезно кому то будет.

Итак, создаем в components класс Languages


<?php


class Languages extends CApplicationComponent

{

    /**

     * @var boolean enable language component.

     */

    public $useLanguage=false;

    /**

     * @var boolean auto detect language if not set.

     */

    public $autoDetect=false;

    /**

     * @var array allowed languages.

     */

    public $languages=array('ru','ro');

    /**

     * @var array languages titles for link.

     */

    public $languagesTitles=array('ru'=>'Russian','ro'=>'Romana');

    /**

     * @var string default language.

     */

    public $defaultLanguage='ro';

    /**

     * @var string hidden input id.

     */

    public $id='siteLang';

    /**

     * @return void

     */

    public function init()

    {

        if($this->useLanguage)

            $this->initLanguage();

    }

    /**

     * @return void

     */

    private function initLanguage()

    {

        $language=Yii::app()->session->itemAt('language');


        if($language===null && $this->defaultLanguage)

            $language=$this->defaultLanguage;


        if($language===null && $this->autoDetect)

            $language=Yii::app()->getRequest()->getPreferredLanguage();


        $languageId=array_search($language, $this->languages);

        $language=$this->languages[$languageId===false ? 0 : $languageId];

        Yii::app()->session['language']=$language;

        Yii::app()->setLanguage($language);

    }

}

в любом контролере создаем действие к примеру actionChange




    public function actionChange()

    {

        if (isset($_GET['lang']))

            Yii::app()->session['language'] = $_GET['lang'];

        if (isset(Yii::app()->session['language']))

            Yii::app()->language = Yii::app()->session['language'];


      $this->redirect(array(/*страница*/));


    }

далее в config/main.php дописываем следующие строчки




....

'preload'=>array('log','languages',), //обязательно

....

'components'=>array(

		....

        'languages'=>array(

                'class'=>'Languages',

                'useLanguage'=>true,

                'autoDetect'=>true,

                'languages'=>array('ru','ro',),//'en','ro',

                'languagesTitles'=>array('ru'=>'Russian','ro'=>'Romanian'),

            ),



ну и собственно ссылки переключения выглядят следующим образом


<a href="<?echo Yii::app()->CreateUrl('<controller>/change',array('lang'=>'ru'));?>">Русский</a>

<a href="<?echo Yii::app()->CreateUrl('<controller>/change',array('lang'=>'ro'));?>">Romana</a>

<controller> - контролер где у вас ваша функция actionChange

Спасибо, очень подробное изложение.

Из минусов сессионного хранения языка - не всегда получится дать ссылку на страницу с нужным языком + неполная индексация поисковиками. Вариант с добавлением языка в УРЛ с этой точки зрения предпочтителен

Возможно, будет интересно