この前の国際化話の続き。まずLocale::Maketext::Simpleの場合。
Locale::Maketext::SimpleはI18N用のクラス定義とかを全部裏でやってしまうモジュール。あとLocale::MaketextのPODに載ってる get_handle()とかでオブジェクトを持ってくる必要はなく、maketextかlocのようなメソッドが現在の名前空間内にエクスポートされる。以下一番簡単なセットアップ方法:
package MyApp;
use strict;
use Locale::Maketext::Simple
Decode => 1,
Path => do {
# これは、auto/MyApp/I18N以下にファイルを入れれば、設定する必要はない
my $path = $INC{'MyApp.pm'};
$path =~ s{\.pm$}{/I18}; # lib/MyApp/I18N/ に変換
$path;
}
;
sub run {
loc_lang("ja");
print loc("Hello, World!"), "\n";
}
1;
これだけだともちろん国際化用のファイルがないので、lib/MyApp/I18N/ja.poとかにファイルを置いておく。Locale::Maketext::SimpleはLocale::Maketext::Lexiconへのインターフェースだから、.poファイルでも.moファイルでも使える。ちなみに今自分はpoeditとかで編集できる.poファイルが好き、という人がいてそう薦められたのであまり考えもなく.poを使っている。
# lib/MyApp/I18N/ja.po
msgid "Hello, World!"
msgstr "みなさん、こんにちは!"
以上で終了。perl -Ilib -MMyApp -e 'MyApp->run' とかすると国際化された文字列が出力されるはず。あとは翻訳を追加していくなりなんなり。
マニュアルにほとんど書いてない注意点が少々あります:
- loc() や loc_lang() はExport引数によって調整可能。しかし、Export => 'hoge' とすると hoge() と hoge_lang() という名前になる(連動している)
- MyApp->loc() とかやりたい場合はExport => '_loc' とかして、MyApp::loc() から_loc()を呼ぶようにしないとまずい
- このままではloc_lang() を呼び出し、適切に言語設定をしないと、別になんの国際化もしてくれない。
- use宣言した際に見つからない言語は適用されない。一応ドキュメントに書かれていないreload_loc() という関数もあるが、ドキュメントされてないってことはどこまで安定して使えるのか俺はよくわからん。
Catalyst::Plugin::I18Nは内部でこれを使っている。とりあえず、以下次号
コメント