CodeZine(コードジン)

特集ページ一覧

Zend Framework入門(15):
多言語対応サイトの作成- Zend_Translate(後編)-

Zend Frameworkによる実践的なPHPアプリケーション開発 15

  • LINEで送る
  • このエントリーをはてなブックマークに追加
目次

自作アダプタの作成

 Zend_TranslateではZend_Translate_Adapterのサブクラスを継承することで、自作のアダプタを作成することができます。デフォルトで多くのアダプタが提供されていますが、例えばデータベースを翻訳ソースとして使用したい場合などは自作のアダプタが必要となります。そこで、本稿ではSQLiteデータベースを翻訳ソースとするアダプタを作成してみましょう。

 アダプタの作成にあたり、必要となるファイルは以下です(Wingsフォルダ以下が自分で一から作成するファイル)。Zend Frameworkのライブラリ自体に改造が必要となるため、対象のファイルのバックアップをとっておくようにしましょう。

[リスト6]関連ファイル
/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クラスを呼び出すようにします。

概要

 自作アダプタを作成する前に、どのように翻訳が行われるのか簡単な流れを示します。

  1. 翻訳ソースを準備する。
  2. Zend_Translateオブジェクトを作成する。
  3. Zend_Translateオブジェクトが引数に指定された自作アダプタオブジェクト(Adapterのサブクラス)を生成する。
  4. 自作アダプタオブジェクトが翻訳インデックスキーと翻訳された言語が格納されたarrayを作成する。
  5. 表示ページで翻訳が求められると、引数の翻訳インデックスキーに対応する翻訳された言語をarrayから探し、返す。

 要するに、我々がアダプタを自作する際にコーディングすべきことは以下の2つになります。

  1. Translate.phpのZend_Translateクラス内で、引数に自作アダプタ名が指定されたら、Adapterのサブクラスである自作アダプタクラスを呼び出すようにする。
  2. 自作アダプタクラスでは、翻訳ソースにアクセスし、翻訳キーインデックスと翻訳された言語が対になるarrayを生成する。

 翻訳ソースの種類にもよりますが、せいぜい数百行でできてしまいます。簡単でしょう? それでは、実際に動作するサンプルを作っていきましょう。

Zend Framework

 現状の仕様ではZend Framworkの提供するクラス自体に改造を加えないと自作アダプタを認識することはできません。しかしZendのパッケージそのものに改造を加えるというのはあまり好ましくないことですので、今後のバージョンアップで改修されるかもしれません。

翻訳ソースの準備

 まずは翻訳ソースを準備しましょう。今回はSQLiteデータベースを使用しました。

[リスト7]使用したデータベースとテーブル
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_ja.dbデータベースのtbl_transテーブル
trans_key trans_word
welcome ようこそ
time 今の時刻は %1$s です。
trans_en.dbデータベースのtbl_transテーブル
trans_key trans_word
welcome welcome
time It is %1$s now.
trans_fr.dbデータベースのtbl_transテーブル
trans_key trans_word
welcome accueil
time C\'est maintenant \%1$s .

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 森山 絵美 (モリヤマ エミ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5