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の準備完了バージョン

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


All Articles