Validatorメッセージの日本語化(1)

2007年7月18日 (水)

WEBアプリケーションにはValidatorの機能は必須だ。Validatorとは、WEBアプリケーションの画面で入力された各フィールドの値の正当性チェック機能だ。たとえば、フィールドの入力有無チェック、整数フィールドの整数チェックや値の範囲チェックなどである。

このValidator機能はJava/Servletなら自作しなければならないが、WEBアプリケーションフレームワークであればその機能はそのフレームワークに存在している。たとえばJava/Strutsの場合には各フィールドのチェック機能をXMLファイルに設定するValidatorが付いている。Python/TurboGearsにももちろんValidator機能は存在する。それはFormEncodeパッケージのValidator機能をTurboGearsが利用したものだ。

このTurblGearsによるValidator機能は、ドキュメントや解説書どおりにプログラミングしても、エラーメッセージは英語である。たとえば入力必須フィールドに何も入力しなかった場合、TurboGearsのValidatorは’Please enter a value’というメッセージを出力する。さすがに英語のメッセージでは日本語アプリケーションには使えない。そこでこのValidatorメッセージの日本語化が必須なのだが、これがなかなか難物。そこでこの日本語化の過程を数回に分けて報告する。(結論としては、最上位のレベルでの日本語メッセージ化には成功していない。)

最初にやるべきことは、TurboGearsのValidator機能の大元であるFormEncodeのエラーメッセージファイルの日本語化だ。これは、FormEncodeドキュメントによれば次の手順でやるように書いてある。

$ svn co http://svn.formencode.org/FormEncode/trunk/“
$ cd formencode/i18n
$ mkdir <lang>/LC_MESSAGES
$ cp FormEncode.pot <lang>/LC_MESSAGES/FormEncode.po
$ emacs <lang>/LC_MESSAGES/FormEncode.po # or whatever editor you prefer
# make the translation
$ python msgfmt.py <lang>/LC_MESSAGES/FormEncode.po

最初の行のsvnコマンドは、既にインストール済みなので無視。<lang>は日本語なので”ja”とする。”jp”ではない。

emacsの行は、エディターでメッセージファイルを日本語で記述するの意。なおこのファイルの文字コードはutf-8でなければならない。そして結論を先に言うと、FormEncode.poファイル先頭部分の2行も次のように設定する必要がある。

“Content-Type: text/plain; charset=UTF-8\n”
“Content-Transfer-Encoding: 8bit\n”

そして、手順最後の行のmsgfmt.py は、\python\tools下に存在する。最後の行は、こちらの環境(Windows,Python25を”Program Files”下にインストール)では次のようになる。

> python C:\progra~1\Python25\Tools\i18n\msgfmt.py ja/LC_MESSAGES/FormEncode.po

この結果、FormEncode.poと同じディレクトリにバイナリメッセージファイルのFormEncode.moファイルが生成される。

次のステップは、日本語FormEncode.moファイルが正しく表示されるかどうかのテストだ。先ず一番下のgettextレベルでテストした。

...
    trans = gettext.translation(domain="FormEncode",
 	    localedir="C:\\PROGRA~1\\Python25\\Lib\\SITE-P~1\\
                                 FORMEN~1.EGG\\FORMEN~1\\i18n",
            languages=["ja"])
    msg = trans.gettext("Please enter a value")
...

(localedirパラメータは1行。)
ここで重要なことは、translation()メソッドのlocaledirパラメータだ。このパラメータにはFormEncodeのi18nディレクトリを指定するが、Windows環境ではファイルのロング名を指定してはならないのだ。

localedir=”C:\\Program Files\\Python25\\…

では駄目。完全なショート名でなければならない。この周辺の話題はこのブログの記事Pythonは空白がお嫌いにある。

上記テストの結果、最後にある変数msgに”Please enter a value”に対応する日本語メッセージが正しく格納されていることを確認した。

ここまでは割りと順調。この後が大変だった。(続く。)

 

QLOOK ANALYTICS