コンパウンド・ストリングは、プログラムを変更しなくても数多くのフォントでテキストを表示できるようにテキストをエンコーディングする手段です。デスクトップは、Text ウィジェットと TextField ウィジェット以外のすべてのテキストを表示するのにコンパウンド・ストリングを使用します。この節は、コンパウンド・ストリングの構造、コンパウンド・ストリングとフォント・リスト間の対話を説明し (コンパウンド・ストリングの表示方法を決定する)、国際化対応プロセスにとって重要な点にフォーカスをあてます。
コンパウンド・ストリングは、タグ長値のセグメントから成る内部のエンコーディングです。意味上では、コンパウンド・ストリングには、表示されるテキスト、フォント・リストの要素に一致するタグ (フォント・リスト要素タグ)、表示する方向を示すインジケータなどのコンポーネントがあります。
コンパウンド・ストリングのコンポーネントは、次の 4 つのいずれかの型になります。
フォント・リスト要素タグ
フォント・リスト要素タグ XmFONTLIST_DEFAULT_TAG は、テキストが現在のロケールのコード・セットでエンコードされることを示します。
その他のフォント・リスト要素タグは、あとでテキストをフォント・リストの特定のエントリに一致させるために使用されます。
方向識別子
文字列のテキスト
国際化対応アプリケーションでは、テキストは大きく 2 種類に分けられます。ローカライズされた処理が必要なテキストと、そうでないテキストです。
セパレータ
コンパウンド・ストリングのテキスト・コンポーネントをフォント・リストのフォントまたはフォント・セットに相関させる文字列の値を示します。
文字がキーボードに入力される順序と、その文字が画面に表示される順序の関係を示します。たとえば、英語、フランス語、ドイツ語、イタリア語の表示順序は左から右であり、ヘブライ語とアラビア語の表示順序は右から左です。
表示されるテキストを示します。
値がない特殊な形式のコンパウンド・ストリングのコンポーネントを示します。セパレータは他のセグメントを区切るのに使用されます。
共通デスクトップ環境では、コンパウンド・ストリングを表示するために、テキスト・コンポーネントで識別される指定されたフォント・リスト要素タグを使用します。指定されたフォント・リスト要素タグは、新しいフォント・リスト要素タグが見つかるまで使用します。共通デスクトップ環境は、現在のコード・セットに対して正しいフォントに一致する特別なフォント・リスト要素タグ XmFONTLIST_DEFAULT_TAG を提供します。XmFONTLIST_DEFAULT_TAG はフォント・リストのデフォルト・エントリを識別します。詳細は、コンパウンド・ストリングとフォント・リストを参照してください。
コンパウンド・ストリングの方向セグメントは、テキストが表示される方向を指定します。方向は左から右または右から左です。
コンパウンド・ストリングは、Text ウィジェットと TextField ウィジェット以外のすべてのテキストを表示するのに使用されます。コンパウンド・ストリングは、表示できるように適切なウィジェット・リソースに設定されます。たとえば、PushButton ウィジェットのラベルは Label ウィジェットから引き継がれ、リソースは XmNlabelString で型は XmString です。このことは、リソースがコンパウンド・ストリングの値を予想していることを意味します。コンパウンド・ストリングはプログラムで作成したり、リソース・ファイルで定義することが可能です。
アプリケーションは、XmStringCreateLocalized() コンパウンド・ストリング簡易関数を使用してコンパウンド・ストリングを作成することで、このリソースをプログラムで設定できます。
この関数は、現在のロケールのエンコーディングでコンパウンド・ストリングを作成し、自動的に XmFONTLIST_DEFAULT_TAG をフォント・リスト・エントリ・タグに設定します。
次のコードの一部分は、プログラムを使用してプッシュ・ボタンに XmNlabelString リソースを設定するための 1 つの方法を示します。
#include <nl_types.h> Widget button; Args args[10]; int n; XmString button_label; nl_msg my_catd; (void)XtSetLanguageProc(NULL,NULL,NULL); . . button_label = XmStringCreateLocalized (catgets(my_catd, 1, 1, "default label"), XmFONTLIST_DEFAULT_TAG); /* Create an argument list for the button */ n = 0; XtSetArg (args[n], XmNlabelString, button_label); n++; /* Create and manage the button */ button = XmCreatePushButton (toplevel, "button”, args, n); XtManageChild (button); XmStringFree (button_label);
国際化対応プログラムでは、ボタン・ラベル用のラベル文字列は外部リソースから獲得してください。たとえば、ボタン・ラベルはプログラムではなくリソース・ファイルから得られます。次の例では、プッシュ・ボタンは form1 と呼ばれる Form ウィジェットの子であると想定します。
*form1.button.labelString: Push Here
ここで、デスクトップの文字列からコンパウンド・ストリングへのコンバータは、リソース・ファイル・テキストからコンパウンド・ストリングを生成します。このコンバータは常に XmFONTLIST_DEFAULT_TAG を使用します。
デスクトップがコンパウンド・ストリングを表示する場合、デスクトップはセグメントのフォント・リスト要素タグを使用して、各セグメントをフォントまたはフォント・セットに関連付けます。アプリケーションは希望するフォントまたはフォント・セットを読み込んで、そのフォントまたはフォント・セットと、それに関連付けられたフォント・リスト要素タグを含むフォント・リストを作成し、同じタグでコンパウンド・ストリング・セグメントを作成していなければなりません。
デスクトップは、コンパウンド・ストリングをフォント・リスト・エントリに割り当てるとき、次のように設定された検索プロシージャに従います。
デスクトップは、フォント・リストで、コンパウンド・ストリングに指定されたフォント・リスト要素タグと厳密に一致するものを検索します。一致点が見つかると、コンパウンド・ストリングはそのフォント・リスト・エントリに割り当てられます。
コンパウンド・ストリングとフォント・リスト間の一致点が見つからない場合は、デスクトップは、コンパウンド・ストリングをフォント・リスト要素タグに関係なくフォント・リストの最初の要素に割り当てます。
後方互換を保つため、厳密な一致点が見つからない場合は、コンパウンド・ストリングまたはフォント・リストの XmFONTLIST_DEFAULT_TAG の値が、XmSTRING_DEFAULT_CHARSET のタグでコンパウンド・ストリングまたはフォント・リストのエントリを作成した結果のタグに一致します。
図 4–1 は、フォント・リスト要素タグが XmFONTLIST_DEFAULT_TAG 以外に設定される場合の、コンパウンド・ストリング、フォント・セット、フォント・リスト間の関係を示しています。
次の例は、tagb と呼ばれるタグの使用方法を示しています。
XFontSet *font1; XmFontListEntry font_list_entry; XmFontList font_list; XmString label_text; char **missing; int missing_cnt; char *del_string; char *tagb; /* Font list element tag */ char *fontx; /* Initialize to XLFD or font alias */ char *button_label; /* Contains button label text */ . . font1 = XCreateFontSet (XtDisplay(toplevel), fontx, & missing, & missing_cnt, & def_string); font_list_entry = XmFontListEntryCreate (tagb, XmFONT_IS_FONTSET, (XtPointer)font1); font_list = XmFontListAppendEntry (NULL, font_list_entry); XmFontListEntryFree (font_list_entry); label_text = XmStringCreate (button_label, tagb);
XCreateFontSet() 関数はフォント・セットを読み込み、XmFontListEntryCreate() 関数はフォント・リスト・エントリを作成します。アプリケーションは、エントリを作成してそれを既存のフォント・リストに追加するか、または新しいフォント・リストを作成しなければなりません。どちらの場合も XmFontListAppendEntry() 関数を使用します。適切な場所にフォント・リストがないので、前述のコード例ではフォント・リスト引き数が NULL の値になっています。XmFontListAppendEntry() 関数は、単一のエントリ font_list_entry を持つ font_list という新しいフォント・リストを作成します。font_list に新しいエントリを追加するには、同じプロシージャに従い、ヌルでないフォント・リスト引き数を提供してください。
図 4–2 は、フォント・リスト要素タグが XmFONTLIST_DEFAULT_TAG に設定される場合の、コンパウンド・ストリング、フォント・セット、フォント・リストの関係を示しています。この場合、値のフィールドはロケール・テキストです。
ここで、デフォルト・タグは Font_Set_C を指しています。Font_Set_C は、その言語で文字を表示するのに必要なフォントを識別します。
Text ウィジェットと TextField ウィジェットは、テキスト情報を表示します。そのためには、ウィジェットは、情報を表示するのに使う正しいフォントを選択できなければなりません。Text ウィジェットと TextField ウィジェットは、正しいフォントを見つけるために、次のように設定された検索パターンに従います。
ウィジェットは、フォント・リストでフォント・リスト要素タグ XmFONTLIST_DEFAULT_TAG を持つフォント・セットであるエントリを検索します。一致点が見つかった場合は、そのフォント・リスト・エントリを使用します。それ以上の検索は行われません。
一致点が見つからなければ、ウィジェットは、フォント・リストでフォント・セットを指定するエントリを検索します。ウィジェットは最初に見つかったフォント・セットを使用します。
フォント・セットが見つからない場合は、ウィジェットはフォント・リストの 1 番目のフォントを使用します。
フォント・セットを使用すると、ロケール内のどの文字に対してもグリフが確実に存在します。