自作アダプタの作成
Zend_TranslateではZend_Translate_Adapter
のサブクラスを継承することで、自作のアダプタを作成することができます。デフォルトで多くのアダプタが提供されていますが、例えばデータベースを翻訳ソースとして使用したい場合などは自作のアダプタが必要となります。そこで、本稿ではSQLiteデータベースを翻訳ソースとするアダプタを作成してみましょう。
アダプタの作成にあたり、必要となるファイルは以下です(Wingsフォルダ以下が自分で一から作成するファイル)。Zend Frameworkのライブラリ自体に改造が必要となるため、対象のファイルのバックアップをとっておくようにしましょう。
/ZendFramework1.7.0 └/library ├/Zend │ ├Translate.php →改造するためバックアップ取得の必要あり │ └/Translate │ └Adapter.php →抽象クラスZend_Translate_Adapterが記載されている └/Wings └/Translate └/Adapter └MySqlite.php →今回新規作成するファイル。Wings_Translate_Adapter_MySqliteクラスを記述。
Zend_Translate
オブジェクト生成時の第1引数に今回作成するアダプタ名を指定することによって、Zend_Translate
オブジェクトがアダプタとしてZend_Translate_Adapter
クラスを実装している自作のWings_Translate_Adapter_MySqlite
クラスを呼び出すようにします。
概要
自作アダプタを作成する前に、どのように翻訳が行われるのか簡単な流れを示します。
- 翻訳ソースを準備する。
Zend_Translate
オブジェクトを作成する。Zend_Translate
オブジェクトが引数に指定された自作アダプタオブジェクト(Adapter
のサブクラス)を生成する。- 自作アダプタオブジェクトが翻訳インデックスキーと翻訳された言語が格納されたarrayを作成する。
- 表示ページで翻訳が求められると、引数の翻訳インデックスキーに対応する翻訳された言語をarrayから探し、返す。
要するに、我々がアダプタを自作する際にコーディングすべきことは以下の2つになります。
- Translate.phpの
Zend_Translate
クラス内で、引数に自作アダプタ名が指定されたら、Adapter
のサブクラスである自作アダプタクラスを呼び出すようにする。 - 自作アダプタクラスでは、翻訳ソースにアクセスし、翻訳キーインデックスと翻訳された言語が対になるarrayを生成する。
翻訳ソースの種類にもよりますが、せいぜい数百行でできてしまいます。簡単でしょう? それでは、実際に動作するサンプルを作っていきましょう。
現状の仕様ではZend Framworkの提供するクラス自体に改造を加えないと自作アダプタを認識することはできません。しかしZendのパッケージそのものに改造を加えるというのはあまり好ましくないことですので、今後のバージョンアップで改修されるかもしれません。
翻訳ソースの準備
まずは翻訳ソースを準備しましょう。今回はSQLiteデータベースを使用しました。
trans_ja.db →日本語用データベース └ tbl_trans →翻訳キーとそれに対応した日本語訳を格納したテーブル trans_en.db →英語用データベース └ tbl_trans →翻訳キーとそれに対応した英語訳を格納したテーブル trans_fr.db →仏語用データベース └ tbl_trans →翻訳キーとそれに対応した仏語訳を格納したテーブル
MySQLやPostgrSQLなどのデータベースを使用する場合には、一つのデータベースで言語ごとにテーブルをもち、そのテーブル名で区別するのが一般的かもしれません。今回はSQLiteでファイルごとにDBを分けられますので上記のようにしています。
テーブル定義は以下です。アダプタではここで定義したフィールド名を使用して、翻訳キーと翻訳された語を対応づけるため、どの言語のデータベースにおいても同じテーブル定義を用いる必要があります。
フィールド名 | データ型 | 概要 | Nullを許可? | その他 |
trans_key | varchar(32) | キー名 | No | 主キー |
trans_word | varchar(32) | 翻訳文字列 | No |
それぞれのデータベース内のテーブルに格納されたデータは以下になります。前回連載と同様の翻訳を行おうとしていることが分かるでしょうか。
trans_key | trans_word |
welcome | ようこそ |
time | 今の時刻は %1$s です。 |
trans_key | trans_word |
welcome | welcome |
time | It is %1$s now. |
trans_key | trans_word |
welcome | accueil |
time | C\'est maintenant \%1$s . |