標準 C 言語国際化プログラミング
メッセージ
国際化されたプログラムはロケールにしたがってメニューやエラーメッセージ
を切り替え、利用者に最適なユーザインタフェースを提供するべきです。これ
を実現する仕組みとして、C 言語ではメッセージカタログが提供されています。
メッセージカタログは次のように使用します。
- 翻訳されたメッセージカタログを作成する
- プログラム中の英語文字列リテラルをメッセージテキストファイル (.msg) に集める。
- 集めた英語文字列リテラルを翻訳する(たとえば日本語に)。
- gencat コマンドでメッセージテキストファイルからメッセージカタログファイル
(.cat) を作成する。
- 作成したカタログファイルをロケールごとに用意されたパスにインストールする。
(たとえば /usr/share/locale/<ロケール名>/LC_MESSAGES/)
- プログラムからメッセージカタログを使用する
- プログラム側では catopen() を呼び出してメッセージカタログファイルをオー
プンする。ファイルの検索には LC_MESSAGES ロケールカテゴリが使用され、
これによりそのロケール用のメッセージカタログがオープンされる。
- オープンしたメッセージカタログに対して catgets() を呼び出して
メッセージカタログからメッセージを取得する。
メッセージカタログ関係のライブラリ関数には次のものがあります。
------------------------------------------------------------------------
間数 説明
------------------------------------------------------------------------
catopen() メッセージ・カタログをオープンする
catgets() メッセージ ID に対応するメッセージを返す
catclose() メッセージ・カタログをクローズする
------------------------------------------------------------------------
文字列リテラルの多くは言語ごとに異なるべきですが、中にはファイル名など
各言語共通の内容のものもあります。また、ある関数の引数に指定された文字
列リテラルは翻訳不要という場合もあります。一般に、以下のケースでは文字
列リテラルは翻訳不要すなわちメッセージカタログ対応不要の場合が多いよう
です。
- 文字列が1つの ASCII ワードである。
- #include や #define マクロの値である。
- 代入される変数名に "sql" が含まれる (SQL文の場合が多い)。
- 以下の関数の引数である:catopen()、catgets()、strfmon()
World Wide Navi ではデフォルトの動作としてこれらの文字列リテラルは翻訳
不要と解釈します。この動作は DB 編集機能によって変更可能です。
*** メッセージカタログの詳細 ***
.msgファイルのフォーマットは以下のようになります。
wwnavi_cat.msg
$ $NLS-WWNAVI 2008-05-24T16:48:54+0900
$
$quote "
$set 1
1 "Failed to create fontset\n" <-- *メッセージIDとメッセージ
2 "Hello, how are you? This is sample for catgets. (Push .)"
.catファイルの配置場所は環境変数NLSPATHなどに依存します。
例えば以下のような設定でプログラム(Test)を実行した場合、
export NLSPATH=./%L/%N
export LANG=en_US.UTF-8
./Test
export LANG=ja_JP.UTF-8
./Test
.catファイルの配置場所は以下のようになります。
./en_US.UTF-8/wwnavi_cat.cat <-- *英語メッセージカタログ
./ja_JP.UTF-8/wwnavi_cat.cat <-- *日本語メッセージカタログ
また、この場合のソース内のメッセージ読み込みは以下のようになります。
setlocale (LC_ALL, ""); <-- *main関数内に記述。
nl_catd wwnavi_cd = catopen ("wwnavi_cat.cat", NL_CAT_LOCALE); <-- *main関数内に記述。
...
printf(catgets(wwnavi_cd,1,1,"Failed to create fontset\n")); <-- *メッセージ読み込み
上記はWorld Wide Navi付属のサンプルコード(linux_catgets)にcatgetsの外部化を実行することで確認できます。
国際化プログラミングトップへ
Copyright (C) 2012 Kokusaika JP, Inc.
本ドキュメントを無断で転載および引用することを禁じます。