テキストを X Windows System のクライアントに受け渡す場合、少なくとも 2 つの状況が国際化対応に関係します。
「ローカライズされたテキストの抽出」に、ローカライズされたテキストを獲得する方法が説明されています。
1 つのフォントには、ロケールの文字を描画するのに使用されるグリフのセットが含まれます。しかし、指定したロケールのために、次のような作業を実行する場合があります。
必要なフォントの決定
必要なフォントの指定
リソース・ファイルでフォントの charset の決定
1 つのロケールに対して複数のフォントの選択
XLFD 名の最後の 2 つのフィールドは、フォントにどのグリフが含まれているか、セットから特定のグリフを獲得するのにどの値が使用されるかを識別します。これらの最後の 2 つのフィールドは、フォントに含まれるグリフのエンコーディングを識別します。
例
-adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1
この XLFD 名の最後の 2 つのフィールドは、iso8859 と 1 です。これらのフィールドは、ISO8859-1 標準グリフがフォントに含まれるよう指定しています。さらに、ISO8859-1 標準の文字コード値を使用して、各文字に対応するグリフを索引付けするようにも指定しています。
アプリケーションがデータを受け渡すために使用するフォント charset は、選択するロケールによって決まります。フォント charset 情報はロケールの選択に基づくので、フォント指定はアプリケーションによってハードコードしてはいけません。その代わりに、ロケール固有の app-defaults ファイルにフォント指定を格納して、ローカライズされたバージョンの app-defaults ファイルを作成できます。
さらに、フォントはフォント・セットとして指定されます。フォント・セットは、複数のフォントを指定するのに XLFD が使用する Xlib の概念です。XLFD のフォント charset フィールドは、フォント・セットを作成して、ユーザが指定したロケールに基づいてこれらのフィールドを埋める Xlib コードで指定されます。
日本語、中国語、韓国語などの多くの言語で、単一のエンコーディングをサポートするのに複数の charset が組み合わされています。このような場合、文字を描画するためには必ず複数のフォントをオープンしなければなりません。さらに、データは各フォントに対応するセグメントへと解析されなければならず、場合によりそれらのセグメントの文字値をグリフ索引に変換しなければなりません。XFontset は、指定ロケールの文字データを描画するのに必要なすべてのフォントの集合ですが、このような問題も処理します。さらに、描画のためのセットとメトリック・ルーチンが提供されます。それらは内部で文字列を一貫した文字セットのセグメントに分け、値をグリフ索引に変換します。これらのルーチンはアプリケーション開発者の負担を軽減します。アプリケーション開発者は、ユーザのフォント・セットと新しい X11R5 描画とメトリック・アプリケーション・プログラム・インタフェース (API) だけを必要とします。
この節では次のフォント・オブジェクトを説明します。
フォント・セット
フォント
フォント・リスト
一般的に、Xlib を使用してローカライズされたテキストを描画するすべての国際化対応プログラムは、ロケール依存フォントを指定するために XFontSet() を使用しなければなりません。1 つのフォント・セット内の特定のフォントは、charset フィールドには指定せずに、XLFD 命名規則を使って指定されます。XFontSet のリソース名は *fontSet です。フォント・リソースのリストは、「ローカライズされたリソース」を参照してください。
(XmString 関数やウィジェットを使用するのに対して) Xlib を直接使用してテキストを描画するアプリケーションは、Xt が提供する文字列からフォント・セットへのコンバータを利用できます。たとえば、次のコード・フラグメントは Xt を使用する場合と使用しない場合のフォント・セットの獲得方法を示します。
/* pardon the double negative... means "If using Xt..." */ #ifndef NO_XT typedef struct { XFontSet fontset; char *foo; } ApplicationData, *ApplicationDataPtr; static XtResource my_resources[] = { { XtNfontSet, XtCFontSet, XtRFontSet, sizeof (XFontSet), XtOffset (ApplicationDataPtr, fontset), XtRString, "*-18-*"}} #endif /* NO_XT */ ... #ifdef NO_XT fontset = XCreateFontSet (dpy, "*-18-*", &missing_charsets, &num_missing_charsets. &default_string); if (num_missing_charsets > 0) { (void) fprintf(stderr, "&s: missing charsets.¥n", program_name); XFreeStringList(missing_charsets); } #else XtGetApplicationResources(toplevel, &data, my_resources, XtNumber(my_resources), NULL, 0); fontset = data.fontset; #endif /* NO_XT */
国際化対応プログラムは、特定の charset と特定の文字セットのために使用する場合以外は、フォント (つまり XFontStruct) を直接使用することは避けてください。ロケールが必要とする特定の charset を接続しているサーバがサポートしていない場合、XFontStruct の使用は制限されます。XFontStruct のリソース名は *font です。
ローカライズされたテキストを描画するためにウィジェットや XmString を使用しているすべてのプログラムは、フォントを指定するために XmFontList 名を指定する必要があります。フォント・リストは 1 つ以上のフォント・セットまたはフォントのリストか、あるいはフォント・セットとフォント両方のリストです。フォント・リストは、ウィジェットがテキストを描画するために使用すべきフォントとフォント・セットのリストを指定するために使用されます。より複雑なアプリケーションの場合、フォント・リストは複数のフォント・セットを指定し、各フォント・セットには名前がタグ付けされます (たとえば Bold、Large、Small など) 。このタグは XmString セグメントのタグと関連付けられます。タグは、フォント・リスト内の特定のフォントやフォント・セットを識別するのに使用されます。
表 2-1 にフォント・セットとフォント・リストの形式を示します。
表 2-1 フォント・セットおよびフォント・リストの形式
リソース型 |
XLFD セパレータ |
終止符 |
FontEntry セパレータ |
---|---|---|---|
*fontSet: (Xlib) |
カンマ |
なし |
なし |
*fontList : (Motif) |
セミコロン |
コロン |
カンマ |
app_foo*fontList: -adobe-courier-medium-r-normal--24-240-75-75-m-150-*:
上記の fontList は、ユーザのロケールに適切なものとして、1 つ以上の 24 ポイント Adobe Courier フォントから成るフォント・セットを指定しています。
app_foo*fontList: -adobe-courier-medium-r-normal--18-*; *-gothic-*-18-*:
この fontList は、ユーザのデータの一部の文字には 18 ポイント Courier フォントから成るフォント・セットを指定し、その他の文字には 18 ポイント Gothic フォントを指定しています。
Motif ベースのアプリケーションは、フォント・リストに入っているフォント・セットに直接アクセスする必要が起こる場合があります。たとえば、DrawingArea ウィジェットを使用するアプリケーションは、描画したイメージの 1 つにラベルを付けたいことがあります。次のコード例は、フォント・リストからのフォント・セットの抽出方法を示しています。この例では、タグ XmFONTLIST_DEFAULT_TAG でフォント・セットを探します。XmFONTLIST_DEFAULT_TAG が「ロケールの codeset」を指すためです。アプリケーションでは、ローカライズされたデータを含むすべての文字列に XmFONTLIST_DEFAULT_TAG を使用してください。
XFontSet FontList2FontSet( XmFontList fontlist) { XmFontContext context; XmFontListEntry next_entry; XmFontType type_return = XmFONT_IS_FONT; char* font_tag; XFontSet fontset; XFontSet first_fontset; Boolean have_font_set = False; if ( !XmFontListInitFontContext(&context, fontlist)) { XtWarning("fl2fs: can't create fontlist context..."); exit 0; } while ((next_entry = XmFontListNextEntry(context) != NULL) { fontset = (XFontSet) XmFontListEntryGetFont(next_entry, &type_return); if (type_return == XmFONT_IS_FONTSET ) { font_tag = XmFontListEntryGetTag(next_entry); if (!strcmp(XmFONTLIST_DEFAULT_TAG, font_tag) { return fontset; } /* Remember the 1st fontset, just in case... */ if (!have_font_set) { first_fontset = fontset; have_font_set = True; } } } if (have_font_set) return first_fontset; return (XFontSet)NULL; }
次の Xlib のフォント管理 API 関数を使用できます。
XCreateFontSet()
XLocaleOfFontSet()
XFontsOfFontSet()
XBaseFontNameListOfFontSet()
XFreeFontSet()
次の Motif の FontList API 関数を使用できます。
XmFontListEntryCreate()
XmFontListEntryAppend()
XmFontListEntryFree()
XmFontListEntryGetTag()
XmFontListEntryGetFont()
XmFontListEntryLoad()
基本的な互換性を高めるために、フォントは標準 X コンソーシアムの font charset に沿って構成されています。
開発者の言語に関連付けられたフォント・セットのベース・フォント名を選択することは、通常は簡単です。開発者はその言語および必要なフォントのセットに慣れているからです。
しかし、さまざまなロケールのためのフォント・セットのベース・フォント名を選択する場合、XLFD フォント仕様は 15 ものフィールドから成るため、この作業は難しくなります。ローカライズする場合、フォント・セット選択のためには次のフィールドが重要です。
FAMILY_NAME %F
WEIGHT_NAME %W
SLANT %S
ADD_STYLE %A
SPACING %SP
これによりフィールド数が減りますが、各フィールドの取り得る値はロケールごとに変化します。実際のポイント・サイズ (POINT_SIZE) は、プラットフォームごとに変化します。
このマニュアル全体を通して、ローカライズされたフォントを指定する際には次の規則が使用されます。
-dt-%F-%W-%S-normal-%A-*-*-*-%SP-*
以下に、リソース (app-defaults) ファイルにフォント・セットを指定する際に、デスクトップ内で使用する必須フィールドごとの推奨する最小セットを示します。
dt
interface user
interface system
application
medium または bold
r または i
sans serif または serif
p または m
ISO8859-1 で定義するのと同じ値をお勧めします。
dt
Gothic または Mincho
medium または bold
r
*
m
dt
Totum または Pathang
medium または bold
r
*
m
FAMILY_NAME の値は、2 つの共通フォント・ファミリの公的なローマ字表記法のうち使用しているものによって変化します。背景として、Totum は通常、ゴシック、 Kodig、 または Dotum として出荷されるフォントに対応します。Pathang は通常 Myungo か Myeongjo として出荷されるフォントに対応します。
dt
Sung と Kai
medium または bold
r
*
m
dt
Song と Kai
medium または bold
r
*
m