Kohana 3.2:多言語主義の組織化

私のサイトのある時点で、多言語を体系化するという質問が非常に鋭く発生し、2、3か国語ではありませんでしたが、数分でサイトを別の、完全に任意の言語に翻訳できました。 さらに、各言語には一意のアドレス、つまり、ドメイン/ ru /、ドメイン/ en /などが必要です。 このテーマに関するネットワーク上の情報はあまりありません(私は見栄えが悪いのでしょうか?)そして、私は自分で考えなければなりませんでした。 私の解決策は非常に単純であり、多くの人にとって明白に見えるかもしれませんが、とにかくそれを提供します。誰かに役立つことを願っています。 kohana 3フレームワークの少しのアイデアが必要であることをすぐに警告します。



それでは、サイト上の多言語組織のオプションは何ですか? 最も単純で明白なオプションは、各言語の「ru」、「en」フォルダーなどを作成することです。 しかし、それはすべてのファイルをコピーすることを意味し、何かを変更した場合、30個すべてのフォルダを変更します...ああ、恐怖、マゾヒストのみがこのトピックを開発できるので、当然、翻訳付きの言語ファイルの変更のみを許可する別の方法を探し始めました。



当然、langパラメーターをルーティングに導入する必要がありました。これは各ルールの先頭にあります。



Route::set('auth', '<lang>/<action>(/<param>)', array('action' => 'login|logout|registration|forgot|start')) ->defaults(array( 'directory' => 'index', 'controller' => 'auth', )); Route::set('static', '<lang>/<action>(/<uri>)', array('action' => 'page|blog|news|forms|polls')) ->defaults(array( 'directory' => 'index', 'controller' => 'static', 'action' => 'page', )); Route::set('default', '(<lang>(/<controller>(/<action>(/<param>))))', array('param' => '.+')) ->defaults(array( 'directory' => 'index', 'controller' => 'static', 'action' => 'index', 'lang' => 'ru' ));
      
      







言語ドメインを指定せずにドメインを開くことができるようにlangをデフォルトに設定した最後のルートに注意してください。そうしないと、常に言語ドメイン/ ruを追加するか、毎回リダイレクトする必要があります。



beforeメソッドのメインコントローラーで(おそらくブートストラップでこれを行う方が良いでしょうか?)定数LANGを定義しました。



 if ( !defined('LANG') ) { define('LANG', $this->lang()); } //    ? $lang_uri = $this->request->param('lang'); //     if ( $lang_uri != LANG ) { $this->request->redirect(LANG); } //    i18n::lang(LANG . '-' . $this->request->controller());
      
      







langメソッドでは、ユーザーのCookieまたはIPによってユーザーの言語を決定します。 翻訳ファイルはapplication / i18n / LANG / controller_name.phpフォルダーにあります。 翻訳をコントローラーに分割します。アクションに従ってそれを行うか、すべてを1つのファイルに入れることができます。それがあなたの魂とプロジェクトのニーズのやり方です。



あとは、HTMLアンカーヘルパーメソッドをオーバーライドするだけです。 これを行うために、クラスフォルダー内のコンテンツを含むhtmlファイルを作成しました。

 <?php defined('SYSPATH') or die('No direct script access.'); class HTML extends Kohana_HTML { public static function anchor($uri, $title = NULL, array $attributes = NULL, $protocol = NULL, $index = TRUE) { $uri = LANG . '/'. $uri; return parent::anchor($uri, $title, array $attributes, $protocol, $index); } }
      
      







私は常にこの方法でドメインと最初のスラッシュなしのアドレスをフィードします。常にこれを行わない場合は、受信した$ uriを正しい方法で処理する必要があります!



まあ、それだけです。 これで、どこでも、翻訳が必要なフレーズは__()関数で処理する必要があります。 ただし、基本言語を選択する必要があることに注意してください。必要な翻訳がない場合、フレーズはその言語で表示されます。 また、この言語の翻訳ファイルを作成する必要はありません。 そのような言語としてロシア語を選びましたが、英語に切り替えることを考えています。



一部の場所では、この実装は風水ではないかもしれませんが、機能し、非常に柔軟に機能します。 ご清聴ありがとうございました。



All Articles