[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-devel:00386] How to use gettext (Re: dpkg_1.4.0.5-jp uploaded)
やなぎはらです。
yosshy> 吉山@神戸大です。
yosshy>
yosshy> それはそうと、dpkg を gettext 化したいのですが、gettext の使い
yosshy> 方がよく分かりません。どなたか教えて頂けませんか?
仕事上 SVR4 関係の gettext は良く分かるんですが、GNU のは、
ちょっと変わっていますね。
ちょっと、textutils パッケージのソースを覗いてみたら、つぎのような事が
わかりました。
まず、
#include <locale.h>
#include <libintl.h>
を追加します。
main() の先頭で、
setlocale(LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
を呼び出すようにします。
PACKAGE は、メッセージファイル名のサフィックス (.mo)を除いた文字列。
Debian の場合、パッケージ単位にメッセージファイルを用意しているような
ので、dpkg だと dpkg.mo というメッセージファイルになります。
とするとPACKAGE を dpkg に置き換えてください。
LOCALEDIR は、メッセージファイルが格納されているディレクトリの
locale 名を省いた所まで。
Debian の場合、"/usr/share/locale" になりますね。
で、メッセージを多言語化したい所を gettext() を用いて
書き直します。
例)
printf("TEST TEST\n");
↓
printf(gettext("TEST TEST\n");
で、メッセージファイル PACKAGE.po は、
次のようなフォーマットで記述して行くようです。
-------------
msgid "TEST TEST\n"
msgstr "テスト テスト\n"
-------------
メッセージファイル中の "#" で始まる行は、コメント行になります。
出来上がったメッセージファイルは、msgfmt コマンドで PACKAGE.mo の
バイナリ形式に変換します。
以上で、gettext 対応できるはずなんですが。
ちなみに、日本語のlocale 名は、ja_JP.EUC です。
テストしてみたサンプルソース
test.c
--------------------------
#include <locale.h>
#include <libintl.h>
#include <stdio.h>
main()
{
int value;
setlocale(LC_ALL, "");
bindtextdomain("test", "/usr/share/locale");
textdomain ("test");
value = 10;
fprintf(stderr, gettext("Hello! Value=%d\n"));
exit(0);
}
--------------------------
test.po (msgfmt test.po -o test.mo)
-----
msgid "Hello! Value=%d\n"
msgstr "こんにちは! 値は %d\n"
------
いちおうこんな感じでできました。
実行結果は、
----------
(^^)[test]%./test
こんにちは! 値は 10
----------
です。
gettext に関する詳しい説明、GNU utilities での使用例などは
gettext パッケージについています。ドキュメントはパッケージの
インストール後、info で参照できます。
ほとんどダイジェストのような説明ですが、参考になるでしょうか?
#あ、いかん、仕事そっちのけで調べてしまった。
+---------------------------------------------------------+
Yoshiaki Yanagihara E-mail: yochi@xxxxxxxxxxx
yosiaki@debian.org
Debian JP Project
[Japanese] http://www.linux.or.jp/~yochi/debian-jp.html
[English ] http://www.linux.or.jp/~yochi/debian-jp-e.html