マルチバイト文字の文字列を文字列リテラルとして解析する機能が UIL (ユーザ・インタフェース言語) に追加されました。UIL ファイルの作成は、目的の言語の特徴を使って UID (ユーザ・インタフェース定義) ファイルを記述することで実行できます。
UIL コンパイラは、標準にはない charset をロケール・テキストとして解析します。そのためには、UIL コンパイラがどのロケール・テキストとも同じロケールで実行する必要があります。
ウィジェットのロケール・テキストにフォント・セット (複数のフォント) が必要な場合、フォント・セットがリソース・ファイル内に指定されなければなりません。font パラメータはフォント・セットをサポートしません。
UIL に特定の言語を使用するために、UIL ファイルが目的の言語の特徴に応じて記述され、UID ファイルにコンパイルされます。ローカライズされたテキストを格納している UIL ファイルは、それを実行するロケールにコンパイルする必要があります。
文字列リテラルの例を次に示します。cur_charset の値は常に default_charset の値に設定されており、それによって文字列リテラルがロケール・テキストを格納できます。
default_charset の値でロケール・テキストを文字列リテラルに設定するには、次のように入力します。
XmNlabelString = 'XXXXXX';
または、次のように入力します。
XmNlabelString = #default_charset"XXXXXX";
ロケール・テキストのエンコーディングに一致する LANG 環境変数で UIL ファイルをコンパイルしてください。そうでない場合、文字列リテラルは正しくコンパイルされません。
フォント・セットは UIL ソース・プログラミングを介して設定することはできません。フォント・セットが必要な場合は、次の例のように必ずリソース・ファイルにフォント・セットを設定してください。
*fontList: -*-r-*-20-*:
UIL はフォント・リストの作成に使用する 3 つの関数 (FONT 、FONTSET 、FONT_TABLE) を持っています。FONT 関数と FONTSET 関数はフォント・リスト・エントリを作成します。FONT_TABLE 関数はそれらのフォント・リスト・エントリからフォント・リストを作成します。
FONT 関数はフォント指定を含むフォント・リスト・エントリを作成します。引き数は XLFD フォント名を表す文字列です。FONTSET 関数は、フォント・セット指定を含むフォント・リスト・エントリを作成します。引き数は、ベース名フォント・リストを表すカンマで区切られた XLFD フォント名のリストです。
FONT と FONTSET には両方とも、フォント・リスト・エントリのフォント・リスト要素タグを指定するオプションの CHARACTER_SET 宣言パラメータがあります。どちらの場合も、CHARACTER_SET 宣言パラメータが指定されない場合は、UIL が次のようにフォント・リスト要素タグを決定します。
モジュールに CHARACTER_SET 宣言がなく、uil コマンドが -s オプションと共に呼び出されたか、あるいは Uil() 関数が use_setlocale_flag セットで開始された場合、フォント・リスト要素タグは XmFONTLIST_DEFAULT_TAG です。
それ以外の場合、UIL コンパイル環境にフォント・リスト要素タグが設定されている場合は、フォント・リスト要素タグは LANG 環境変数のコード・セット・コンポーネントです。LANG 環境変数が設定されていない、またはコード・セットがない場合は、フォント・リスト要素タグは XmFALLBACK_CHARSET の値です。
FONT_TABLE 関数は、FONT または FONTSET により作成された、カンマで区切られたフォント・リスト・エントリのリストからフォント・リストを作成します。その結果のフォント・リストは、フォント・リスト・リソースの値として使用できます。そのようなリソースの値として単一のフォント・リスト・エントリが提供される場合は、UIL はそのエントリをフォント・リストに変換します。
必要であれば、次の例のように入力メソッド関連リソースをリソース・ファイルに設定してください。
*preeditType: OverTheSpot、OffTheSpot、Root、または None
ロケールを区別するアプリケーションの場合は、UID ファイルを適切なディレクトリに設定してください。UIDPATH または XAPPLRESDIR 環境変数を適切な値に設定してください。
たとえば、英語環境で uil_sample プログラムを実行するには (LANG 環境変数は en_US) 、$HOME/en_US ディレクトリにラテン文字で uil_sample.uid を設定するか、またはあるディレクトリに uil_sample.uid を設定して UIDPATH 環境変数に uil_sample.uid ファイルの完全パス名を設定してください。
uil_sample プログラムを日本語環境で実行するには (LANG 環境変数は ja_JP)、$HOME/ja_JP ディレクトリに日本語の (マルチバイト) 文字で uil_sample.uid ファイルを作成するか、または uil_sample.uid を一意のディレクトリに配置して UIDPATH 環境変数に uil_sample.uid ファイルの完全パス名を設定してください。次のリストは可能な変数を指定します。
UID ファイル文字列を指定します。
アプリケーションのクラス名を指定します。
xnlLanguage リソースか LC_CTYPE カテゴリの値を指定します。
xnlLanguage リソースか LC_CTYPE カテゴリの言語コンポーネントを指定します。
XAPPLRESDIR 環境変数が設定されている場合、MrmOpenHierarchy() 関数が次の順番で UID ファイルを検索します。
UID ファイル・パス名
$UIDPATH
%U
$XAPPLRESDIR/%L/uid/%N/%U
$XAPPLRESDIR/%l/uid/%N/%U
$XAPPLRESDIR/uid/%N/%U
$XAPPLRESDIR/%L/uid/%U
$XAPPLRESDIR/%l/uid/%U
$XAPPLRESDIR/uid/%U
$HOME/uid/%U
$HOME/%U
/usr/lib/X11/%L/uid/%N/%U
/usr/lib/X11/%l/uid/%N/%U
/usr/lib/X11/uid/%N/%U
/usr/lib/X11/%L/uid/%U
/usr/lib/X11/%l/uid/%U
/usr/lib/X11/uid/%U
/usr/include/X11/uid/%U
XAPPLRESDIR 環境変数が設定されていない場合は、MrmOpenHierarchy() 関数は XAPPLRESDIR 環境変数の代わりに $HOME を使用します。
default_charset 文字列リテラルについては、どんな文字でも有効な文字列リテラルとして設定できます。たとえば、LANG 環境変数が el_GR の場合は、default_charset の文字列リテラルにはギリシャ文字が入ります。LANG 環境変数が ja_JP の場合は、default_charset の文字列リテラルには日本語の EUC でエンコードされたすべての日本語の文字が入ります。
文字列リテラルに文字セットが設定されていない場合、文字列リテラルの文字セットは cur_charset に設定されます。また、システム環境では、cur_charset の値は常に default_charset に設定されています。
図 4-4 は、英語と日本語の環境での UIL のプログラム例を示します。
次のプログラム例で LLL はロケール・テキストを示します。LLL には日本語、韓国語、中国語 (繁体字)、ギリシャ語、フランス語、その他の言語が入ります。
uil_sample.uil ! ! sample uil file - uil_sample.uil ! ! C source file - uil_sample.c ! ! Resource file - uil-sample.resource ! module Test version = 'v1.0' names = case_sensitive objects = { XmPushButton = gadget; } !************************************ ! declare callback procedure !************************************ procedure exit_CB ; !*************************************************************** ! declare BulletinBoard as parent of PushButton and Text !*************************************************************** object bb : XmBulletinBoard { arguments{ XmNwidth = 500; XmNheight = 200; }; controls{ XmPushButton pb1; XmText text1; }; }; !**************************** ! declare PushButton !**************************** object pb1 : XmPushButton { arguments{ XmNlabelString = #Normal "LLLexit buttonLLL"; XmNx = 50; XmNy = 50; }; callbacks{ XmNactivateCallback = procedure exit_CB; }; }; !********************* ! declare Text !********************* text1 : XmText { arguments{ XmNx = 50; XmNy = 150; }; }; end module; /* * C source file - uil_sample.c * */ #include <Mrm/MrmAppl.h> #include <locale.h> void exit_CB(); static MrmHierarchy hierarchy; static MrmType *class; /******************************************/ /* specify the UID hierarchy list */ /******************************************/ static char *aray_file[] = {"uil_sample.uid"}; static int num_file = (sizeof aray_file / sizeof aray_file[0]); /******************************************************/ /* define the mapping between UIL procedure names*/ /* and their addresses */ /******************************************************/ static MRMRegisterArg reglist[]={ {"exit_CB",(caddr_t) exit_CB }
UIL ファイルに文字列を指定する方式は 3 つあります。
文字列リテラルとして指定
文字列リテラルは、ヌルで終了する文字列またはコンパウンド・ストリングのいずれかとして UID ファイルに格納される可能性があります。
コンパウンド・ストリングとして指定
ワイド文字の文字列として指定
文字列リテラルとコンパウンド・ストリングは両方とも、テキスト、文字セット、描画方向から成ります。方向が明示されていない文字列リテラルとコンパウンド・ストリングについては、UIL は文字セットから描画方向を推定します。UIL 連結演算子 (&) は、文字列リテラルとコンパウンド・ストリングの両方を連結します。
UIL が文字列リテラルを UID ファイルにヌルで終了する文字列として格納するかコンパウンド・ストリングとして格納するかに関係なく、UIL は各文字列の文字セットと描画方向に関する情報をテキストと共に格納します。一般に、次のような場合に、UIL は文字列リテラルまたは文字列表現をコンパウンド・ストリングとして UID ファイルに格納します。
文字列表現が異なる文字セットまたは描画方向の 2 つ以上のリテラルから成る場合
リテラルまたは文字列表現がコンパウンド・ストリングのデータ型を持つ値 (データ型がコンパウンド・ストリングであるリソースの値など) として使用される場合
UIL は、文字セットを指定する数多くのキーワードを認識します。UIL は、解析方向と文字が 8 ビットと 16 ビットのいずれかなどの解析規則を、認識する文字セットのそれぞれに関連付けます。UIL の CHARACTER_SET を使用して文字セットを定義することも可能です。
文字列リテラルの形式は次のいずれかです。
'[character_string]'
[#char_set]
"[character_string]"
各形式において、文字列の文字セットは次のように決定されます。
'character_string' として宣言された文字列の場合、UIL コンパイル環境に LANG 環境変数が設定されていれば、文字セットは LANG 環境変数のコード・セット・コンポーネントです。あるいは、LANG 環境変数が設定されていないかコード・セットがない場合は、文字セットは XmFALLBACK_CHARSET の値です。デフォルトでは XmFALLBACK_CHARSET の値は ISO8859-1 ですが、ベンダが別の値を供給する場合もあります。
#char_set "string" として宣言された文字列の場合、文字セットは char_set です。
"character_string" として宣言された文字列の場合、文字セットはモジュールに CHARACTER_SET 節があるかどうか、また UIL コンパイラの use_setlocale_flag が設定されているかどうかに依存します。
モジュールに CHARACTER_SET 節がある場合は、文字セットはその節に指定されたものになります。
モジュールに CHARACTER_SET 節がないが uil コマンドが -s オプションで開始された場合、または Uil() 関数が use_setlocale_flag が設定された状態で開始された場合は、UIL は setlocale() 関数を呼び出して現在のロケールの文字列を解析します。結果となる文字列の文字セットは、 XmFONTLIST_DEFAULT_TAG です。
モジュールに CHARACTER_SET 節がなく、uil コマンドが -s オプションなしで実行された場合、または Uil() 関数が use_setlocale_flag なしで実行された場合は、UIL コンパイル環境に LANG 環境変数が設定されていれば、文字セットは LANG 環境変数のコード・セット・コンポーネントです。あるいは、LANG 環境変数が設定されていないかコード・セットがない場合は、文字セットは XmFALLBACK_CHARSET の値です。
UIL は常に、COMPOUND_STRING 関数を使用して指定された文字列をコンパウンド・ストリングとして格納します。この関数は、文字セットの文字列表現とオプション指定、方向、文字列にセパレータを追加するかどうかについてを引き数に取ります。文字セットまたは方向が指定されない場合、前の部分で説明したように UIL はその値を文字列表現から獲得します。
¥ (バックスラッシュ) で始まるあらかじめ定義された特定のエスケープ・シーケンスは、次の例外を除いて文字列リテラルに表示できます。
単一引用符に囲まれた文字列は、複数の行にわたることが可能です。各改行文字はバックスラッシュでエスケープされます。二重引用符に囲まれた文字列は、複数の行に渡ることはできません。
エスケープ・シーケンスは、現在のロケールで解析された文字列 (ローカライズされた文字列) の中で逐語的に処理されます。