Locale::Maketext::Simpleのハマリどころ

Perlには、Gettextを簡便に扱うためのモジュールが幾つか存在します。

その中でも、とても簡単に使えるのがLocale::Maketext::Simpleです。

Perlで国際化フレームワークを開発するのであれば、このモジュールがとてもお勧めです。

このモジュールは、Catalyst::Plugin::I18Nなどでも使われているので、使い方を勉強したい方は見てみるのがよいでしょう。

さて、このモジュールなのですが、PODなどには書いていないので少しハマるところがあります。

それは、POファイルのヘッダに以下のようにcharsetとContent-Transfer-Encodingを記述しておかないと、utf8 bytesとして、Locale::Maketext::Simpleが扱ってしまうということです。

msgid ""
msgstr ""
"Project-Id-Version: XXX\n"
"PO-Revision-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: XXX\n"
"Last-Translator: XXX\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

上記のように記述することで、Locale::Maketext::Simpleのlocメソッドによって取得される文字列は、utf8 stringとして扱われます。

最初はこれに気づかずに、utf8 bytesとutf8 stringを混ぜて使ってしまう結果となり、文字化けに悩まされました。PODには記述がないので、どこで化けているのかの調査に時間がかかってしまいました。他の人がこれではまらないようにと...