この投稿は、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_routingをsystem / 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の準備完了バージョン