コンストラクタで多言語化を
PHPなどのシステムで多言語に対応する際は出力の度に言語で分岐して出力するより、言語ファイルを用意した方が効率的です。
言語ファイルと言えばプログラム業界では「.po」「.mo」といったファイルがよく見られます。(はてなの場合)
これらの言語ファイルをPHPで使うには下記の流れの作業する事になります。
1. 翻訳元の「.pot」ファイルを作成
2. ファイルを元に翻訳元と翻訳後の書かれた「.po」ファイルを作成
3. 「.po」ファイルを「.mo」ファイルにバイナリ変換
4. GetTextというライブラリで翻訳させる。
大規模なシステムだと分業しやすいというメリットはありますが「TASK4BOX」みたいな規模の小さいシステムだと大袈裟なので自前で言語ファイルを作る事にした。
翻訳文が数個なら個数分の定数(define)を設定する事も考えたが、個数が多いのでまとめたい。
そこでコンストラクタ(クラス)で言語ファイルを用意するようにした。
class language {
const HELLO = "こんにちは";
}
本体の方から呼び出す場所はグローバルだけで無く関数内で使用する事も想定されるので、下記のような感じで組んでみた。
echo "グローバル:".language::HELLO;
function test(){
echo "関数内:".language::HELLO;
}
test();
ただこの方法だと変数では無いのでヒアドキュメント(<<<)で{language::HELLO}としても展開されない。
そこで、読み込み用に右から左へ受け流す関数(moody)を用意し、関数内で関数名を変数化($moody)したものを用意し、変数化した関数を通して展開させた。
function moody($val){return $val;}
function test2(){
$moody = 'moody';
print <<<EOF
{$moody(language::HELLO)}
EOF;
}
test2();