はじめに
本連載では、PHP上で動作するアプリケーションフレームワーク「Zend Framework」を紹介しています。
今回は、前回に引き続きサイトをユーザーの環境に合わせて多言語で表示させるパッケージ「Zend_Translate」について解説します。前回はZend_Translateの基本的動作を解説し、ブラウザの環境によって、異なる言語でサイトを表示させるまでを解説しました。
今回は、自動的に翻訳ソースを検出する方法と、自前のアダプタクラス(自作アダプタ)を実装する方法について解説します。自作アダプタは、Zend_Translate_Adapter
のサブクラスとなります。今回の例ではSQLiteと連携して、データベースを翻訳ソースとして使用します。
対象読者
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としています。
必要な環境
Zend FrameworkはPHP 5.1.4以降とWebサーバがインストールされている環境で利用可能です。
以下に、今回アプリケーション作成/動作確認に用いた環境を示します(インストールにあたっては最新安定版の使用を推奨します)。各項目の詳細なインストール手順は、「サーバサイド技術の学び舎 - WINGS」より「サーバサイド環境構築設定手順」を参照ください。
- Mac OS X 10.4.11
- PHP 5.2.6
- Apache 2.2.10
- Zend Framework 1.7.0
- SQLite 3.1.3
Windows、LinuxやFreeBSDなどUNIX系OSをお使いの方もコマンドはほぼ一緒ですので、パスなどは適宜読み替えてください。
翻訳ソースの自動検出
Zend_Translate 1.5以上では、翻訳ソースを自動検出することができます。
前回のサンプルでは、言語とそれに対応する翻訳ソースを明示的に記載していました。
//Zend_Translateオブジェクト生成(翻訳アダプタの生成) $translate = new Zend_Translate('array', $ja, 'ja'); $translate->addTranslation($en, 'en'); $translate->addTranslation($fr, 'fr');
少ない言語に対応する場合はこれで十分かもしれませんが、対応する言語が多い場合は記述が面倒ですし、新しい言語に対応する場合にはソースコードの改修が必要となってしまいます。そのようなケースではソースの自動検出が有効です。
ディレクトリ名による自動検出
Zend_Translate
オブジェクト生成時に、第2引数に翻訳ソースの含まれているディレクトリを指定、第4引数にオプション「scan」に「Zend_Translate::LOCALE_DIRECTORY」を指定します。これにより、ディレクトリ名から言語ごとの翻訳ソースを自動的に検出します。
<?php require_once 'Zend/Loader.php'; Zend_Loader::registerAutoload(); //ディレクトリ名から自動検出 $translate = new Zend_Translate('csv', '../languages/directory', null, array('scan'=>Zend_Translate::LOCALE_DIRECTORY)); // 翻訳された値の取得と表示 $translate->setLocale('auto'); // 表示処理 print ("<html><head>"); print ("<title>".$translate->_('welcome')."</title>"); print ("</head>"); print ("<body>"); printf ($translate->_('time'), date('H:i:s')); print ("</body></html>"); ?>
ちなみに、上記例では次のようなフォルダ構成であることを前提としています。
/htdocs/index.php /languages └/directory ├/en/lang.csv ├/fr/lang.csv └/ja/lang.csv
ディレクトリ名に言語名を明記することで、そのサブフォルダまで翻訳ソースファイルを検索します。ファイル名は任意です。検索時に翻訳ソースファイル以外のファイルは無視することになりますが、そのファイルが翻訳ソースとして正しいデータの形式でない場合も無視されることになるため注意が必要です。
また、翻訳ソース自体に言語情報を持っているようなアダプタを使用する場合(tmxなど)では、この検出方法は有効になりません。
ファイル名による自動検出
第4引数にオプション「scan」に「Zend_Translate::LOCALE_FILENAME」を指定します。これにより、ファイル名から言語ごとの翻訳ソースを自動的に検出します。
// ファイル名から自動検出 $translate = new Zend_Translate('csv', '../languages/filename', null, array('scan'=>Zend_Translate::LOCALE_FILENAME));
ちなみに、上記例では次のようなフォルダ構成であることを前提としています。
/htdocs/index.php /languages └/filename ├en.csv ├fr.csv └ja.csv
ファイル名の付け方としては、上記のようにファイル名を言語名そのものにする付け方の他にも、拡張子として「.en」「.ja」とつける、ファイル名の一部として「lang_en.csv」「lang_ja.csv」とつけるなどといった方法があります。
ファイル名の一部に言語名を含める場合は「_(アンダースコア)」、「.(ドット)」、「-(ハイフン)」で区切る必要があります。また、区切り文字には優先順位があり、「_」>「-」>「.」の順です。もし1つのファイル名の中に複数の言語情報を含めたような場合(そんなややこしいことはしないと思いますが)、優先順位の高い区切り文字で指定されている中で先に登場したものが、その翻訳ソースの言語として検出されます。
翻訳ソースに限らず、アプリケーション内部でのみ利用するようなデータファイルについて、エンドユーザーが直接にアクセスできるような場所に配置するべきではありません。データファイルには時としてエンドユーザーに見せるべきではない(秘匿すべき)情報が含まれる可能性があるためです(翻訳ソースが漏えいしても問題になることはそれほど多くないかもしれませんが、不要な情報は原則として見せないというのが正しいスタンスでしょう)。
基本的に、翻訳ソースは直接アクセスできるドキュメントルート配下にはおかないようにしましょう。実務で使用する場合はご注意ください。