Я пытаюсь добавить язык в url со следующим синтаксисом: http://www.example.com/ru/site/page/view/about
То, что я до сих пор работает с короткими URL-адресами, например: http://www.example.com/en/site/contact, но не с длинными один раз, как в моем первом примере
Вот что я имею до сих пор:
/config/main.php
'urlManager'=>array( 'class'=>'application.components.MyCUrlManager', 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( '<language:\w+>/<controller:\w+>/<id:\d+>'=>'<controller>/view', '<language:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<language:\w+>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ),
<?php // components/MyCUrlManager.php class MyCUrlManager extends CUrlManager { public function createUrl($route,$params=array(),$ampersand='&') { if(isset($_POST['_lang'])) { Yii::app()->setLanguage($_POST['_lang']); $route['language']=Yii::app()->language; } elseif (!isset($route['language'])) { $route['language']=Yii::app()->language; } else { Yii::app()->setLanguage($route['language']); } return parent::createUrl($route, $params, $ampersand); } } ?>
class LangBox extends CWidget { public function run() { $currentLang = Yii::app()->language; require_once 'Zend/Locale.php'; $locale = new Zend_Locale(); //$siteLanguages = $this->getLang(); $siteLanguages = array('en','de','tr'); foreach($siteLanguages as $value){ $list[$value] = $locale->getTranslation($value, 'Language', $value); } asort($list); $this->render('langBox', array('currentLang' => $currentLang, 'list'=>$list)); } }
У меня была такая же проблема, и следующие правила работают для меня также с подмодулями и любым числом параметров:
'<lang:[az]{2}>/<_m>/<_c>' => '<_m>/<_c>', '<lang:[az]{2}>/<_m>/<_c>/<_a>*' => '<_m>/<_c>/<_a>', '<lang:[az]{2}>/<_m>/<_a>' => '<_m>/<_a>', '<lang:[az]{2}>/<_c>' => '<_c>', '<lang:[az]{2}>/<_c>/<_a>' => '<_c>/<_a>',
_m – специальное значение для модуля, _c для контроллера и _a для действия.