суббота, 8 октября 2011 г.

Интернационализация (сокращённо I18N). Мультиязычность. Переключение языков

Для переключения языков я стал использовать LangUrlManager скачал файл LangUrlManager.php и сохранил в папку Z:\home\catalog.loc\www\protected\extensions\urlManager

Файл небольшой, вот его содержимое:
<?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('en');
 public $langParam='lang';

 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];
 //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
}

Подключил его в конфиге: файл Z:\home\catalog.loc\www\protected\config\main.php

// uncomment the following to enable URLs in path-format
  
'urlManager'=>array(
'class'=>'application.extensions.urlManager.LangUrlManager',
'languages'=>array('ru','en','et'),
'langParam'=>'language',
'urlFormat'=>'path',   
'rules'=>array(
  
'<language:(ru|en|et)>/page=<id:\w+>'=>
'staticpage/sppage/view',
'<language:(ru|en|et)>/page/<action:\w+>/<id:\w+>'=>
  'staticpage/sppage/<action>',  
'<language:(ru|en|et)>/page/<action:\w+>'=>
  'staticpage/sppage/<action>',
  
'<language:(ru|en|et)>/<_m:(message|relations)>'=>
  'staticpage/sp<_m>',
'<language:(ru|en|et)>/<_m:(message|relations)>/<id:\d+>'=>
  'staticpage/sp<_m>/view',
'<language:(ru|en|et)>/<_m:(message|relations)>/
<action:\w+>/<id:\d+>'=>'staticpage/sp<_m>/
 <action>',  
'<language:(ru|en|et)>/<_m:(message|relations)>/
  <action:\w+>'=>'staticpage/sp<_m>/<action>',
  
'<language:(ru|en|et)>/<_c:(assortiment|category)>/
  <id:\d+>'=>'<_c>/view',
'<language:(ru|en|et)>/category=<category:\d+>'=>
'assortiment/index',
'<language:(ru|en|et)>/assortiment/<action:\w+>'=>
  'assortiment/<action>',
'<language:(ru|en|et)>/<action:\w+>'=>'site/<action>',
'<language:(ru|en|et)>/<module:\w+>/<model:\w+>'=>
  '<module>/<model>',
'<language:(ru|en|et)>/<module:\w+>/<model:\w+>/
  <action:\w+>'=>'<module>/<model>/<action>',
    ),

    'showScriptName'=>false,

  ),
  


В файле Z:\home\catalog.loc\www\protected\views\layouts\main.php

Добавил меню переключения языков:

<div id="language">
<?php echo CHtml::link(CHtml:: image 
( Yii ::app()->urlManager->baseUrl.
'/images/flags/ru.gif','по-русски').' <span 
class="ru">по-русски</span>',
array('/assortiment/index',Yii::app()->urlManager->
langParam=>'ru'));
echo '<br/>';?>
    
<?php echo CHtml::link(CHtml:: image 
( Yii ::app()->urlManager->baseUrl.
'/images/flags/et.gif','eesti keeles').' <span 
class="et">eesti keeles</span>',
array('/assortiment/index',Yii::app()->
urlManager->langParam=>'et'));
echo '<br/>';?>
    
<?php echo CHtml::link(CHtml:: image 
( Yii ::app()->urlManager->baseUrl.
'/images/flags/en.gif','in english').' <span 
class="en">in english</span>',
array('/assortiment/index',Yii::app()->
urlManager->langParam=>'en'));
echo '<br/>';?>
</div><!-- language -->

Да, при переключении языков текущая страница не остается, а открывается главная страница сайта. Рядом с текстом выводятся иконки флагов, они лежат в папке Z:\home\catalog.loc\www\images\flags (такие иконки флагов легко найти в интернете).
Осталось самое сложное: ума ни приложу, как сделать! Чтобы выводились сообщения на нужных языках из базы данных.
Продолжение следует.

8 комментариев:

  1. Было бы совсем не дурно если бы вы могли разместить ваши стати на сайте freehabr.ru
    Это конечно не xaбpa xaбp, но народ как мне кажется там более благодарный.

    ОтветитьУдалить
  2. А как это сделать просто? :)
    Ну вообще кто ищет тот найдёт. Когда я сам ищу что ни будь по yii, то часто натыкаюсь на свой болг в поиске google и yandex.

    ОтветитьУдалить
  3. Здравствуйте.
    Я только начал разбираться с Yii, webapp сделал с нуля и начал делать переключение языков по статье.
    Сделал все также, но у меня к url в конце добавляется /login/language/en. Хотелось бы, что бы было как в вашем примере каталоге /ru/login.
    Подскажите почему язык в конце url и как убрать /language?
    Правила такие сделал 'class'=>'application.extensions.urlManager.LangUrlMana$
    'languages'=>array('ru','en'),
    'langParam'=>'language',
    'urlFormat'=>'path',
    'showScriptName'=>false,
    'rules'=>array(
    '/<_m>/<_c>' => '<_m>/<_c>',
    '/<_m>/<_c>/<_a>*' => '<_m>/<_c>$
    '/<_m>/<_a>' => '<_m>/<_a>',
    '/<_c>' => '<_c>',
    '/<_c>/<_a>' => '<_c>/<_a>',

    ОтветитьУдалить
  4. Gnusmas, я добавил в этот пост rules которые работают у меня.

    тут language это GET[language] и её возможные значения (ru,en,et)

    Надеюсь, все получится!

    ОтветитьУдалить
  5. Спасибо, получилось.
    В маршрутах lang писал, а надо language.

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить