ロカール・メッセージを選択する方法として、Unix ライクなシステムには大きく 言って 2 つのライブラリ・インタフェースがあります。1 つは「catgets」、 もう 1 つは「gettext」です。 catgets のアプローチは、すべての文字列はユニークな番号が割り振られていて、 その番号をメッセージが書いてあるテーブルのインデックスとして使っています。 一方 gettext のアプローチでは、文字列(通常は英語)を使って、テーブルにある 文字列を翻訳したものを捜します。 catgets(3) は規格として認められていて(X/Open Portability Guide の 3 号 と Single Unix Specification で)、 プログラムで利用可能です。 「gettext」のインタフェースは、公式の規格ではありませんが(しかしもともと は UniForum の提案でした)、インタフェースとして catgets より利用されて いると思っています(Sun や GNU のすべてのプログラムで)。 【訳註:UniForum については、 http://www.uniforum.org/ を見てください】
原理的には catgets の方がわずかに速いはずですが、最近のマシンであれば その差はほんのわずかです。また、catgets() が一意の識別子を維持・管理する のが面倒で、gettext() のインタフェースの方が使いやすくなっています。 私としては、gettext()を使用することをお薦めします。これは使いやすいからに 他なりません。 しかし私の言葉をそのまま鵜呑みにしないでください。gettext については GNU の ドキュメント(info:gettext#catgets) で、たっぷりいろいろと比較していますので、 見てください。
catgets(3)(とそれと関連している catopen(3))はセキュリティ上の問題に対して とても脆弱です。それは環境変数である NLSPATH を使用して、国際化された メッセージを取得するファイル名を管理しているからです。 GNU C ライブラリは NLSPATH を setuid や setgid したプログラムでは無視 するようになっています。これは役には立ちますが、他の実装で動作する プログラムを防御できませんし、そのような防御が必要とは「見えない」 その他のプログラム(CGI スクリプトのような)も防御できません。
広く利用されている「gettext」のインタフェースは、少なくとも私の知る限り、 悪意を持って設定した NLSPATH に対して脆弱ではありません。 しかし、悪意を持って設定した LC_ALL や LC_MESSAGES は、問題を起こすように 思えます。 また、gettext の cat-compat.c にある bindtextdomain() ルーチンを使うと NLSPATH に頼ることになります。
[A-Za-z][A-Za-z0-9_,+@\-\.=]* |
本当にこだわるなら、代わりに li18nux で提供しているロカールのパタンに マッチするものだけを使ってください。
^[A-Za-z]+(_[A-Za-z]+)? (\.[A-Z]+(\-[A-Z0-9]+)*)? (\@[A-Za-z0-9]+(\=[A-Za-z0-9\-]+) (,[A-Za-z0-9]+(\=[A-Za-z0-9\-]+))*)?$ |
もちろん言語というものは、標準的な手段で書き文字を表現できなくては、言語を サポートしているとは言えません。このことから文字のエンコードという問題に直面 することになります。