46.2. プログラマへ

46.2.1. 技能者

この節では、PostgreSQL 配布物の一部であるプログラムや ライブラリにおける各国語サポートのサポート方法を説明します。 現在は C プログラムにのみ適用できます。

プログラムに NLS サポートを追加する

  1. プログラムの起動処理に以下のコードを追加して下さい。

    #ifdef ENABLE_NLS
    #include <locale.h>
    #endif
    
    ...
    
    #ifdef ENABLE_NLS
    setlocale(LC_ALL, "");
    bindtextdomain("progname", LOCALEDIR);
    textdomain("progname");
    #endif

    progname は実際には自由に選択できます。) freely.)

  2. 翻訳の候補となるメッセージが見つかったら、gettext() の呼び出しが追加される必要があります。例えば、

    fprintf(stderr, "panic level %d\n", lvl);

    は、次のように変更されます。

    fprintf(stderr, gettext("panic level %d\n"), lvl);

    (NLS が組み込まれていない場合、gettext は ノーオペレーション命令として定義されます。)

    これは混乱しがちになります。一般的なショートカットは以下のものです。

    #define _(x) gettext(x)

    他の解決方法は、そのプログラムが通信のほとんどを 1 つまたは数個の バックエンドにおける ereport() のような関数で 行なっている場合有効です。その場合、全ての入力文字列に対し内部的に gettextを呼び出す関数を作成することになります。

  3. プログラムのソースのあるディレクトリに nls.mk を追加して下さい。これは makefile のように読むことができます。 以下の変数への代入をここで設定する必要があります。

    CATALOG_NAME

    textdomain() の呼び出しに使用されるプログラム名です。

    AVAIL_LANGUAGES

    用意された翻訳のリストです。 始めは空です。

    GETTEXT_FILES

    翻訳文字列を含むファイルの一覧です。 つまり、これらは gettext もしくは他の解決法として印が 付けられます。たまたまこれはプログラムのほとんど全ての ソースファイルを含むことになります。この一覧があまりに長くなる場合、 最初の "file"+ とし、2 番目の 単語を 1 行に対して一つのファイル名をもったファイルとすることが できます。

    GETTEXT_TRIGGERS

    翻訳者用が作業を行なうメッセージカタログを生成するツールは どの関数呼び出しが翻訳可能な文字列を含むかを認識する必要があります。 デフォルトでは、gettext() 呼び出しのみを認識します。 _ や他の識別子を使用している場合、ここに記載しなけれ ばなりません。翻訳可能な文字列がその最初の引数ではない場合、その項目は (例えば 2 番目の引数の場合)func:2 という形式でなければ なりません。

ビルドシステムは、自動的にメッセージカタログの構築および インストールを行ないます。

46.2.2. メッセージ記述の指針

メッセージの翻訳を簡単にするために以下に指針をいくつか示します。