(View this PageEdit this PageUploads to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide)
[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