Согласно нашему условию, выбранный язык должен быть частью URL. Это значит, что $_GET[‘language’] должен быть определен. Для реализации этого мы переопределяем функцию createUrl() класса CUrlManager. Если язык в строке не указан, тогда мы его ищем в переменной сессии, затем в куках, и если до этого пользователь не менял язык то устанавливаем язык приложения по умолчанию. И затем формируем правильную строку URL уже с языком как параметр.
Редактируем наш Controller
Добавляем следующий код в protected/components/Controller.php
12345678910111213141516171819202122232425
publicfunction__construct($id,$module=null){parent::__construct($id,$module);// If there is a post-request, redirect the application to the provided url of the selected languageif(isset($_POST['language'])){$language=$_POST['language'];$MultilangReturnUrl=$_POST[$language];$this->redirect($MultilangReturnUrl);}// Set the application language if provided by GET, session or cookieif(isset($_GET['language'])){Yii::app()->language=$_GET['language'];Yii::app()->user->setState('language',$_GET['language']);$cookie=newCHttpCookie('language',$_GET['language']);$cookie->expire=time()+(60*60*24*365);// (1 year)Yii::app()->request->cookies['language']=$cookie;}elseif(Yii::app()->user->hasState('language')){Yii::app()->language=Yii::app()->user->getState('language');}elseif(isset(Yii::app()->request->cookies['language'])){Yii::app()->language=Yii::app()->request->cookies['language']->value;}Yii::app()->gettext->setLocale();}
Мы расширяем конструктор класса и добавляем язык для приложения. Так как все контроллеры будут наследоваться с этого контроллера, язык приложения будет установлен явно на каждый запрос.
Если не установленYii::app()–>language явно для каждого запроса в URL, он будет браться из конфигурационного файла приложения. Если же он не указан в конфигурационном фале, он будет идентичен Yii::app()–>sourceLanguage, который по умолчанию ‘en_us’.
Редактируем конфиг файл
Вносим изменения в protected/config/main.php
123456789101112131415161718192021222324
return array( ...
'sourceLanguage'=>'en',
'language'=> 'ru',
...
// application components
'components'=> array('gettext'=> array('class'=> 'ext.gettext.components.GetText',
// следующие параметры не обезательны
'domain'=> 'имя домена', // defualt messages
'locale_dir'=> 'путь до папки с переводами', // defualt Yii::app()->basePath.DIRECTORY_SEPARATOR.'messages';
'locale'=> array( // установленные на компьютере локале
// locale -a
'ru'=>'ru_RU',
'en'=> 'en_US',
)),
...
);
);
<?phpclassGetTextextendsCApplicationComponent{/** * @var GetText domain. */public$domain='messages';/** * @var Language in yii. */public$language;/** * @var Directory containing gettext messages. */public$locale_dir;/** * @var array locale (locale -a) */public$locale=array('ru'=>'ru_RU','en'=>'en_US',);/** * Initialize php's gettext. */publicfunctioninit(){$this->setLocale();}/** * Bind the gettext domain and make it the default */publicfunctionbindDomain(){if(!bindtextdomain($this->domain,$this->locale_dir)){thrownewException("Found folder to translations {$this->locale_dir}");}bind_textdomain_codeset($this->domain,'utf-8');textdomain($this->domain);}/** * Get canonical locale to the format required for gettext */publicfunctiongetLocale($id){$locale=isset($this->locale[$id])?$this->locale[$id]:$id;$locale=explode('_',$locale);if(isset($locale[1]))$locale[1]=strtoupper($locale[1]);returnimplode('_',$locale);}/** * Set locale */publicfunctionsetLocale(){$this->language=$this->language?$this->language:Yii::app()->language;$locale=$this->getLocale($this->language);$this->locale_dir=$this->locale_dir?$this->locale_dir:Yii::app()->basePath.DIRECTORY_SEPARATOR.'messages';if(!setlocale(LC_ALL,$locale.'.utf8',$locale.'.utf-8',$locale.'.UTF8',$locale.'.UTF-8')){thrownewException("Not installed in the system locale {$locale}");}header('Content-Language: '.str_replace('_','-',$this->language));$this->bindDomain();}}
Размешаем переводы
Создаем в папке protected/messages, следующию структуру каталогов. Где и размещаем наши переводы.