Yii framework でWebサイトを複数言語対応にしてみよう
Yii frameworkでは複数言語に対応したWebサイトを作ることもできます。
マニュアルには「国際化 (I18N)」という項目でその手順が記述してあるのですが、イマイチ具体例の記述がないので分かりにくい人も多いでしょう。
そこで実例を交えながら方法を書いていきたいと思います。
1.ターゲット言語を日本語(ja_jp)に、ソース言語を英語(en_us)に設定
今回、店舗サイトを日本語ベースで構築すると想定して、店舗情報ページに「店舗へのアクセス」という日本語文字列をページ上に表示するということで考えてみましょう。
その場合、日本語を「ターゲット言語」とします。
ターゲット言語とは、ユーザーによって切り替えるための言語設定で、アプリケーション初期構成ファイル(/protected/config/main.php)に「language」プロパティで追加します。
値は言語コード(ja)と国コード(jp)を組み合わせた、ロケール文字列で指定します。
return array( ... 'language'=>'ja_jp', ... );
実行中でも「Yii::app()->language=
‘ja_jp’;」のように他のターゲット言語に切り替えできます。
もう一つの言語設定は「ソース言語」といって、Webサイトの大元(おおもと)の言語設定を何にしておくかを設定しておくもので、対応するターゲット言語が見つからなかったら、ソース言語の言語文字列が使われます。
ソース言語は英語(en_us)に設定しておくことが推奨されています。(英語ベースで作っておくと、日本語以外の言語への翻訳者が見つかりやすいため)
ソース言語は「sourceLanguage」で設定します。
return array( ... 'language'=>'ja_jp', 'sourceLanguage'=>'en_us', ... );
2.ビューファイルにソース言語の文字列を記述
言語設定ができたら、多言語対応で表示させたいビューファイルにソース言語の文字列を記述します。 ただし、記述の仕方にいくつかルールがあります。
今回ターゲット言語である日本語(ja_jp)用に「店舗へのアクセス」と表示させたいわけですが、ビューファイルにはソース言語である英語(en_us)で「access」と書き込んでおきます。
<p>access</p>
当たり前ですが、これではそのまま「access」が表示されるだけです。 ターゲット言語によって変換されるようにするには「Yii::t()」を追加して、翻訳される状態にしておきます。
<p><?php Yii::t('access'); ?></p>
あと、「Yii::t()」にはもうひとつ引数が必要で、それが「カテゴリー」です。
カテゴリーっていうと何かYiiに最初から備わっている何かのようなイメージを持ってしまいそうですが、全くあなたが自由に決めることができます。
たとえばWebアプリケーション全体に関わるような文字列(loginなど)は「appカテゴリ」としたり、ユーザー情報に属するような文字列(nicknameなど)は「userカテゴリ」として指定することができます。
今回の例をカテゴライズするとなると、店舗情報に属する文字列ですから「shopinfo」カテゴリで定義しておきたいと思います。
<p><?php Yii::t('shopinfo', 'access'); ?></p>
う~ん…なぜカテゴリを指定する必要があるのか疑問に思うでしょう? 「access」は「店舗へのアクセス」に変換しとけばカテゴリをわざわざ指定しなくても十分だろうと考えますよね。
では、こういった場合はどうでしょう?
店舗情報ページでは「access」を「店舗へのアクセス」と表示したいが、その他のページでは「access」を単に「アクセス」と表示したい。
おや!?どちらも「access」を翻訳したいのですが、表示内容が違いますね。
このような時に「店舗情報」カテゴリとして「shopinfo」、「共通」カテゴリとして「app」としておけば、異なる文字列で表示ができるわけです。
<?php Yii::t('shopinfo', 'access'); // 「店舗へのアクセス」表示用 ?> <?php Yii::t('app', 'access'); // 「アクセス」表示用 ?>
3.翻訳用ファイルを作成する
最後に翻訳用の配列定義ファイルを作成します。
ファイル配置先やファイル名には規則があって、以下のようになっています。
/messages/(ロケールID)/(カテゴリ名).php
今回は日本語ロケール(ja_jp)で「shopinfo」カテゴリに属するので、次のようなファイル名でPHPファイルを作成します。
/messages/ja_jp/shopinfo.php
ファイルの中身は、テンプレートの記述した文字列をキーに、翻訳表示する文字列を値にしたハッシュ配列を return するプログラムにします。
<?php return array( 'access'=>'店舗へのアクセス', ... ); ?>
appカテゴリ用も用意したい場合は「/messages/ja_jp/app.php」を作成して上と同じような形式で翻訳用配列を定義します。
これで完成。 ブラウザでアクセスすると、ちゃんと「店舗へのアクセス」で表示されるようになっているはずです。 分かってしまえば実に簡単ですね。
2014-01-05