この節では、PostgreSQL 配布物の一部であるプログラムや ライブラリにおける各国語サポートのサポート方法を説明します。 現在は C プログラムにのみ適用できます。
プログラムに NLS サポートを追加する
プログラムの起動処理に以下のコードを追加して下さい。
#ifdef ENABLE_NLS #include <locale.h> #endif ... #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain("progname", LOCALEDIR); textdomain("progname"); #endif
(progname は実際には自由に選択できます。) freely.)
翻訳の候補となるメッセージが見つかったら、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を呼び出す関数を作成することになります。
プログラムのソースのあるディレクトリに nls.mk を追加して下さい。これは makefile のように読むことができます。 以下の変数への代入をここで設定する必要があります。
textdomain() の呼び出しに使用されるプログラム名です。
用意された翻訳のリストです。 始めは空です。
翻訳文字列を含むファイルの一覧です。 つまり、これらは gettext もしくは他の解決法として印が 付けられます。たまたまこれはプログラムのほとんど全ての ソースファイルを含むことになります。この一覧があまりに長くなる場合、 最初の "file" を + とし、2 番目の 単語を 1 行に対して一つのファイル名をもったファイルとすることが できます。
翻訳者用が作業を行なうメッセージカタログを生成するツールは どの関数呼び出しが翻訳可能な文字列を含むかを認識する必要があります。 デフォルトでは、gettext() 呼び出しのみを認識します。 _ や他の識別子を使用している場合、ここに記載しなけれ ばなりません。翻訳可能な文字列がその最初の引数ではない場合、その項目は (例えば 2 番目の引数の場合)func:2 という形式でなければ なりません。
ビルドシステムは、自動的にメッセージカタログの構築および インストールを行ないます。
メッセージの翻訳を簡単にするために以下に指針をいくつか示します。
以下のように実行時に文章を構築することはしないで下さい。
printf("Files were %s.\n", flag ? "copied" : "removed");
文章内の単語の順番は言語によって異なる可能性があります。 さらにすべての断章に対して gettext() を呼び出すことを覚えていた としても、断章が個別に的確に翻訳されるわけではありません。 それぞれのメッセージがすべて調和して翻訳されるかどうか、 ちょっとしたコードの複製を用意するとよいかもしません。 番号、ファイル名、そして実行時変数のみがメッセージテキストに 実行時に挿入されるべきです。
同様の理由で、以下も動作しません。
printf("copied %d file%s", n, n!=1 ? "s" : "");
これは複数形がどのように形成されるかに依存しているからです。 もし理解できたとすると、以下のように回避することができます。
if (n==1) printf("copied 1 file"); else printf("copied %d files", n):
そして、絶望することになります。言語の中には、独特の規則によって 2 つ以上の形式になるものもあります。将来はこの回避方法ができるかも しれませんが、現時点では、全体を防ぐことが最善です。 以下のように書くことができます。
printf("number of copied files: %d", n);
メッセージをどのように他の出力と合わせる予定なのかなど翻訳者と 何か連絡を取り合いたい場合、translator で 始まるコメントを最初に付けてどうなるかを知らせて下さい。 以下のようにします。
/* translator: This message is not what it seems to be. */
これらのコメントはメッセージカタログにコピーされますので 翻訳者は参照できます。