gettext - みる会図書館


検索対象: UNIX MAGAZINE 1999年8月号
8件見つかりました。

1. UNIX MAGAZINE 1999年8月号

連載 / IJN Ⅸ知恵袋ー① 図 6 PO モードの言聢 PO mode (setq auto—mode—alist 表 3 PO モードのキー操作 (autoload 'po—mode "po—mode") auto—mode—alist) ) po-mode) 図 7 libintl を使う際に便利なマクロ #if defined(118N) #include く libintl . h> #define _(str) gettext (str) #else #define bindtextdomain (catalog , #define textdomain(catalog) #define -(str) (str) #endif locale—dir) P M-e RET 次のメッセージ定義部 , 、移動 前のメッセージ定義部へ移重力 ヘルプ PO ファイル文法のチェック ジ入力モードは C-c C-c て終了 翻帰 ( メッセージの入力モードを起動。翻訳メッセ 前のオ覇ヨ訳メッセージ定義部 , 、多動 次の暑孺尺メッセージ定義部 , 、多動 ムが刊属しています。 misc ディレクトリの下にある po- mode. el という Emacs Lisp ファイルがそれです。 mode. el は次のような機能を備えています。 ・メッセージ定義部単位でのカーソル移動 暑翻ヨ訳メッセージ定義部単位でのカーソル移動 ・翻尺文字列編集機能 ・ PO ファイル文法のチェック PO ファイルを Emacs で読み込んだときに PO モード PO- 126 く代わりに、 printf(-("He110 world! " ) ) ですみま こオしで、 printf (gettext ( " He110 world ! " ) ) と書 #define —(str) gettext(str) う頁に次の 1 行を加えることでしよう。 タイフすら略したいと思うものです。当然、プログラムの かし、プログラマーは概して嚇ですから、 gettext() の 文字列を gettext() 関数に渡すだけの単純なものです。し libintl を使った国際化メッセージ・フログラミングは、 便利な手法 text ノヾッケージの info を参照してください。 います。詳しくは PO モードのオンラインヘルフや get ー PO モードは、表に示した以外にも有用な機能をもって PO モードでのキー操作の一部を表 3 に示します。 に追加します。 lisp など ) にコピーして、図 6 の内容を $HOME/. emacs のとおったディレクトリ (/usr/local/lib/emacs/site- に入るように設定しましよう。 po-mode. el を load-path す。さらに一一歩進んで、図 7 のようなマクロ定義を利用し てみましよう。 118N が定義されていれは libintl を使った国際化メッ セージ処理をおこない、 118N が未定義ならは国際化ライ プラリを使わないプログラムとしてコンパイルできるよう になります。 なお、 xgettext コマンドはメッセージ識別子の抜出し の条件として、文字列が gettext() で囲まれているかど うかを調べます。マクロ定義で gettext を、、一 " にしてし まうとメッセージ識別子を認識できません。この場合は、 xgettext コマンドの --keyword スイッチを使って、メ ッセージ識別子として認識するためのキーワードを指定し ます。 $ xgettext catgets —keyword= helloworld . c catgets は、 X/Open による XPG4 規格で定義され ている国際化メッセージ取扱い関数の 1 つです。 XPG4 では、以下の関数を使うことで国際化メッセージを実現し ます。 ・ catopen() ・ catgets() ・ catCIose こまで、 catgets を使った国際化メッセージの枠組み を、、 catgets" と表記してきましたが、文字列を取り出す関 数 catgets() との混同を避けるため、以降では XPG4 と 呼ぶことにします。本来の XPG4 は国際化メッセージに 関することだけを規定しているわけではありません。あく までもこの記事に限定した用法であることに注意してくだ UNIX MAGAZINE 1999.8

2. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 表 1 gettext パッケージかインストールするファイル gettext xgettext msgfmt msgunfmt msgcmp msgmerge libintl.h libintl.a 文字列取得コマンド メッセージカタログ・ソース芻豐生成コマンド メッセージ・カタロク生成コマンド メッセージ・カタログからメッセージカタロ グ・ソースへの変換コマンド メッセージカタログ・ソースの上は交コマンド メッセージカタログ・ソース統合コマンド ライプラリへッダ プログラム用ライプラリ 目を集めている GNOME2 や KDE3 などの統合工鼬竟でも gettext がイ目されています。 プログラムの作成にはさまざまな牛がからんでくると 田います。自分の牛に合った方法を選んでください。 gettext UNIX MAGAZINE 1999.8 3 http://www.kde.org/ 2 http://www.gnome ・ org/ ってみましよう。国ヒの手順は以ドのようになります。 intl を使って国際化メッセージを表示するプログラムを作 「案するより産むが易し」という言葉に従い、実際に lib- libintl を使う と書いた場合はコマンド名を表すことにします。 化メッセージの十咎目みを libintl と呼び、たんに gettext を避けるため、以降では gettext パッケージを使った国際 すコマンド名は、パッケージ名と同し gettext です。混乱 メッセージ・カタログから各国語のメッセージを取り出 リンクするライプラリです。 使ったプログラムを書くときに読み込むヘッダファイルと 用します。 libintl. h と libintl.a は、国ヒメッセージを す。各国語用のメッセージ・カタログを作成するときに利 ジ・カタログを操作するためのコマンドライン・ツールで msgfmt 、 msgunfmt 、 msgcmp 、 msgmerge はメッセー ンストールされます。これらのうち、 gettext 、 xgettext 、 gettext をインストールすると表 1 に示すファイルがイ できるでしよう。 る自動設定をサポートしているので、簡単にインストール 引斤バージョンは 0.10 です。 configure スクリフトによ イプラリです。 GNU の FTP サイトから入手できます。 gettext は GNU による国際化メッセージサポート・ラ 図 2 国際化していない HeIIo World プログラム #include く stdio . h> ・プログラムソースの libintl 対応 ・メッセージカタログ・ソースの作成 ・メッセージ・カタログの作成 今回、例としてとりあげるプログラムは、世界的に有名 な、、 He Ⅱ 0 WorId" です。 ます、国際化を考えない HeIIo WorId を図 2 に示し ます。このフログラムは次のようにしてコンパイルできま す。 $ gcc ー 0 helloworld helloworld. c このフログラムの出力メッセージを libintl を使って国 際化するには、プログラムを図 3 のように書き換えます。 プログラムの変更はこれだけです。図 3 は libintl を使 うので、リンクオプションを追加してコンパイルします ( 誌面の都合ーヒて折り返しています。以ー科司様 ) 。 $ gcc ー 0 helloworld —l/usr/local/include - —L/usr/Ioca1/1ib helloworld . c —lintl libintl.h や libintl.a が /usr/local 以外の場所にイン ストールされている場合は、コンパイラのスイッチを適切 な値に変史します。 あとは、メッセージ・カタログを用意すれは国際化さ れた HeIIo World の完成です。なお、メッセージ・カ タログを作らないまま実行すると、メッセージ識別子その ものが出力されます。つまり、とりあえす libintl を使っ てコーディングし、英語阪のプログラムとして動かしてお き、あとでメッセージ・カタログを追加すれは順次各国語 int main(int argc , char** argv) { printf ( " He110 Wor1d! \ Ⅱ " ) ; 図 3 libintl 版 HeIIo WorId プログラム #include く stdio . h> #include く libintl . h> int main(int argc , char** argv) { bindtextdomain ( "helloworld" "/usr/local/share/locale") ; textdomain("helloworld") ; printf (gettext("He110 Wor1d! \n") ) ; に対応させることができるのです。 123

3. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 表 2 libintl を用いた国際化て硬われる関数 char* bindtextdomain (const char* C 佖こ佖あ 9- れ ame , const char* あ c 佖 / e ー d ・ ) c 観四 - れのれ e て才彳定したメッセージ・カタログを locale-dir て指定したディレクトリに里づける char* textdomain(const char* c 佖 t 佖あ 9- れ 0 ? れ e ) 以降の gettext() 呼出しで、メッセージ・カタログ c 観襯四 - name からメッセージを取り出す char* gettext (const char* message-id) message-id に対応するメッセージ文字列を textdomain() て、設定されたメッセージ・カタログから取り出す libintl 版 HeIIo World 国ヒメッセージに対応させるために最低限憶えなけれ はならない関数はたったの 3 つです。 ・ bindtextdomain ・ textdomain ・ gettext() それぞれの引数と説明を表 2 に示します。 libintl では、メッセージ・カタログのことをドメインと 呼びます。しかし、ドメインという言葉は文脈によって異 なる意味で利用されることが多いため、 こではメッセー ジ・カタログと表記します。 bindtextdomain() はメッセージカタログ・ファイル の位置を指定します。通常、メッセージ・カタログ名は コマンド名に、、 . rn 。 " を付けたものになります。たとえば、 helloworld のメッセージ・カタログ名は helloworld. mo です。メッセージ・カタログをオ褓内する場所は任意に 選ぶことができます。 /usr/share/locale や /usr/local /share/locale などが選はれることが多いようです。 れらのディレクトリの下に各言語用のディレクトリを作 り、さらにその下にロケール・カテゴリーごとのディレ クトリを作ります。メッセージ・カタログは、 LC-MES- SAGES ロケール・カテゴリーの下に置くことになります。 図 3 の例では、 /usr/local/share/locale/ja-JP. EUC/ LC-MESSAGES/heIIoworld. mo というファイルが日 本語 (EUC) 用のメッセージ・カタログになります。 textdomain() は以後の gettext() 呼出しにおけるメッ セージ・カタログを〕尺します。プログラム中で 1 つの メッセージ・カタログしか使用しないのであれは、プログ ラムのう巨頁で textdomain() を 1 回呼ぶだけでかまいま せん。 gettext() は引数として渡されたメッセージ識別子をメ ッセージ・カタログから検索し、対応する各国語文字列へ のポインタを返します。対応する文字列がみつからなかっ 124 図 4 libintl 版 helloworld メッセージカタロク・ソース # , fuzzy msgid " " msgstr "Project-Id-Version: PACKAGE VERSION\n" ( 略 ) UNIX MAGAZINE 1999.8 msgstr msgid " He110 WorId! \n" # : helloworld . c:7 して、 PO ファイルの芻を自重丿庄成してくれます。 ドを使うと、プログラムで使われている文字列を識別・子と くれる xgettext コマンドカ嗣属しています。このコマン パッケージには、メッセージ識別子の抜出しを手助けして メッセージ識別子を取り出すだけでも大変です。 gettext 度大きなプログラムになるとメッセージの数も多くなり、 だけです。しかし、短いプログラムならともかく、ある程 的にメッセージ識別子と対応する文字列を書き連ねていく PO ファイルの書式に難しいところはありません。基本 イル " と呼ばれます。 です。このため、メッセージカタログ・ソースは、、 PO ファ メッセージカタログ・ソースファイルの才劇長子は、 . p 。 " ます。 作成します。図 4 にメッセージカタログ・ソースを示し セージカタログ・ソースを msgfmt コマンドで変換して メッセージ・カタログは、特定の書式で書かれたメッ lib ⅲ tl メッセージカタログ・ソース す。 た場合は、メッセージ識別・子文字列へのホインタを返しま "Content—Transfer—Encoding: ENCODING\n" "Content—Type : text/plain; charset=CHARSET\n" "MIME—Version: 1 . 0 \ Ⅱ " "Language—Team : LANGUAGE くLL@Ii.org/\n" "Last—TransIator : FULL NAME く EMAIL@ADDRESS>\n" "PO—Revision—Date : YEAR—MO—DA HO : MI + ZONE\n" "POT—Creation—Date : 1999 ー 06 ー 12 21 : 59 + 0900 \ Ⅱ "

4. UNIX MAGAZINE 1999年8月号

図 5 連載 / UN Ⅸ知恵袋ー メッセージカタログ・ソースイ乍成の充れ msgmerge によるメッセージカタログ・ソースの更新 ↓ xgettext による文字列の抜出し ↓ プログラム編集 $ xgettext he110worId. c UNIX MAGAZINE 1999.8 は例として日本語 ( EUC ) 用メッセージ・カタログを作成 ていますから、対応する文字列を埋めるだけです。ここで メッセージ識別・子、、 He Ⅱ。 W 。 rld ! " のエントリが作成され でにできているはすです。 Hello World プログラムでは、 成しているなら、必要なメッセージ識別子のエントリがす xgettext コマンドを使って PO ファイルの雛型を作 msgstr msgid " He110 Wor1d! \ Ⅱ " メッセージ識別子が必要になります。 です。 Hello World プログラムでは、以下に示すような ファイルの内容は、メッセージ識別子と対応文字列の羅列 任意のテキストエデイタて編集することができます。 PO PO ファイルはプレーンなテキストファイルですから、 PO ファイルの編集 別子を追加した新しい PO ファイルを出力します。 たメッセージ定義部を保存し、新規に現れたメッセージ識 合する例です。 msgmerge コマンドは、すでに翻訳され しく xgettext で作りだした最第斤のメッセージ識別子を統 上の例は、すでに存在する japanese. po ファイルに新 $ msgmerge Japanese . po messages ・ po ます。 msgmerge コマンドは 2 つの PO ファイルを統合し ッセージ・カタログを完成させます。 るので、通常は図 5 に示すような手順を繰り返しながらメ プログラムか変更されるたびにメッセージ識別子も変わ て、各国語用の PO ファイルを作っていきます。 というファイルが生成されます。このファイルをもとにし 結果です。 xgettext の実行か成功すると、 messages. po 図 4 に示したファイルは、図 3 を xgettext で処理した しましよう。 msgstr に EUC コードで対応文字列を書き ます。 msgid " He110 WorId! \n" msgstr " こんにちは世界 \ n " 125 集するのに便利な機能を提供する Emacs Lisp プログラ gettext?S ッケージには、 Emacs で PO ファイルを編 サポートがあればより簡単に編集できそうです。 造化された文書ですから、 PO ファイルの構造を利用した デイタて編集できます。しかしながら、 PO ファイルは構 PO ファイルはたんなるテキストです。使い慣れた工 PO モード れはドイツ語で表示されます。 MO ファイルをコピーし、環竟変数 LANG を、、 de " にす は、 /usr/local/share/locale/de/LC-MESSAGES に せん。たとえは、ドイツ譜阪の MO ファイルを作ったとき ピーします。プログラム自体の再コンパイルは必要ありま MO ファイルをメッセージカタログ・ディレクトリにコ 他の言語に対応させる場合は、対応する言語に翻獄した こんにちは世界 $ helloworld $ export LANG $ LANG=j a_JP. EUC Hello World を実行するには次のように入力します。 るには、環境変数 LANG の設定が必要です。日本語版 Hello World プログラムをそれぞれの言語で実行す libintl 版 HeIIo WorId の実行 j a—JP. EUC/LC_MESSAGES/ # cp messages . mo /usr/local/share/locale/=> $ su けは libintl 版 Hello World の完成です。 がります。これをメッセージカタログ・ディレクトリに置 PO ファイルに間題がなければ MO ファイルができあ $ msgfmt messages ・ po MO ファイルの作成には msgfmt コマンドを使います。 が、、 . m 。 " であることから、、 MO ファイル " と呼ばれます。 カタログに変換します。メッセージ・カタログは、長子 PO ファイルの準備ができたら、これをメッセージ・

5. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 図 1 国際化メッセージ取彳士組み メッセージ・テータヘース 本 日 ドイツ語 択 選 の 五ロ cp cp cp 2. メッセーシ・カタログの選択 合計 バイト所有者 3. メッセージの選択 total bytes owne r たとえは、 ls コマンドのメッセージを集めたメッセージ・ printf(catgets(cat—id, 1 , 1 , " He110 WorId! " ) ) ; カタロ久 cp コマンドのメッセージを集めたメッセージ・ cat-id は nl-catd 型の変数です。メッセージ・カタ カタログなどです。ふつう、 1 つのプログラムに対して 1 ログにアクセスするためのファイル記述子と考えてくださ つのメッセージ・カタログを作成します。もちろん、複数 い。 nl-catd は nl-types. h で定義されます。 のフログラムのメッセージを集めたメッセージ・カタログ 続く 2 つの数字は、カタログ内でのメッセージ集合識別 を作っても間題はありません。メッセージ・カタログのな 子とメッセージ識別子です。 catgets の場合、 1 つのメッ かには、各メッセージにヌ寸応するメッセージ識別子と、実 セージ・カタログのなかで複数のメッセージ集合を作るこ 際のメッセージが対になってオ内されています。 とができます。メッセージ集合識別子は、 1 つのメッセー ポイントは、メッセージ・カタログ名とメッセージ識別 ジ・カタログ内で重複しないように割り付けなけ川まなり 子です。これら 2 つの情報は、言語によらず固定の値をも ません。次のメッセージ識別子は、メッセージ集合のなか ちます。プログラムは、現在〕尺されている言語か何かを て特定のメッセージを指定するためのものです。 gettext 考えすとも、メッセージ・カタログとメッセージ識別 - 子さ では文字列でしたが、 catgets では数値になります。 え指定すれば、適切な言言 ) メッセージを取得できるので 最後の文字列はカタログに対応する文字列がなかったと す。また、メッセージ・カタログが分離されているため、 きのデフォルトの文字列です。したがって上の例は、「メッ 他の言語を追加サポートするのも容易です。 セージ集合 1 に含まれるメッセージ識別子 1 に対応する gettext と catgets の技ヤ勺な違いは、メッセージ識別 各国言 ) 文字列を、それがない場合は、 HeIIo WorId!" を 子窈旨定方法です。 gettext ではメッセージ識別イ・に英語 表小する」という意味になります。 文字列を使うのに対して、 catgets では数値を使います。 個人的には、 gettext のはうカワ。ログラマーからみて使 具ー勺なコード例をみてみましよう。 gettext の場合は次 いやすいように思います。しかし、コードをイ崧第する立場 のようになります。 としては、今後標準になっていく手法を用いたいと思うで printf (gettext ( " He110 WorId! " ) ) ; しよう。占鄲点では、どちらも標準になっていません。た だし、 catgets は XPG4 ライプラリの一部に含まれてお gettext() 関数は、引数として渡された文字列をメッセ り、現在多くのべンダーが XPG4 ライプラリを提供して ージ識別 - 子として、対応する各国語の文字列へのポインタ います。これに対して、 gettext を採用している商用べン を返します。対応する文字列か存在しない場合は、メッセ ダーは Sun のみであり、あまり普及しているとはいえま ージ識別子自体へのポインタを返します。よって、この せん。しかし、 gettext はメッセージの国際化に関する 例は「メッセージ識別子、、 He World!" に対応する国 機能だけを集めた小さなライプラリであり、プログラムと 際化メッセージ文字列を、それが存在しなけれは、、 HeIIo ともに簡単に配布することができます 1 。さらに、山も匠注、 W 。 rld ! " を表小する」プログラムになります。 catgets を使う場合は次のようになります。 1 ただし、 GPL2 の条件を守る必喫があります。 122 UNIX MAGAZINE 1999.8

6. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 合は 1 ~ 2 カ国語ごとにそれぞオ翻獄を依頼することにな ・亠五によって、文字の出力方向か特殊な場合がありま に 1 ロロ ります。さらに、ソフトウェアのバージョンアップによ す。たとえは、日本語は横書きと縦書きがあります。さ るメッセージ内容の更新まて考えると、切くなりそう らに、横書きの場合は左から右へ出力しますが、縦書きに てす。加えて、複数言言韶 ) サポートは、翻訳だけでこと足 なると右から左へと変わります。これらを実現するには、 りるわけではありません。たとえば、英譜阪のワードプロ 五との文字出力情報と高度な描画ライプラリが必要で セッサのメッセージを日本語に変更したからといって、そ す。残念ながら、これらの機能を国ド細勺に一ヨ殳化したライ オ・けごけでは日本語ワードプロセッサとして使いものになり プラリはまた存在しないようです。 ません。これは列であるとしても、簡単な文字列の 最後の文字入力樹冓も 新によってさまざまな不鶤頁が 入力画面で日本語の入力ができないようでは、やはり日本 あり、文字入力樹冓とプログラムとのインターフェイスも ヒされたソフトウェアとはいえないでしよう。これら多 多様です。 UNIX では、 X ウインドウ・システムカ甘是供す くの問題のために、世界のソフトウェアは長いあいた英語 る XIM (X lnput Method) を使った入ガ麪爰が一勺 のみをサポートしてきたのです。 です。 XIM を使えは種々の文字を入力することができま すが、 XIM だけで国際化はできません。たとえばコマン ド名はどうでしようか。 、、 ls " というコマンド名ではなく、 、ファイルリスト " という名前だったらいいと思う人もい ソフトウェアを国際化するには何が必要でしようか 。考 るでしよう。オフション・スイッチなども同じ問題をもっ えられる頁を列挙してみます。 ています。、、 ls ー a " よりも、、ファイルリストーすべて " と いう入力のほうが分かりやすい人もいるかもしれません。 ・刊属ドキュメントの翻駅 これらの間題はすぐに解決できるものではありません。 プログラムの出力メッセージの翻訳 しかしながら、より多くの人に言算機を使ってもらおうと ー・との文字出力方向のサポート に 1 ロロ、・一 思えば、避けては通れない訝題です。 ー・との文字入力欟冓の提供 に 1 ロロ、一 商用のソフトウェアは、自社内あるいは委託でドキュメ gettext と catgets ントの翻訳をおこないますが、個人べースのソフトウェア 真の国際化を実現するには、多くの問題を鮹夬しなけれ では困難です。ただ、伺属ドキュメントの翻訳は、ソフト ばなりません。しかし、一部の間題については上師交的簡単 ウェア・プログラム自体の作成とは別に、並行して作業を なガ去て夬できるところまできています。今回紹介する 進めることができます。事実、多くの英語ソフトウェアの gettext と catgets は、メッセージの国際化を支援しま ドキュメント、マニュアル類などが、有志の手によって す。なお、これらのイはみでは、縦書きや右から左への文 日本語や他の言語に訳さ公開されています。世界的に 字出力、各種文字入力樹冓とのインターフェイスは含まれ 認められるソフトウェアを作ることができれは、多くの有 ません。メッセージを叫屯に各国語て表示するためのライ 志が協力して翻訳にあたってくれます。非商用であるがゆ プラリです。メッセージの国際化だけとはいうものの、こ えの恩恵といえるでしよう。 れまで英語しかサポートできなかったプログラムを、簡単 プログラムの出力メッセージを複数言語に対応させるた なガ去で多国語に対応させられるのは大きな進歩です。 めには、メッセージの翻訳に加えて、ユーサーかイ屯用する メッセージを国ドヒする市咎はみは、 gettext も catgets 言語に応して出力メッセージの言語を切り替える樹冓が必 もほ司しです。図 1 にそのイ督はみを示します。 要です。過去にはソフトウェアごとに独自のオ冓を使って メッセージを国際化していたこともありましたが、近年で メッセージはプログラムと分離さメッセージのみ は GNU の gettext や X/Open の XPG4 に含まれる を収める別の場所に↑褓内されます。メッセージはメッセー catgets などて提供されるライプラリを利用することが多 ジ・カタログと呼ばれる集合を作ります。メッセージ・カ いようです。今回は、この仕組みを解説します。 タログには、関連する一漣のメッセージが集められます。 二一一口 国際化に必要な作業 121 UNIX MAGAZINE 1999.8

7. UNIX MAGAZINE 1999年8月号

UN Ⅸ知恵袋 メッセージの国際化 最近、ふとしたきっかけでソフトウェアのローカライ ズにかかわるようになりました。プラットホームは Mi- crosoft の Windows です。 OS 自体のローカライズ・サ ポートに問題はありません。 Windows は、おそらく世界 でもっとも多くの言語にローカライズされた OS でしょ う。しかしながら、 OS がローカライズされているからと いって、簡単に多国語サポートができるわけではありませ ん。単一の言語 ( たとえは日本語 ) のみをサポートする場 合はほとんど問題は生しませんが、多国語を同時にサポー トするとなるとさまざまな題か浮上します。ソフトウェ アの国ヒでは、 OS 自体よりも、翻訳者などのリソース、 他言語でのテスト・プラットホームの石新規言言韶 ) 追 加、多国語データの保守など、さまざまな周辺工竟カ墹題 になることのはうが多いようです。 UNIX については、ここ数年、商用の製品や一部のソ フトウェアを中心に国際イゞなされてきましたが、現在は 各種のフリー UNIX やフリー・ソフトウェアでもその恩 恵にあすかることかできるようになってきました。たとえ は、 GNOME などのフリーの統合環境が、まだまた凋題 はあるにせよ基本理念として国際化をサポートし始めてい ます。 Linux のディストリビューションには、はとんどの コンソール用コマンドが日本言群ヒされているものもありま す。言語環境を自分の母国語に設定するだけで、馴染みの ある言語でメッセージが表示されるのです。自分がふだん 使っている言語て操作できるという、他のパソコン用 OS では当然だった竟が、ようやく身近なフリー UNIX で も現実のものになりつつあります。 今回は、言語工韆竟に応して表示メッセージを切り替える ためのライプラリとして、 GNU の gettext と X/Open の XPG4 で規定されている catgets を紹介します。 120 ソフトウェアの国際化 現在、はとんどのソフトウェアはドキュメント類か英 語で書かれており、実行のメッセージも英語です。つま り、英語を理解できる人か英語で使用することを前提にし ています。ー殳に、英語はどの国へ行っても通しる共通言 語であるといわれますが、これは大きな誤解てす。英語が 母国語でない国では、仕事などて英語が必要な場合を除い て、英語の読み書きができないことのほうか普通です。大 手の商用ソフトハウスは、各国言、の対応に力を入れてい ます。これは、英語版だけでは世界に受け入れられないこ との裏付けといえるかもしれません。 英語だけでは駄目だという明白な事実がありながら、そ れでも英語を使い続けるのには 2 つの理由が考えられま す。 1 つは、共通言語であるという臨忍、、もう 1 つは複数 言語をサポートするための手間の咸です。 ソフトウェア事業は米国で生まれ、発展してきました。 当時の計算機の処理能力が多様な言語を取り扱うには不十 分であったことと、米国の母国語か英語であったことか ら、ソフトウェア黎明期の製品は英語しかサポートしてい ませんでした。これらのソフトウェアを輸入しているうち に、ソフトウェアは英語で書くものであるという認識かで きたのではないでしようか。 また、翻訳作業には多大な労力を必要とします。 1 カ国 語だけならともかく、数カ国語以にに翻訳するとなると、 とても 1 人でできる作業ではありません。金銭的な余裕が あれば専門の翻訳業者に委託できますが、個人べースのソ フトウェアでは引切見実的です。翻訳対象となるすべての言 語を知っている人に出会うことは稀であり、たいていの場 UNIX MAGAZINE 1999.8

8. UNIX MAGAZINE 1999年8月号

連載 / IJN Ⅸ知恵袋ー① 表 4 XPG4 による国際化て硬われる関数 nl—catd catopen (const char* c 観四 - れ佖 me , int ガ ) メッセージ・カタログ c 観四 - れ ame を開き、メッセージ・カタロク当主子を得る char* catgets (nl—catd catd , int set-id , int message-id , const char* d 可佖社 ) メッセージ・カタロク第己子 c 佖記で指定されたメッセージ・カタログに含まれるメッセージ集合 set-id のメッセージ識別子 message-id を取り出す int catclose(nl—catd catd) メッセージ・カタロ外当主子 c 。記を閉しる 図 9 XPG4 版 helloworld メッセージカタログ・ソース $set 1 1 こんにちは世界 \ Ⅱ $set れ C07 れ 7 〃 e れ $del れ comment 7 れ message-text $quote c $ CO 〃 7 ~ れ メッセージ集合れの削除 メッセージ集合れの開始 表 5 XPG4 メッセージカタログ・ソースの書式 コメント ォート文字定義 message-text を定義するときのク メッセージ識別子 m の文字列定義 メッセージ識別子の管理などは手重丿におこなう必があり 造を利用したフリーのエデイタはみあたらないようです。 ログ・ソースを統合するコマンドや、カタログソースの構 変になってきます。麒点で、 XPG4 のメッセージカタ ログ・ソースのメッセージ定義との一費性を保つ作業が大 プログラム中で使うメッセージ識別子とメッセージカタ グ・ソースよりも管理が楽ですが、文字列カえてくると 文字列の数か少ないときは libintl のメッセージカタロ 字を指定してください。 の末尾に空白を入れたい場合は $ qu 。 te 命令でクオート文 に続く空白は無視されるので、明カ勺にメッセージ文字列 あとにメッセージ文字列を書くだけです。 message-text ます。メッセージの定義はメッセージ識別子となる数の セージ集合カ喧言されるまで同しメッセージ集合に含まれ 降に定義されたメッセージは、次の $ set 命令で新しいメッ $set 命令はメッセージ集合を宣言します。 $set 命令以 表 5 にメッセージカタログ・ソースの書式を示します。 128 $ gencat helloworld パイルします。 ます。 にメッセージカタログ・ソースを指定します。できあがっ 第 1 引数にメッセージ・カタログ名を、第 2 引ユ降 helloworld . src メッセージカタログ・ソースは gencat コマンドでコン たメッセージ・カタログをメッセージカタログ・ディレ クトリに置けば XPG4 版 Hello World の完成です。 XPG4 版 Hello World の実行 XPG4 版の Hello World を実行する前に、 catopen() がメッセージ・カタログをみつけられるように環境変数 NLSPATH を指定します。 他言語のメッセージ・カタログを利用する場合は、サ こんにちは世界 $ helloworld export NLSPATH LC_MESSAGES/%N $ NLSPATH=/usr/10ca1/share/10ca1e/j a_JP. EUC/=> UNIX MAGAZINE 1999.8 ( しま・けいいちシャーフ ) の他の部分を説明します。 次回は、今回紹介しきれなかった gettext パッケージ 注いでもいいのではないでしようか。 くという意味ではメッセージの日本言ヒ ( 国際イりに力を になりませんでしたが、今後ューザーの裾野をひろげてい だけか利用するという特殊な竟だったため、あまり問題 げられます。これまで、ある程度英語の知識がある人たち 1 つに、メッセージ類がすべて英語で表示されることカ できません。孑物斤の原因はさまざまだと思いますが、その して UNIX から遠ざかっていっているという事実は無視 ようになりました。しかしながら、多くのユーサーカ甘斤 UNIX も、いまでは一般の人が上交的簡単に利用できる 研究者や一部の特殊なユーザーのみを対象にしてきた ☆ 更します。 NLSPATH の言語の部分を対応する言語識別文字列に変 メッセージカタログ・ディレクトリに置いて、環境変数 ポートしたい言語のメッセージ・カタログを言語ごとの