Yiiおよび多言語サイト。 適切なURLと柔軟性



1つのプロジェクトを書くとき、サイトで多言語を整理する必要が生じました。 さらに、言語の数は2つに制限されるべきではなく、URLは人間が読める形式であり、SEOが最適化されている必要があります。 つまり、サイト上のリンクは次の形式である必要があります。

ロシア語のhttp://mysupersite.ru/ru/contacts

http://mysupersite.ru/en/contacts for English

私の経験はそれほど大きくないので、Googleに尋ね始めました。 多くのオプションがあることが判明しましたが、1つのオプションが気に入ったので、これを使用して少し変更しました。



1. CUrlManagerを拡張します。



次の内容のファイル「components / 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 ['language']を定義する必要があることを意味します。 これを実装するには、CUrlManagerクラスのcreateUrl()関数をオーバーライドします。 言語が行に示されていない場合、セッション変数、Cookieで検索し、それ以前にユーザーが言語を変更しなかった場合は、デフォルトのアプリケーション言語を設定します。 そして、言語をパラメーターとして既に正しいURL文字列を作成します。



2.コントローラーの編集



次のコードを「components / Controller.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); } ?>
      
      







クラスコンストラクターを拡張し、アプリケーションの言語を追加します。 すべてのコントローラーはこのコントローラーから継承されるため、要求ごとにアプリケーション言語が明示的にインストールされます。

Yii :: app()->言語がURLの各リクエストに対して明示的に設定されていない場合、アプリケーション構成ファイルから取得されます。 設定ファイルで指定されていない場合、Yii :: app()-> sourceLanguageと同じになります。デフォルトは 'en_us'です。

これらすべてのパラメーターは、保護された構成ファイル\ config \ main.phpで変更できます。

 'sourceLanguage'=>'en', 'language'=>'ru',
      
      





3.言語セレクターウィジェットを作成する



次の内容のファイルを「components / widgets / 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)); } } ?>
      
      







ウィジェットの「コンポーネント/ウィジェット/ビュー/ languageSelector.php」のビュー:



 <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などの名前を持つ言語イメージポインターを/ images /フォルダーに配置する必要があります。



4.ウェブサイトにウィジェットを配置します



header-div内に次のコードを「views / layouts / 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. .htaccessを追加します



 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
      
      







それがすべてのようです。 それは私のために働いて、グリッチはまだ気づかれていません。 質問にお答えします。

ここからほとんどすべての情報を取得しました: SEO準拠の多言語URL +言語選択ウィジェット(i18n)



All Articles