Posted on

Zend_Translateで多言語対応

多言語対応のちょっとしたサービス?を作っているのですが練習がてら奥さんのサイト(フレームワークはCodeIgniter使用)を一部多言語化してみました。ZendFramework の Zend_Translate クラスが色んなパターンでの多言語化アプローチがあるようなので使ってみました。
このアプローチというのは Zend_Translate のアダプタ の事なのですがこれがまた沢山ありまして、、以下一部抜粋。

  • Array — 簡単ですが柔軟性に欠け、contollerに書いちゃうのでプログラマしか扱えない。
  • Csv — シンプルなテキスト形式で高速ですがUnicode 文字で問題が発生するかもしれない。
  • Gettext — linux における GNU の標準形式。
  • Ini — シンプルなテキスト形式で高速。Csvと似てますね。
  • Tmx — アプリケーション間での翻訳の業界標準。XML フォーマット。

などなどと全部で9種類アダプタ。もちろん自作アダプタクラスの組み込みもOK。今後はSQLにも対応するようです。何が良いのか正直分かりませんね。笑
何となくXML形式のフォーマットが良いのでしょうか。

で、今回は簡単なArrayアダプタで。。

1.Front controller
都度コントローラーでインクルードは面倒なので、フロントコントローラー(index.php) に以下の記述を追加する。ロードの直前で良いと思います。

// Zend framework へのインクルードパス設定
ini_set(‘include_path’, PATH_SEPARATOR . APPPATH . ‘libraries/’ );
// Zend_Translate コンポーネントの読み込み
require_once ‘Zend/Translate.php’;

2.Controller
コントローラー側の実装ですがこんな感じです。かなり省略しましたが動くと思います。ロケーションの設定が上手く行かない場合は、$translate->getLocale(); を使って手順を踏めばいけると思います。

// 翻訳ソースの作成
// アダプタarray
$ja = array(
‘title’ => ‘仕事|イラストレーション’,
‘contents’ => ‘仕事’,
);
$en = array(
‘title’ => ‘Works|Illustration’,
‘contents’ => ‘Works’,
);

//Zend_Translateオブジェクト生成(翻訳アダプタの生成)
$translate = new Zend_Translate(‘array’, $ja, ‘ja’);
$translate->addTranslation($en, ‘en’);
$translate->addTranslation($en, ‘en-us’);
$translate->addTranslation($en, ‘ko’);

// 翻訳された値の取得と表示
$translate->setLocale(“auto”);

3.View
最後は表示部。これは簡単。

echo $translate->_(‘title’);
echo $translate->_(‘contents’);

うまく実装できれば以下のようになります。まずは通常。
capcha0

ブラウザで言語設定を 英語(en) に変更。
capcha1

リロードすると英語になります。(肝心なメニューが日本語なのがアレですが・・・)
capcha2

Zend_Translate を使えば容易に多言語化させる事ができます。Zend はもちろんCakePHP、Codeigniter でライブラリとして使えるのでWEBサービスを作る時は是非多言語対応で作ると良いと思います。日本語だけだと正直弱い。ガラパゴスっていわれる所以では・・・。
この辺の事を書くと長くなりそうなので今日はこの辺で(すでに長い!)

コメントを残す