Codeigniterで多言語をどのようにしたか

まず第一に、コメントに感謝します。 多言語の「モジュール」を作成するために、HabraのユーザーからSkypeからメッセージを定期的に受信するため、このトピックはより多くの関連があると思います。

画像

この投稿は、CodeIgniter 3の多言語の開発にまったく異なるアプローチを使用しているため、現時点では完全に書き直されています。また、投稿は、例と簡単な説明で可能な限り短くしています。



問題解決





一般に、このフレームワークの詳細な研究と時間をかけて、 多言語主義はルーターで行われるべきだという結論に達しました



多言語主義の原理



多言語主義のロジックは非常に単純です。 更新されたMY_Router.phpの1つの関数で、サイトの言語をすべてのルールの先頭に追加します。 関数が機能した後、CodeIgniter 3は新しいルートリストで機能します。 このようになります:)



だった

$route['default_controller'] = "pages/index"; $route['pages/(.+)'] = 'pages/index/$1'; $route['news/(.+)'] = 'news/view/$1';
      
      







なります

 $route['default_controller'] = "pages/index"; $route['(by|ru|kz|en)/pages/(.+)'] = 'pages/index/$2'; $route['(by|ru|kz|en)/news/(.+)'] = 'news/view/$2';
      
      







しかし、最初に、サイトの利用可能な言語を保存する設定でファイルを作成し、デフォルトの言語config / localize_config.phpを設定します



 <?php defined('BASEPATH') OR exit('No direct script access allowed'); /** *   . * * default_key =>     * list =>    * * @author Sergey Makhlenko * @version 1.0 */ $config['ROUTE_LOCALIZE'] = array( 'default_key' => 1, //  -,     "list" (0 -> by, 1 -> ru, .... 4 -> en) 'list' => array('by', 'ru', 'kz', 'ua', 'en'), //     );
      
      







標準システム/コア/Router.phpを拡張することを約束します。



CI_Routerの拡張(MX_Router)


application / core ディレクトリにMY_Router.phpファイルを作成しますHMVCを使用している場合、まずRouter.phpをダウンロードする必要があります

MY_Router.phpの上部に次のコードブロックを追加します



 <?php (defined('BASEPATH')) OR exit('No direct script access allowed'); // load the MX_Router class if ( file_exists(APPPATH."third_party/MX/Router.php") ) { require APPPATH."third_party/MX/Router.php"; } ....
      
      







2)その後、CI_Routerクラスの拡張を作成するか、HMVC MX_Routerを使用する場合

 class MY_Router extends CI_Router { /** * Language user or default language *     - */ public $user_lang = ''; /** * Class constructor * * Run the route mapping function. * * @param array $routing * @return void */ public function __construct($routing = NULL) { parent::__construct(); } ... }
      
      







3)そして今、最も興味深い。 標準関数CI_Router-> _set_routingを拡張する必要があります。 この機能はCI開発者によってバージョンごとに変更される可能性があります。フレームワークの更新後にMY_Routingファイルが最新になるように、これらの行を把握することをお勧めします。 さらに、1行だけ追加する必要があります。



それでは、始めましょう。関数(メソッド) _set_routingsystem / core / Router.phpからコピーし、作成したクラスMY_Routingに貼り付けます。

関数がroutes.phpをロードした後の行を見つけます



 ..... if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) { include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); } // Validate & get reserved routes if (isset($route) && is_array($route)) { //     ... .....
      
      







コードのこのセクションに、受信したルーターを変更するための行を含めます。



 // Update Routing Localize $this->__localize_init($route);
      
      







4)そして、ここに関数自体があります。これは、異なる言語を理解するためにルールをやり直します。



 /** * Append to routing localize lang * * @param array $route Route is config/routes.php * @return array */ private function __localize_init( &$route = array() ) { // Loader config localize if (file_exists(APPPATH.'config/localize_config.php')) { include(APPPATH.'config/localize_config.php'); $localize = $config['ROUTE_LOCALIZE']; } else { return FALSE; } /* --------------------------------------------------------- */ // Check config localize if ( !isset($localize) or !isset($localize['list']) ) { return FALSE; } if ( !isset($localize['default_key']) ) { $localize['default_key'] = 0; } $localize['default_key'] = intval($localize['default_key']); /* --------------------------------------------------------- */ // Language join list $lang_list = implode('|', $localize['list']); // Create new route list foreach ( $route as $key => $item ) { $_route[$key] = $item; if ( $key == 'default_controller' ) { $_route['('.$lang_list.')'] = $route['default_controller']; $_route['('.$lang_list.')/(.+)'] = '$2'; } } /* --------------------------------------------------------- */ // Check default language if ( isset( $localize['list'][ $localize['default_key'] ] ) ) { $this->user_lang = $localize['list'][ $localize['default_key'] ]; } // User select language if ( array_search( $this->uri->segment(1), $localize['list'] ) !== FALSE ) { $this->user_lang = $this->uri->segment(1); } $route = $_route; }
      
      







以上です!



これで、サイトはリンクvashsite.com/by、vashsite.com/enまたはvashsite.comを理解します(デフォルトの言語を使用)。



コントローラーまたはモデルで以下に説明する変数を使用して、選択した言語(by、ru、..... kz)を取得する機会が常にあります。

 $this->router->user_lang;
      
      







それから、user_langをどのように使用するかはあなたの想像次第です:)必要なものはすべて揃っています。



bitbucket.orgの準備完了バージョン



All Articles