Translation2 は、 多言語対応のアプリケーションを管理するためのクラスです。データソース (例: データベース) から多言語対応の文字列を取得するための簡単な手段を提供します。 その API は、洗練されていて使用しやすく、さらに強力で拡張しやすいように設計されています。 Translation2_Admin クラスを使用すると、翻訳の管理 (言語の追加/削除、文字列の追加/削除) が簡単にできます。
以下のコンテナ (データソースドライバ) が提供されています。
PEAR::DB
PEAR::MDB
PEAR::MDB2
gettext
PEAR::DB_DataObject (実験段階で、 PEAR:: HTML_Template_Flexy で使用されています)
XML
さまざまなタスクを補助するためのデコレータクラスが提供されています。 これらのデコレータは、好きなだけ積み重ねて使用することができます。 この方法は、あらゆるニーズにこたえることができるでしょう。 現在提供されているデコレータは、以下のとおりです。
CacheLiteFunction (ファイルベースの高速なキャッシュ)
CacheMemory (メモリベースのキャッシュ)
DefaultText (空の文字列を、キーあるいはデフォルトテキストで置き換える)
ErrorText (空の文字列を、代替メッセージ "error_text" で置き換える)
Iconv (さまざまなエンコーディングに切り替える)
Lang (空の文字列に対する代替言語を設定する)
SpecialChars (html エンティティを 16 進コードに置き換える)
UTF-8 (UTF-8 文字列を ISO-8859-1 に変換する)
この例は、 Translation2 オブジェクトを作成し、 MDB2 ドライバを使用してデータベースから翻訳文字列を取得する方法を示すものです。
<?php
// データベース接続用のパラメータを設定します
$dbinfo = array(
'hostspec' => 'host',
'database' => 'dbname',
'phptype' => 'mysql',
'username' => 'user',
'password' => 'pwd'
);
define('TABLE_PREFIX', 'mytable_');
// デフォルトと異なる場合に、
// データベースのテーブル構造を Translation2 に教えます。
// 注意: デフォルトのデータベース構造は以下のとおりです。
//
// "langs" テーブル (使用可能な言語とメタ情報)
// +----+------+------+----------+------------+
// | ID | name | meta | encoding | error_text |
// +----+------+------+----------+------------+
//
// "strings" テーブル (翻訳)
// +----+---------+----+----+----+-----+
// | ID | page_id | en | de | it | ... |
// +----+---------+----+----+----+-----+
// ひとつのテーブルにすべての翻訳を格納するのではなく、
// 言語ごとにひとつのテーブルを用意することも可能です。
//
$params = array(
'langs_avail_table' => TABLE_PREFIX.'langs_avail',
'lang_id_col' => 'ID',
'lang_name_col' => 'name',
'lang_meta_col' => 'meta',
'lang_errmsg_col' => 'error_text',
'strings_tables' => array(
'en' => TABLE_PREFIX.'i18n',
'it' => TABLE_PREFIX.'i18n',
'de' => TABLE_PREFIX.'i18n'
),
'string_id_col' => 'ID',
'string_page_id_col' => 'pageID',
'string_text_col' => '%s' //'%s' は言語コードで置き換えられます
);
$driver = 'MDB2';
require_once 'Translation2.php';
$tr =& Translation2::factory($driver, $dbinfo, $params);
// エラーチェックは常に行います。この例では、コードを簡潔にするために
// エラーチェックを省略します。
if (PEAR::isError($tr)) {
// エラーに対応します
}
// データベースで使用する文字セットを、たとえば 'utf8' のように指定することができます
$tr->setCharset('iso-8859-1');
// 主となる言語を設定します
$tr->setLang('it');
// 取得したい文字列のグループを設定します
$tr->setPageID('defaultGroup');
// 代替言語を指定するための Lang デコレータを追加します
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'en');
// もうひとつ別の Lang デコレータを追加し、別の代替言語を設定します
// イタリア語と英語のどちらの翻訳も存在しない場合にこれが使用されます
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'de');
// stringID 'test' に対応する文字列を取得します
echo $tr->get('test');
// イタリア語に翻訳されていない文字列を取得します (代替言語のテスト用)
echo $tr->get('only_english');
// 文字列グループをすべて取得します。代替言語は含めず
// 「デコレーション」も行いません
$rawPage = $tr->getRawPage();
print_r($rawPage);
// デコレータを適用して、文字列グループをすべて取得します
$page = $tr->getPage();
print_r($page);
// 言語と文字列グループを指定することが可能です
echo $tr->get('month_01', 'calendar', 'it');
// getRawPage() や getPage() についても同様です
$page = $tr->getPage('calendar', 'de');
print_r($page);
?>
ご覧いただいたとおり、主要な役割を果たすメソッドは get()、 getPage() および getRawPage() です。完全な構文は
<?php
get($stringID, $pageID, $langID);
?>
ですが、pageID や langID を事前に設定している場合は省略可能です。 get() をコールするたびにいちいち指定する必要はありません。
注意: これら 3 つのメソッドを実行する際には、 少なくとも最初の一回はエラーをチェックするようにしましょう。 データベースへの接続がここで行われるため、他の場所に比べてエラーの可能性が大きくなります。
次に、データベースからメタ情報を取り出してみましょう。
<?php
$tr->getLang(); // langID を指定しない場合は、現在の言語についての情報を取得します
$tr->getLang('it'); // 現在の言語がイタリア語である場合、これは上と同じ意味になります
// 最初のパラメータは言語コード、そして
// 2 番目のパラメータで取得したい情報を絞り込みます
$tr->getLang('it', 'error_text');
$tr->getLang('en', 'name');
$tr->getLang('de', 'meta');
$tr->getLang('de', 'encoding');
?>
Translation2 は、 デコレータ を使用して文字列のフィルタリング/変更を行います。複数のデコレータ (フィルタ) を連結したり、独自のデコレータを追加したりすることも可能です。
<?php
$tr =& Translation2::factory($driver, $dbinfo, $params);
$tr->setLang('en');
$tr->setPageID('calendar');
// メモリベースのデコレータを追加し、基本的な事前読み込みを行うことで
// データベースからの読み込み量を抑えます
$tr = & $tr->getDecorator('CacheMemory');
// ファイルベースのキャッシュデコレータを追加し、クエリ結果をページ内でキャッシュします
$tr =& $tr->getDecorator('CacheLiteFunction');
$tr->setOption('cacheDir', 'cache/');
$tr->setOption('lifeTime', 3600*24);
// 代替言語デコレータを追加します
$tr = & $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'it');
// 特殊文字デコレータを追加し、特殊文字を html エンティティに変換します
$tr = & $tr->getDecorator('SpecialChars');
// 使用する文字セットを指定します
$tr->setOption('charset', 'ISO-8859-2');
// UTF-8 デコレータを追加し、自動的に UTF-8 文字列をデコードします
$tr = & $tr->getDecorator('UTF8');
// デフォルトテキストデコレータを追加し、空の文字列に対応します
$tr = & $tr->getDecorator('DefaultText');
// 空の文字列を stringID に置き換えます
echo $tr->get('emptyString');
// 独自の代替テキストを使用します
echo $tr->get('emptyString', 'stringGroup', 'en', 'show this default text');
?>
getStringID() メソッドは、 get() の逆の動作をします。 文字列を別の言語に翻訳したいけれどその stringID がわからないという場合に、 このメソッドを使用します。
<?php
$tr->setLang('it');
// イタリア語の文字列 "gennaio" を、英語の "january" に翻訳します
$stringID = $tr->getStringID('gennaio', 'calendar');
echo $translatedString = $tr->get($stringID, 'calendar', 'en');
?>
Translation2 はパラメータつきの文字列を処理することができます。 パラメータの置き換えは、実行時に行われます (パラメータの指定は、数値添字の配列あるいは連想配列で行います)。
<?php
// "hello_user" = "hello &&user&&, today is &&weekday&&, &&day&&th &&month&& &&year&&"
$tr->setParams(array(
0 => '',
'user' => 'Joe',
'day' => '15',
'month' => $tr->get('month_01', 'calendar', 'en'),
'year' => '2004',
'weekday' => $tr->get('day_5', 'calendar', 'en')
));
echo $tr->get('hello_user');
// この出力は "hello Joe, today is Friday, 15th January 2004" となります
?>
あなたのサイトが、たとえばヘッダ・本文・フッタのように分けて構成されているとしましょう。 そんな場合はこれらの各部分を "ページ" (あるいは翻訳のグループ) として使用し、ひとつひとつ翻訳を取得します。
<?php
$header_trans = $tr->getPage('header');
$body_trans = $tr->getPage('body');
$footer_trans = $tr->getPage('footer');
?>
これらをひとつの結果にしたければ、ひとつの配列にまとめます。
<?php
$translations = array_merge(
$tr->getPage('header'),
$tr->getPage('body'),
$tr->getPage('footer')
);
?>