はじめに
本連載では、PHP上で動作するアプリケーションフレームワークZend Frameworkについて紹介します。
今回は、サイトをユーザーの環境に合わせて多言語で表示させるパッケージ「Zend_Translate」を解説します。
最近ではサイトを日本語、英語と複数の言語で構築したいという要件が多くあり、サイトのトップページで国旗を表示してユーザーに表示させたいページを選ばせたり、「English page is here」のリンクをクリックしてもらったりといった静的な方法がよく使われます。しかしこの場合、対応する言語が増えるごとに言語の数だけサイト構成し、似たようなファイルを都度増やさなくてはなりません。
そこでサイトの国際化が必要となってきます。「国際化」とはアプリケーションに技術的変更を加えることなく多言語対応するための設計を組み込むことをいいます。
Zend_Translateを使用して、動的にユーザーの環境に合わせた言語で表示するスマートな国際化サイトを作りましょう。
対象読者
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としています。
必要な環境
Zend_Frameworkは、PHP 5.1.4以降とWebサーバがインストールされている環境で利用可能です。
以下に、今回アプリケーション作成/動作確認に用いた環境を示します(インストールにあたっては最新安定版の使用を推奨します)。各項目の詳細なインストール手順は、「サーバサイド技術の学び舎 - WINGS」より「サーバサイド環境構築設定手順」を参照ください。
- Mac OX 10.4.11
- PHP 5.2.6
- Apache 2.2.10
- Zend_Framework 1.7.0
Windows、LinuxやFreeBSDなどUNIX系OSをお使いの方もコマンドはほぼ一緒ですので、パスなどは適宜読み替えてください。
Zend_Translateコンポーネントの仕組み
まずはZend_Translateの仕組みについて簡単に理解しましょう。
- phpアプリケーションにて
Zend_Translate
オブジェクトを生成 Zend_Translate
オブジェクトは指定されたZend_Translate_Adapter
オブジェクトを呼び出し、翻訳ソースの情報を読み込む- phpアプリケーションは、
Zend_Translate
オブジェクトから翻訳したいインデックスに対応する値を取得し、表示
上記のようにphpアプリケーションはアダプタを介して翻訳した情報を取得するため、サイトに新しく言語を追加する場合も、「翻訳ソースを用意する」「アダプタに翻訳ソースを読み込ませる」という2つの手順だけで対応できるようになります。
それでは具体的な構築手順をみていきましょう。
サイト多言語化への手順
サイトを多言語対応するための手順は簡単です。
- 翻訳アダプタの選択
- 翻訳ソースの作成
Zend_Translate
オブジェクト生成(翻訳アダプタの生成)- 翻訳された値の取得と表示
今回はブラウザの言語環境によって、表示を切り替えるようなコードをサンプルに解説を行います。まずはコードの全体を掲載しますが、細部はまた後から詳しく説明しますので、まずはこんなものかという程度で大まかなコードの流れとその実行結果とを確認してみましょう。
<?php
require_once 'Zend/Translate.php';
// 翻訳ソースの作成
// アダプタarray
$ja = array(
'welcome' => 'ようこそ',
'time' => '今の時刻は %1$s です。'
);
$en = array(
'welcome' => 'welcome',
'time' => 'It is %1$s now.'
);
$fr = array(
'welcome' => 'accueil',
'time' => 'C\'est maintenant %1$s .'
);
//Zend_Translate
オブジェクト生成(翻訳アダプタの生成)
$translate = new Zend_Translate('array', $ja, 'ja');
$translate->addTranslation($en, 'en');
$translate->addTranslation($fr, 'fr');
// 翻訳された値の取得と表示
$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>");
?>
上記コードを実行すると次のような表示が得られます。