WHAT'S NEW?
Loading...

CakePHP1.3で配列ベースの国際化を試す

昨日CakePHP1.3の挙動を調べていたんだけど、何がやりたいかというと、実は英語、中国語、韓国語、日本語のSNSを作る事になっているので、完全に国際化をさせないといけない。

今まではCakePHP1.2を長い間使っていたけど、バーチャルフィールドに惹かれてCakePHP1.3を使うことにした。

CakePHP1.3ではapp/libsというディレクトリが増えていて、知人が言うには「何でもいれると良いよ!(MASA-Pさん)」とのことなので、何でもいいからいれてみることにした。

何を入れるかというと、まずはマスタ系の文字列を格納しておきたい。
というのも、1年ほど前、データベースでi18n対応したとき、あまりの面倒くささと手際の悪さで、__()関数使ったほうがメンテナンシビリティ高いアルよ!と独断している状態を続けている。

というわけなんだけど、さすがにすべてのリテラル文字列を配列に入れて宣言するのは、いくらなんでもメモリ使いすぎなので、カテゴリ別に関数にしておくことにした。



やったことはこう。
  1. app/libs内にmasters.phpなど作成
  2. masters内ではMastersクラスを作成するが、Objectを継承しておく(別にControllerでも良い)
  3. Mastersクラス内には単純なメソッドしかおかない。具体的には、血液型マスタであれば、return array(1=>__('A型', true),~~~)で血液型をまるごと返却するメソッド
  4. AppController側からスタティックに呼び出してみる
現状、これで今のところ問題なく動いている。

繰り返しになるけど、なぜ性別、血液型、国名などを別個の関数にしているかというと、常に全部を引き回したくないからだ。

必要なときだけ、必要な分を取得するような形にしておきたかった。

しかもpublic static function bloodtypes()などとして宣言しているので、呼び出す最には
Masters::bloodtypes();
で配列が返ってくる。
$Masters = new Masters();
$Masters->genders();
とかしないで良い。

脳内すっきり。

具体的なコードは以下。
class Masters extends Object {

  public static function genders()
  {
    return array(
      1 => __('男性', true),
      2 => __('女性', true),
    );
  }

  public static function bloodtypes()
  {
    return array(
      1 => __('A型', true),
      2 => __('B型', true),
      3 => __('O型', true),
      4 => __('AB型', true),
      5 => __('不明', true),
    );
  }
 ・
 ・
 ・
 ・

これなら完全に単語が国際化の対象にできる。
この方法を使って、validation.phpなども作り、モデルのバリデーションメッセージも完全に国際化対応できるかもしれない。

そうそう、引数が0のキーはあえて指定しないでおく。

というのも、ヘルパー使ってselectタグを吐くときなど、emptyオプションで個別に指定したいということと、0とかnullとか""とか、PHPは微妙にキモいので、あえて触らない主義だからだ。

で、実際に、例えば性別を表示してみるとすると、このようになる。
App::import('Lib', 'Masters');
pr(Masters::gender());
これで画面には
Array
(
    [1] => 男性
    [2] => 女性
)
と表示されることになる。

めでたしめでたし。