Yii рдФрд░ рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдЗрдЯред рд╕рд╣реА URL рдФрд░ рд▓рдЪреАрд▓рд╛рдкрди


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╕рд╛рдЗрдЯ рдкрд░ рдмрд╣реБрднрд╛рд╖рд╛рд╡рд╛рдж рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ URL рдорд╛рдирд╡-рдкрдардиреАрдп рдФрд░ рдПрд╕рдИрдУ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдЗрдЯ рдкрд░ Ie рд▓рд┐рдВрдХ рдлреЙрд░реНрдо рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
http://mysupersite.ru/ru/contact рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП
http://mysupersite.ru/en/contacts рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП
рдЪреВрдВрдХрд┐ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ Google рд╕реЗ рдкреВрдЫрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдирд┐рдХрд▓реЗ, рд▓реЗрдХрд┐рди рд╕рднреА рдореЗрдВ рдореБрдЭреЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдЖрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ред

1. CUrlManager рдмрдврд╝рд╛рдПрдБред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рд╕рд╛рде 'рдШрдЯрдХ / UrlManager.php' рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
<?php class UrlManager extends CUrlManager { public function createUrl($route,$params=array(),$ampersand='&') { if (!isset($params['language'])) { if (Yii::app()->user->hasState('language')) Yii::app()->language = Yii::app()->user->getState('language'); else if(isset(Yii::app()->request->cookies['language'])) Yii::app()->language = Yii::app()->request->cookies['language']->value; $params['language']=Yii::app()->language; } return parent::createUrl($route, $params, $ampersand); } } ?> 

рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЪрдпрдирд┐рдд рднрд╛рд╖рд╛ URL рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ $ _GET ['рднрд╛рд╖рд╛'] рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо CUrlManager рд╡рд░реНрдЧ рдХреЗ createUrl () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЗрди рдореЗрдВ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╕рддреНрд░ рдЪрд░ рдореЗрдВ, рдлрд┐рд░ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдмрджрд▓реА рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднрд╛рд╖рд╛ рд╕реЗрдЯ рдХрд░реЗрдВред рдФрд░ рдлрд┐рд░ рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА URL рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддреЗ рд╣реИрдВред

2. рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рдВрдкрд╛рджрди


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб 'рдШрдЯрдХреЛрдВ / рдирд┐рдпрдВрддреНрд░рдХ.php' рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 <?php public function __construct($id,$module=null){ parent::__construct($id,$module); // If there is a post-request, redirect the application to the provided url of the selected language if(isset($_POST['language'])) { $lang = $_POST['language']; $MultilangReturnUrl = $_POST[$lang]; $this->redirect($MultilangReturnUrl); } // Set the application language if provided by GET, session or cookie if(isset($_GET['language'])) { Yii::app()->language = $_GET['language']; Yii::app()->user->setState('language', $_GET['language']); $cookie = new CHttpCookie('language', $_GET['language']); $cookie->expire = time() + (60*60*24*365); // (1 year) Yii::app()->request->cookies['language'] = $cookie; } else if (Yii::app()->user->hasState('language')) Yii::app()->language = Yii::app()->user->getState('language'); else if(isset(Yii::app()->request->cookies['language'])) Yii::app()->language = Yii::app()->request->cookies['language']->value; } public function createMultilanguageReturnUrl($lang='en'){ if (count($_GET)>0){ $arr = $_GET; $arr['language']= $lang; } else $arr = array('language'=>$lang); return $this->createUrl('', $arr); } ?> 


рд╣рдо рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднрд╛рд╖рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
рдпрджрд┐ URL рдореЗрдВ Yii :: app () -> рднрд╛рд╖рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ Yii :: app () -> sourceLanguage рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдЬреЛ 'en_us' рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред
рдЗрди рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд \ config \ main.php рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 'sourceLanguage'=>'en', 'language'=>'ru', 

3. рдПрдХ рднрд╛рд╖рд╛ рдЪрдпрдирдХрд░реНрддрд╛ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдПрдВ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рд╕рд╛рде 'рдШрдЯрдХреЛрдВ / рд╡рд┐рдЧреЗрдЯреНрд╕ / LanguageSelector.php' рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 <?php class LanguageSelector extends CWidget { public function run() { $currentLang = Yii::app()->language; $languages = Yii::app()->params->languages; $this->render('languageSelector', array('currentLang' => $currentLang, 'languages'=>$languages)); } } ?> 


рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ 'рдШрдЯрдХреЛрдВ / рд╡рд┐рдЧреЗрдЯреНрд╕ / рджреГрд╢реНрдп / рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпред'

 <div id="language-select"> <?php if(sizeof($languages) < 4) { //     -    //           foreach($languages as $key=>$lang) { if($key != $currentLang) { echo CHtml::link( '<img src="/images/'.$key.'.gif" title="'.$lang.'" style="padding: 1px;" width=16 height=11>', $this->getOwner()->createMultilanguageReturnUrl($key)); }; } //         /* $lastElement = end($languages); foreach($languages as $key=>$lang) { if($key != $currentLang) { echo CHtml::link( $lang, $this->getOwner()->createMultilanguageReturnUrl($key)); } else echo '<b>'.$lang.'</b>'; if($lang != $lastElement) echo ' | '; } */ } else { // Render options as dropDownList echo CHtml::form(); foreach($languages as $key=>$lang) { echo CHtml::hiddenField( $key, $this->getOwner()->createMultilanguageReturnUrl($key)); } echo CHtml::dropDownList('language', $currentLang, $languages, array( 'submit'=>'', ) ); echo CHtml::endForm(); } ?> </div> 

рдЭрдВрдбреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ en.gif, ru.gif, ua.gif, md.gif рдЬреИрд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде / рдЫрд╡рд┐рдпреЛрдВ / рдлрд╝реЛрд▓реНрдбрд░ рднрд╛рд╖рд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

4. рд╣рдо рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ


рд╣реЗрдбрд░-рдбрд┐рд╡ рдХреЗ рдЕрдВрджрд░ 'рдХреЛрдб / рд▓реЗрдЖрдЙрдЯ / main.php' рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ
 <div id="language-selector" style="float:right; margin:5px;"> <?php $this->widget('application.components.widgets.LanguageSelector'); ?> </div> 

5. рдЖрд╡реЗрджрди рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдХрд╛ рд╕рдВрдкрд╛рджрди


 <?php 'components'=>array( ... 'request'=>array( 'enableCookieValidation'=>true, 'enableCsrfValidation'=>true, ), 'urlManager'=>array( 'class'=>'application.components.UrlManager', 'urlFormat'=>'path', 'showScriptName'=>false, 'rules'=>array( '<language:(ru|ua|en)>/' => 'site/index', '<language:(ru|ua|en)>/<action:(contact|login|logout)>/*' => 'site/<action>', '<language:(ru|ua|en)>/<controller:\w+>/<id:\d+>'=>'<controller>/view', '<language:(ru|ua|en)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<language:(ru|ua|en)>/<controller:\w+>/<action:\w+>/*'=>'<controller>/<action>', ), ), ), 'params'=>array( 'languages'=>array('ru'=>'', 'ua'=>'╤Ч', 'en'=>'English'), ), ?> 

6. Addhtaccess рдЬреЛрдбрд╝реЗрдВ


 RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # otherwise forward it to index.php RewriteRule . index.php 


рд╡рд╣ рд╕рдм рдорд╛рд▓реВрдо рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЧреНрд▓рд┐рдЯреНрд╕ рдкрд░ рдЕрднреА рддрдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред
рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд▓реА: рдПрд╕рдИрдУ-рдЕрдиреБрд░реВрдк рдмрд╣реБрднрд╛рд╖реА URL + рднрд╛рд╖рд╛ рдЪрдпрдирдХрд░реНрддрд╛ рд╡рд┐рдЬреЗрдЯ (i18n)

Source: https://habr.com/ru/post/In139689/


All Articles