Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

Zend_LocaleやZend_Translateについて

次回ZF-Exのバージョンアップにて
Zend_TranslateやZend_Localeを用いて、複数言語への対応を行う予定です。
それぞれの公式ドキュメントはこちら。

Zend Framework: Documentation: Zend_Locale – Zend Framework Manual
Zend Framework: Documentation: Zend_Translate – Zend Framework Manual


そこで調整していたらZend Framworkの言語の
自動選択について見つかった仕様についてメモ。


Zend_Localeはロケール情報を扱うコンポーネントです。

ロケールを指定していればそのロケールを返し、
そうでない時は自動でロケールを決定します。

自動の場合にはブラウザの言語設定や
サーバの言語設定を参照してそこから設定します。


ロケールを取ってくる方法はいくつかあります。

$locale = new Zend_Locale();

// 言語設定を取得する。基本的には文字列
var_dump($locale->getLanguage());

/*
 * デフォルトだと次のような配列がセットされている。何でこういう形式なのかよく分からない
 * array('en' => true);
 */
var_dump($locale->getDefault());

/*
 * これによりサーバの設定を取得できると思うのですが取得できず、空の配列が返ってきました。
 * 今回は重要でないので踏み込んで調べなかったけどいずれ検証したいところ
 * array()
 */
var_dump($locale->getEnvironment());

/*
 * ブラウザの情報を取得すると、第二優先度以降の情報も全て配列で取得する
 * array('ja' => 1, 'en_US' => 0.7, 'en' => 0.7)
 */
var_dump($locale->getBrowser());

アクセスしてきた相手に応じて表示言語を切り替える今回の用途の場合
確認するのはブラウザの言語設定が最適であるため、
ここから先は言語情報の判定と言えばブラウザの言語設定を指すものとします。


これを踏まえた上でZend_Translateについて見てみます。

Zend_Translateは翻訳を行うためのコンポーネントです。
条件に応じて言語の切り替えを行うため、Zend_Localeとの関連性も大きいです。
Zend_Translateで言語を指定する時は、次のように行います。


// 翻訳ファイルの読み込み
$translate = new Zend_Translate('ini', $ja_file, 'ja');
$translate->addTranslation($en_file, 'en');

// ロケールの選択。これは直接指定
$translate->setLocale('ja');

// autoを指定するとZend_Localeを介して自動的に選択する
$translate->setLocale('auto');


ただし、翻訳情報としてTranslateに登録されているかどうかは確認しないため、
翻訳ファイルのない言語が選択されてしまう事もあります。

例えば、ja(日本語)とen(英語)しか翻訳情報を用意していないのに、
de(ドイツ語)をブラウザの最優先言語に設定してアクセスすると
そのままdeを言語選択してしまいます。
第二の優先度以降にjaやenがあってもそれは検出されません。
翻訳情報の登録されていない言語に設定されるので、
当然正常に動作せず、翻訳されずに元のメッセージidが出力されるようになります。


Zend_TranslateのisAvailableメソッドによりその言語が登録されているか確認できるので、
これを使う事で、次のような条件判定を行えば対応はできそうです。

・ブラウザの優先度順に、その言語が登録されているか確認する
・Zend_Translateに登録されていればその言語を使用する
・ブラウザの設定言語のいずれも登録されていない時はデフォルトの言語を使用する。


この辺の動作回りは専用のラッパークラス作って制御するようにした方がいいかも。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment