久しぶりの更新(^^;)「php Ethnaを使った多言語化」
今回Ethnaを使って多言語化に挑戦しました。
やり方は様々だと思います、EthnaにはEthna_I18Nっていうクラスがあるのですが、
どうも使い勝手が悪そうなので、テンプレートを日本語と英語で完全に切り分ける方法で制作することに!
まず、テンプレート保存先を設定。
template/jaはプロジェクト作成時に存在するので、template/enディレクトリを作り、英語用テンプレートはそちらに格納していくことにしました。
次に、英語と日本語の判別ですが、indexを日本語版英語版作り、切り分けました。
www.ドメイン/ja/とwww.ドメイン/en/といった感じです。
それぞれのディレクトリ内(www/ja/とwww/en/)のindexファイルの中でコントローラを呼び出す前にDEFAULT_LANGという定数を作りその定数に'ja'と'en'を設定。
簡単に言えば、www/jaにアクセスされた場合はDEFAULT_LANGに'ja'を、逆もまた然りです。
前後しましたが、index.phpでDEFAULT_LANGに指定する文字列は必ず日本語なら'ja'、英語なら'en'にしましょう。
これはEthna.php内で指定されているLANG_JAとLANG_ENという定数の中身が'ja'と'en'になっているので、それに合わせました。
ここではまったのが、コントローラを呼び出す前にDEFAULT_LANG定数を作ってなかったこと。(^^;)
コントローラをrequireする前にこのDEFAULT_LANGを設定しておいてください。
この後、プラグインを作って、DEFAULT_LANGを見て文字判別するんですが、その際にDEFAULT_LANGが読めない読めないww
では、続きです。
プロジェクトのコントローラ内でEthna_Contoroller内にある_getDefaultLanguage()メソッドをオーバーライドします。
function _getDefaultLanguage()
{
return array(DEFAULT_LANG, null, null);
}
こんな感じです。
これで、indexによって、見に行くテンプレートディレクトリを変えてくれます。
後はテンプレートを完全に2枚づつ作るという面倒な作業になります。
(DBのフィールドも2つづつ、もしくはテーブルを2つづつ持たなければいけないので全然スマートではありませんが・・・)
その後で問題になるのが、エラー文や、validateです。
Ethna自体が日本の方が開発されているため、もちろん日本向け、
ということで、デフォルトで日本語仕様ですね。
ここで、どうしても無理がでてくるので、ないものは自分で作っちゃいましょう☆
ということで
http://ethna.jp/ethna-document-dev_guide-form-validate_with_plugin.html#eebb5029
を参考にしつつ、オリジナルのvalidateプラグインを作りました。
その前に辞書ファイルを作って、エラー文やその他プログラムが吐き出す日本語部分は全て定数化して、
この辞書ファイル(日本語用、英語用)に同じ定数名で保存しておきました。
今回は難しいことをするようなこともなかったので、Ethna/class/Plugin/Validator/の中にある
Ethna_Plugin_Validator_Required.phpの中をコピー。
プロジェクト/app/plugin/Validator/に作ったプラグインに貼り付け、validateメソッドの中でエラー文を吐き出す部分を先ほど作った定数に置き換えるだけです。
仮にこのクラスの名前をプロジェクト名_Plugin_Validator_Requiredexとします。
各アクションフォームで$formに変数を指定する際、
'required' => true,
としていた部分を、
'requiredex' => true,
に書き換えます。
これでEthna_Plugin_Validator_Requiredではなく、
自作プラグインのプロジェクト名_Plugin_Validator_Requiredexを見にいってくれます。
後は、configファイル等を作ってあるのなら、その中で、DEFAULT_LANGを見て、日本語・英語
どちらの辞書ファイルを読み出すのかを判断するプログラムを書きます。(configファイルはコントローラ内で読まれるようにrequireしておきます)
※のちのち他の言語が増えるかもなので、切替部分はif文ではなく全てswitchで判断します。
こんな感じで全くスマートではないやり方ですが、何とか多言語化できました(^◇^;)
これからも多言語化は必要になってくると思うので、これからもっといい方法を試行錯誤していきたいと思います。
これからもっと精進していきます!
- Permalink
- by 平田
- at 10:38
- in php
- Comments (0)
- Trackbacks (0)
trackbacks
trackbackURL:

comments