ushidayの日記

主に「IBMi」のメモに・・・

Zend Core for i5で国際化&ローカライズ

IBM i(AS/400)の5250アプリで、多言語対応する場合は、”*MSGF”を使ったり、画面制約に縛られたりで、実装も保守も個人的には「面倒だ」というネガティブなイメージがあります。(中には画面やメニューだけ別言語で書き直して、OVRDSPFなんてのもあります。)
しかし、海外拠点を持つカスタマー(特にアチラコチラに散在しているケース)からは、「今後どこの国に進出するか判らないけど(現在は主に中国、東南アジアやヨーロッパだったり)、アプリケーションは多言語対応したい」との要望を寄せられるケースもあります。そこで、”Zend Core for i5”に、デフォでバンドルされている、”Zend Framework(ZF)”の機能の1つ、”Zend Translate”を使って国際化&ローカライズを試してみました。

■サーバー環境

■クライアント環境

■参考サイト

最新Zend Frameworkの導入

Zend CoreにデフォでバンドルされているZFは、”1.6.0”だったので、最新の”1.10.0”にしました。"Zend Frameworkの公式サイト"から手に入れる事が出来ます。
アーカイブをダウンロードしたら、AS/400のIFS上の適当なディレクトリで解凍して、php.ini(/usr/local/Zend/Core/etc/php.ini)の”include_path”に、「/usr/local/Zend/ZendFramework-1.10.0/library」を追加します。これで、”require”などで「Zend/フレームワーク名」で使えるようになります。

PHPプログラムの準備

”Translate”の大まかな使い方は、以下のステップです。

    1. 「require_once 'Zend/Translate.php'」でインクルード。
    2. Zend_Translateのインスタンス(※以下”$tl”)を作成。この際にコンストラクタで、翻訳アダプタ、翻訳されたリソースのパス、ローケルを指定します。翻訳アダプタは様々なフォーマットが使える様に柔軟に出来ているようです。今回はgettextで試しました。
      • Array
      • CSV
      • gettext(*.mo)
      • ini
      • TMXなどなど...
    3. 追加のローケルがあれば、$tl->addTranslationメソッドで、翻訳リソースとローケルを追加する
    4. ローケルを設定しなければ、デフォルトローケルが使われます。明示的に設定する場合は、$tl->setLocaleメソッドを呼び出します。
    5. $tl->_メソッドで言語を変換。
翻訳ファイルの準備

gettextのソースファイルpoを編集可能な”poEdit”を使います。導入はインストーラまかせで、特に何もありません。初回起動時に言語の選択等があります。
起動後、phpのソースファイルを元に、翻訳用のカタログを作成します。[ファイル]→[新規カタログ]を選びます。

[情報]タブで、必要な項目を以下の様に入力します。

[パス]タブでは、[ベースパス]に環境依存のパスを指定します。今回の場合はZend Studioワークスペースまでのパスとします。[パス]には、翻訳対象となるソースが存在するパスを指定します。

[キーワード]タブは、翻訳対象となるメソッドを登録します。デフォルトで”_”が存在するので特にする事はありません。OKボタンを押して、保管先を指定すればpoファイルが作成されます。

あとは、対訳をえっちらおっちらと、入力します。デフォルトで、”poファイル”を保存すれば、同じディレクトリに”moファイル”が作成される設定になってます。

元のPHPソースに変更が合った場合は、[カタログ(A)]→[ソースから更新(U)]を行うか、ツールバーにある地球マークをクリックすれば、poファイルをマージします。
翻訳リソースのmoファイルを、Zend Studioに適宜配置します。(PROJECT_HOME/languages/jp/message_jp.moなど)
以下が今回のサンプルプログラムです。
■ ZendTranslate.php

<?php
require_once 'Zend/Translate.php';

// Zend Transelate
$translate = new Zend_Translate("gettext","./languages/en/messages_en.mo","en");
$translate->addTranslation("./languages/ja/messages_ja.mo","ja");

echo "これは英語\n";
$translate->setLocale("en");
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one"). "\n";
$format = $translate->_("Today is the %1\$s.%2\$s.%3\$s");
printf($format . "\n" , date("m"),date("d") ,date("Y"));
print $translate->_("Here is line two") . "\n";
print "\n";

echo "ここから日本語\n";
$translate->setLocale("ja");
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one"). "\n";
$format = $translate->_("Today is the %1\$s.%2\$s.%3\$s");
printf($format . "\n" , date("m"),date("d") ,date("Y"));
print $translate->_("Here is line two") . "\n";

■実行結果

番外編:gtedプラグイン

Eclipseのpluginの”gted”も試してみました。”http://gted.sourceforge.net/update”を、Zend Studioの[Help]→[install New Software]から導入します。
導入後に[Preferences]→[gted]→[gettext Tools]で、”poEdit”のインストールディレクトリにある”bin”ディレクトリを指定します。

プロジェクトを右クリックして[Properties]→[gted Settings]を適宜設定します。

プロジェクトを右クリックして[gted]→[Update PO Files]を行うと、プロジェクト内のソースからpoファイルが作成されます。ただ一見するとマージ機能等はなさそうなので(※自分が機能を探しきれてないだけかも知れませんが...)、poEditの方が使い勝手は良いような気がします。ただ参照と編集だけの用途ならば、十分にも思えます。po専用のエディタは縦横2タイプのGUIビューとコードエディタが選べます。

結局この後、[Preference]→[General]→[Editors]→[File Associations]で、”*po”と”*pot”のデフォルトエディタを、外部エディタで”poEdit”に変更しました。