









[blog]
[ML]
[todo]
[CVS]
[bug]
[apache log]
[swiki log]
[statistics]
[map]
[man]
[info]
[アンテナ]
gettext
JitterBug i18nをインストールしようとしているのですが、どうやっても
日本語のlocaleが有効にならない。(なぜでしょう???)
ということで、簡単なプログラムを書いて確かめてみた。
(私、gettext使ったことないので、練習も兼ねています)

gettextで遊ぶ
1. まず Hello, Worldを表示するプログラムを書いてみた。
#include <stdio.h>
int main( int argc, char * *argv )
{
printf( "Hello,World\n" );
}
2. 次に、gettextをとりあえず意識した形式に変更。
・libintl.hのインクルードは、当然必須。
・gettextといちいち書くのが面倒なので、マクロ関数 _( )にするのが
・普通のようだ。
・textdomainでバインドしているものが、カタログファイル名となる。
・LOCALEDIRで設定しているものが、カタログファイルのファイルパスになる。
#include <stdio.h>
#include <libintl.h>
#define _(String) gettext(String)
#define PACKAGE "test"
#define LOCALEDIR "/usr/share/locale"
int main( int argc, char * *argv )
{
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
printf( _( "Hello,World\n" ) );
}
3. さらに、このソースをベースにして poファイルの元を作る。
・poファイルというものが、テキストベースの翻訳用データファイル
・最終的にpoファイルをバイナリのmoファイルにして、実行時に喰わせる。
・ソースからメッセージを抜き出すツールが、xgettext(X11とは関係ない)
xgettext -a -d test -k_ -o test.po -s test.cを実行すると、
poファイルが出来上がった。
内容は、こんな感じ
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2001-09-08 02:35+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
#: test.c:13
msgid "Hello,World\n"
msgstr
4. poファイルのメッセージストリングを翻訳する。
・poファイルのmsgstrを翻訳する。
・あわせて、#.fuzzyのところは削除するべしとのこと。
・今回は、翻訳というか超訳をしてみた。(意味不明)
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2001-09-08 02:35+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
#: test.c:13
msgid "Hello,World\n"
msgstr "やっぱり日本語でviがうまく書けないね\n"
5. poファイルをmoファイルにする。
・poファイルでは、実行時に読めないので、moファイルに変換。
・msgfmtというものを使う。
msgfmt -o test.mo test.po
6. moファイルを配置する。
・作成したmoファイルを配置します。
・/usr/share/locale/[環境変数LANGの場所]/LC_MESSAGEにおく。
・cp test.mo /usr/share/locale/ja/LC_MESSAGES/
・Kondaraの場合というか、なんというか、locale/jaの下でよいらしい。
・実行すると...
[root@comm gettext]# cp test.mo /usr/share/locale/ja/LC_MESSAGES/
[root@comm gettext]# ./a.out
やっぱり日本語でviがうまく書けないね
[root@comm gettext]#
となった。すげ〜(ってほどでもないかも)
7. poファイルの書き方とか、実際の使い方とか
・実際に(本格的に)使うときは、emacsのpoモードを使ったほうが簡単
・Autoconf, Automakeの枠組みに組み込むのがよいらしい。

関連サイト

Links to this Page
- Agenda last edited on 11 September 2003 at 1:38 am
- Jitterbug last edited on 7 October 2004 at 5:38 pm
- 国際化プログラミング last edited on 1 September 2001 at 7:18 pm