SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

自作アダプタの作成

 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 .

次のページ
Zend_Translateオブジェクトの生成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3435 2009/01/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング