前回の話ではLocale::Maketext::Simpleだけでは「どの言語を使うか」までは判定してくれません。そこで登場するのが I18N::LangTagsとI18N::LangTags::Detect。確認してないけど、最初の数行のコードの癖からして作者はLocale::Maketextを書いた人と一緒な気がする。

これの使い方は基本的に以下の通り:
use strict; use I18N::LangTag (); # なんかいっぱいエクスポートしちゃうので・・・ use I18N::LangTag::Detect; use Data::Dumper; print Dumper( [ I18N::LangTag::implicate_supers( I18N::LangTag::Detect::detect() # もしくは # I18N::LangTag::Detect->http_accept_langs() ) ]); # env LC_ALL=ja_JP perl script.plと実行すると以下のように出力されるはず # $VAR1 = [ # 'ja-jp', # 'ja' # ];

マニュアルには実はI18N::LangTags::Detect::detect() しか書かれていない。が、実はHTTPヘッダーを見たり、LC_ALLを見たり、みたいな関数が何個かある。Catalyst::Plugin::I18NではHTTPヘッダ以外見るところはないので http_accept_langs()を直接呼んでいる。コマンドラインの環境変数も同じように確認してほしかったら上記のdetect()を使うのがよろしい。

I18N::LangTags::implicate_supers() を使っているのは、言語タグの中の国指定とかを取り外したバージョンを埋め込むため。例えば en_GB (英語・イギリス)とen_US(英語・アメリカ)でそれぞれ国際化ルールを別にしてもいいけど、たいていの場合はひとつ「en」用の国際化データしか用意しない場合が多いので、それを差し込んでおかないとen_GB/en_US用のデータがない→じゃあ国際化できない>< みたいな事になってしまう。

implicate_supers()関数はこれを行ってくれるので、例えば以下の用にLC_ALL=ja_JPという形で言語タグを指定していた場合、ja-jpとjaの二つの言語タグを返してくれるわけだ。

前の記事ではどの言語にローカライズするのかをloc_lang()等で変更する、と書いたが、要はこの結果をloc_lang()に渡すようにすればいいのだ:
loc_lang( I18N::LangTags::implicate_supers( I18N::LangTags::Detect::detect() ) );

以下次号。