グローバル化チュートリアル


今日で、公式のdraftsはappendices以外は終わりです。ドキュメントが少ないとはいえ、英語にはかなり苦労しましたのでこのぐらいのボリュームがかえって僕にはよかったのかもしれません。
ここまでくれば、APIドキュメントを読んだりソースを読んだりして実例から学んでいくしかないと思ってます。Lithiumには豊富なテストコードもありますし、コアのソース自体が恐ろしく綺麗ですので(名前空間のせいかPHPじゃないみたい)、これから実践で使ってもソースを読めばなんとかなるかなという感じがします。(個人的にはmongoDBを早く習得したいです)

参照元07_globalization/globalization.wiki

導入

グローバル化(g11n)は、国際化(インターナショナライゼーション)と地域化(ローカライゼーション)に見られる特徴を組み合わせた言葉になります。グローバル化は1つのソフトウェアを異なる言語、文章、地域の言語の違いに対応させることができます。
このチュートリアルでは、Lithiumグローバル化されたソフトウェアに対して取っているアプローチを説明します。
Lithiumにおけるグローバル化はコアフレームワークの機能になり、Lithiumは最初からg11nを念頭に入れて開発されています。

g11nをブートストラップさせる

アプリケーションでg11nを利用するには、まずLithiumのブートストラッププロセスでg11nをロードさせる為にboostrap.phpファイルのg11nの行をコメントアウトします。g11n.phpファイルに屈折、音訳、ローカライズされたバリデーション、そしてローカライズされたテキストがどのようにロードされるかといったアプリケーションのグローバル化ルールが記述されます。

require __DIR__ . '/bootstrap/g11n.php';

デフォルトのロケース設定を作成する

現在のロケールに対する設定(利用可能なロケール)はg11n.php内で環境設定として保持されます。これは、ロケールの切り替えや設定、g11nに関する設定を取得する中心部として利用できます。
ここでどのロケールがデフォルトとして最適なロケールであるかを決定できますし、アプリケーションがサポートするロケールをも決定できます。下記のように環境変数を定義することができます。

Environment::set('development', array(
    'locale' => 'en', // the default effective locale
    'locales' => array('en' => 'English') // locales available for your application
));

ロケールを検知する

効果的なロケールは、グローバル化されたアプリケーションのコンテンツとクライアントによって優先されるロケールに依存します。
しかし、どのように優先ロケールを識別すればよいのでしょうか?

一般的なアプローチ

どのロケールを利用するかを推測するには2つの主な方法があります。1つ目は、リソースの名前(リクエストURLの一部)に基づいて推測することができます。もう一つは、クライアントから受け取った情報(ユーザエージェント情報など)に基づいて推測することができます。
できるだけ分かりやすい処理にする為に、最初のリソースをインスペクトすることを推奨します。そして必要なクライアント情報を当てにします。

テクニカルな実装

効果的にロケールを検知するには
コントローラのリクエストでは、Localeクラスが(ユーザエージェントが送る)Accept-Languageヘッダー内に含まれているロケールをパースします。コンソールのリクエストでは、優先されるロケールが環境設定から取得されます。

g11nフィルター

g11n.phpがブートストラッププロセスにおいて行う最後の1つはコンソールコマンドとコントローラのアクションの両方のディスパッチにフィルターを適用することです。