gettext って何?

gettext は、GNU国際化ライブラリの構成要素の一つで、多言語対応のソフトウェアを開発する際に便利なツール。簡単に言えば、プログラム実行時に、環境変数等から、ロケール情報を採ってきて、メニューなんかの文字列を、さくさくっと切り替えられるようになるローカライズ支援プログラム(間違ってたら、ごめんなさい)。


C で試してみた。以下、メモ。
(テスト環境: x86/LinuxSUSE LINUX 10.1)


1. まず、コードを作成(もしくは修正)

[サンプル]
#include
#include
#include
#define DOMAINNAME "hoge"
#define LOCALEDIR "/tmp/locale"
#define _(text) gettext(text)
int main()
{
setlocale (LC_ALL, "");
bindtextdomain (DOMAINNAME, LOCALEDIR);
textdomain (DOMAINNAME);
printf( _("Hello gettext?\n") );
}


※ 以下、補足
#include
char *setlocale(int category, const char *locale);
カレントのロケールを設定。<参照>
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/setlocale.3.html


bindtextdomain(const char *domainname, const char *dirname)
ドメイン名(通常、アプリケーション名)とディレクトリを連結。
上の例では、/usr/share/locale/"ロケール名"/LC_MESSAGES/hoge に。


textdomain(const char *domainname)
ドメインを選択する関数
省略した場合、デフォルトドメイン"messages"を使用。<参照>
http://home.catv.ne.jp/pp/ginoue/memo/gettext.html


2. コンパイル実行
ソースコードコンパイル。<実行例>
% gcc -o hoge hoge.c


3. メッセージカタログのテンプレートファイルを作成
修正が済んだら xgettext コマンドを使って、.pot ファイルを生成。<実行例>
% xgettext -k_ -o hoge.pot hoge.c


4. 初期リソースファイルの作成
msginitコマンドで、初期リソースファイル(.po)を作成<実行例>
% msginit --locale=ja --input=hoge.pot
(※ 電子メールアドレスを聞かれるので入力 )


5. 翻訳作業
書き出されたリソースファイル(e.g. ja.po)の
msgidに対応するmsgstrを一つ一つ翻訳していく。
がんばるところ。<記述例>
#: hoge.c:12
#, c-format
msgid "Hello gettext?\n"
msgstr "" <- ここに日本語を入れてく、ここでは"やぁ、gettext!"


6. バイナリ(.mo)ファイルにコンパイル
翻訳が全て終わったら、msgfmtコマンドを実行し、.moファイルにコンパイル。<実行例>
% msgfmt ja.po -o ja.mo


※ ちょっとトラぶったところ。<エラーメッセージ>
invalid multibyte sequence


ja.po の中の、charset(文字セット)の変更で回避。<例>
変更前
"Content-Type: text/plain; charset=ASCII\n"
変更後
"Content-Type: text/plain; charset=UTF-8\n"


7. moファイルを格納
ローカルディレクトリ(もしくはシステムディレクトリ)にコピー。<実行例>
% mkdir -p /tmp/locale/ja/LC_MESSAGES
% cp ja.mo /tmp/locale/ja/LC_MESSAGES/hoge.mo


8. 環境変数 LANG の設定
環境変数 LANG の設定で、使用言語を変更可能。<例>
% export LANG=ja_JP.UTF-8
% ./hoge<参考>
ロケールデータを作ろう
http://www.on.cs.keio.ac.jp/~yasu/jp_localedata.html


Gettext(Wikipedia)
http://ja.wikipedia.org/wiki/Gettext


gettext
http://www.linux.or.jp/JF/JFdocs/LFS-BOOK/appendixa/gettext.html