共通デスクトップ環境 プログラマーズ・ガイド (国際化対応編)

第 2 章 国際化対応と共通デスクトップ環境

1 つの共通オープン・システムには、異なる国語をサポートする複数の環境が存在することがあります。そのような 1 つ 1 つの国別環境はロケールと呼ばれ、言語、文字、フォント、入力やデータ・フォーマットの慣習を考慮します。共通デスクトップ環境は、どのアプリケーションでもシステム上にインストールされているすべてのロケールを使用して実行できるように、完全に国際化対応されています。

ロケール管理

デスクトップでは、ほとんどの単一画面のクライアントは、実行時に環境変数 (通常は $LANG) の設定から決定される単一のロケールで操作を行います。Xm ライブラリ (libXm) は、各ウィジェットがインスタンスを生成する際に使用する単一のロケールしかサポートできません。Xm ライブラリを初期化した後にロケールを変更した場合、予測できない動作をすることがあります。

すべての国際化対応プログラムは、ロケール環境変数に定義される、ユーザの希望するロケールを設定しなければなりません。デスクトップ・ツールキットを使用するプログラムの場合、プログラムはどのツールキット初期化関数 (たとえば XtAppInitialize()) よりも先に XtSetLanguageProc() 関数を呼び出します。この関数は、ツールキット初期化の前に必要なすべての初期化を行います。非デスクトップ・プログラムの場合は、プログラムはユーザの希望するロケールを設定するために、プログラムの最初に setlocale() 関数を呼び出します。

環境をコントロールするには、ロケール環境変数 (たとえば LC_ALLLC_CTYPELANG など) が使用されます。ユーザは、実行時に使用されるロケール固有の機能を識別するために、ロケールの LC_CTYPE カテゴリが X および Xm ライブラリによって使用されることを覚えておいてください。しかし LC_MESSAGES カテゴリは、メッセージ・カタログ・サービスにより、ロケール固有のテキストを読み込むのに使用されます。詳細は、ローカライズされたテキストの抽出を参照してください。特にツールキットが読み込むフォントと入力メソッドは、LC_CTYPE カテゴリを設定することによって決定されます。

文字列のエンコーディング (たとえばアプリケーションのソースコード、リソース・ファイル、UIL (ユーザ・インタフェース言語) ファイルでの ISO8859-1 または 拡張 UNIX コード (EUC)) は、アプリケーションが実行するロケールのコード・セットと同じでなければなりません。同じでない場合はコード変換が必要です。

すべてのコンポーネントは単一で世界中で実行可能な状態で出荷され、ロケールの X11R5 サンプル・インプリメンテーション・セット (米国、西欧/東欧、日本、韓国、中国、台湾) をサポートする必要があります。

アプリケーションはコード・セットに依存せず、すべてのマルチバイト・コード・セットをサポートするように記述しなければなりません。

ロケール管理に使用する関数を次に示します。

フォント管理

テキストを X Windows System のクライアントに受け渡す場合、少なくとも 2 つの状況が国際化対応に関係します。

ローカライズされたテキストの抽出に、ローカライズされたテキストを獲得する方法が説明されています。

フォントを文字セットに一致させる

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 関数を使用できます。

次の Motif の FontList API 関数を使用できます。

フォント charset

基本的な互換性を高めるために、フォントは標準 X コンソーシアムの font charset に沿って構成されています。

言語グループごとのデフォルト・フォント・セット

開発者の言語に関連付けられたフォント・セットのベース・フォント名を選択することは、通常は簡単です。開発者はその言語および必要なフォントのセットに慣れているからです。

しかし、さまざまなロケールのためのフォント・セットのベース・フォント名を選択する場合、XLFD フォント仕様は 15 ものフィールドから成るため、この作業は難しくなります。ローカライズする場合、フォント・セット選択のためには次のフィールドが重要です。

これによりフィールド数が減りますが、各フィールドの取り得る値はロケールごとに変化します。実際のポイント・サイズ (POINT_SIZE) は、プラットフォームごとに変化します。

このマニュアル全体を通して、ローカライズされたフォントを指定する際には次の規則が使用されます。

-dt-%F-%W-%S-normal-%A-*-*-*-%SP-*

以下に、リソース (app-defaults) ファイルにフォント・セットを指定する際に、デスクトップ内で使用する必須フィールドごとの推奨する最小セットを示します。

ラテン ISO8859-1 フォント

FOUNDRY

dt

FAMILY_NAME

interface user

interface system

application

WEIGHT_NAME

medium または bold

SLANT

r または i

ADD_STYLE

sans serif または serif

SPACING

p または m

その他の ISO8859 フォント

ISO8859-1 で定義するのと同じ値をお勧めします。

JIS 日本語フォント

FOUNDRY

dt

FAMILY_NAME

Gothic または Mincho

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m

KSC 韓国語フォント

FOUNDRY

dt

FAMILY_NAME

Totum または Pathang

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m


注 –

FAMILY_NAME の値は、2 つの共通フォント・ファミリの公的なローマ字表記法のうち使用しているものによって変化します。背景として、Totum は通常、ゴシック、 Kodig、 または Dotum として出荷されるフォントに対応します。Pathang は通常 Myungo か Myeongjo として出荷されるフォントに対応します。


CNS 繁体字中国語フォント

FOUNDRY

dt

FAMILY_NAME

Sung と Kai

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m

GB 簡体字中国語フォント

FOUNDRY

dt

FAMILY_NAME

Song と Kai

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m

ローカライズされたテキストの描画

ローカライズされた文字列を描画するための機構がいくつか提供されていますが、Motif ライブラリが使用されているか Xlib ライブラリが使用されているかに依存します。以下では、国際化対応アプリケーションに対してお勧めできるインタフェースを説明します。しかし、ローカライズされたデータはすべて、シンプル・テキストを使用するプログラムの外側に置くことをお勧めします。

シンプル・テキスト

次の Xlib マルチバイト (char*) 描画関数は国際化対応しています。

次の Xlib ワイド文字 (wchar_t*) 描画関数は国際化対応しています。

次の Xlib マルチバイト文字 (char*) フォント・メトリック関数は国際化対応しています。

次の Xlib ワイド文字 (char_t*) フォント・メトリック関数は国際化対応しています。

XmString (コンパウンド・ストリング)

Xm ライブラリの場合、ローカライズされたテキストは、XmStringCreateLocalized()を使用して XmString セグメントに挿入しなければなりません。ローカライズされたテキストに関連付けられたタグは XmFONTLIST_DEFAULT_TAG であり、これはフォント・リストのエントリに一致させるのに使用されます。XmStringCreate() を使用してコンパウンド・ストリング内でいくつかのフォントを混合するアプリケーションは、ローカライズされたすべての文字列に対してタグとして XmFONTLIST_DEFAULT_TAG を使用してください。

さらに重要なのは、クライアント間通信の場合、XmStringConvertToCT() 関数が XmFONTLIST_DEFAULT_TAG とタグ付けされたセグメントを、ロケールのコード・セットにエンコードされるよう関連付けることです。そうしない場合、使用されるタグ名によっては、Xm ライブラリはテキスト・データのクライアント間通信のエンコードを正しく識別できないことがあります。

XmString 内のローカライズされた文字列セグメントは、XmFONTLIST_DEFAULT_TAG の付いたフォント・セットを持つフォント・リストで描画することができます。移植性をよくするために、ローカライズされた文字列を使用してください。

次に、ローカライズされた文字列を描画するためにフォント・リストを作成する例を示します。

XmFontList CreateFontList( Display* dpy, char* pattern)
{

SmFontListEntry font_entry; 
XmFontList fontlist; 
font_entry = XmFontListEntryLoad( dpy, pattern,
                                       XmFONT_IS_FONTSET,
                                       XmFONTLIST_DEFAULT_TAG);   

fontlist = XmFontListAppendEntry(NULL, font_entry);  
/* XmFontListEntryFree(font_entry); */   

if ( fontlist == NULL ) {
     XtWarning(“fl2fs: can't create fontlist...”);
     exit (0);
}   

return fontlist;  
}   

int main(argc,argv)  
int argc;  
char **argv;  
{
    Display *dpy;            /* Display                 */
    XtAppContext app_context;/*  Application Context    */

    XmFontList fontlist;
    XmFontSet fontset;
    XFontStruct** fontstructs;
    char** fontnames;
    int i,n;

char *progrname;     /* program name without the full pathname */
 
if (progname=strrchr(argv[0], `/')){
    progname++;
}
else  {
    progname = argv[0];
}
 
/*    Initialize toolkit and open display.
 */  
XtSetLanguageProc(NULL, NULL, NULL);  
XtToolkitInitialize(): 
app_context = XtCreateApplicationContext();  
dpy = XtOpenDisplay(app_context, NULL, progname, “XMdemos”,
                      NULL, 0, &argc, argv);  
if (!dpy) {
      XtWarning(“fl2fs: can't open display, exiting...”);
      exit(0); 
}   

fontlist = CreateFontList(dpy, argv[1] ); 
fontset = FontList2FontSet( fontlist );   

/*  
 * Print out BaseFontNames of Fontset  
 */  
n = XFontsOfFontSet( fontset, &fontstructs, &fontnames);

     printf(“Fonts for %s is %d\n”, argv[1], n);

     for (i = 0 ; i < n ; ++i ) printf(“font[%d} - %s\n”, i,\
                                          fontnames[i] );
     exit(1);
}

リソース・ファイルに指定されたコンパウンド・ストリングは Xm_FONTLIST_DEFAULT_TAG の付いたロケール・エンコーディング・セグメントを持っているため、ローカライズされた文字列はリソース・ファイルに記述できます。たとえば、次の例の fontList リソースは、自動的に XmFONTLIST_DEFAULT_TAG に関連付けられます。

labelString:	Japanese string
	*fontList: -dt-interfacesystem-medium-r-normal-L*-*-*-*-*-*-*:

国際化対応には、次の XmString 関数のセットをお勧めします。

次の XmString() 関数のセットは、サポートされていない言語では動作しない可能性があることを示す情報を使用するので、国際化対応にはお勧めしません。

ローカライズされたテキストの入力

ローカライズされたテキストの入力は、通常、ローカルな入力メソッドかネットワークを使った入力メソッドのどちらかを使用して行います。

ローカルな入力メソッドは、入力メソッドが Xlib 内に実装されることを意味します。通常この方法は、単純な規則で構成できて言語固有の機能を必要としない言語で使用します。ネットワークを使った入力メソッドは、実際の入力メソッドが別のサーバで提供され、Xlib は言語固有の構成を行うために XIM プロトコルを介してそれらのサーバと通信することを意味します。

基本的な入力要求およびダイアログ

アプリケーションですべてのテキスト入力を行うのに Text ウィジェットを使用することを強くお勧めします。

DrawingArea ウィジェット内の入力

多くのアプリケーションは、入力に基づくウィジェットの中で描画を行います。デスクトップ環境内での一貫性を提供するために、XmIm 関数をお勧めします。これは、入力メソッドに必要な形式およびジオメトリ管理が VendorShell ウィジェット・クラスで管理されるからです。アプリケーションに関係するのは、キー・イベント、フォーカス、描画領域内の現在の入力位置の通信だけです。XmIm 関数を使用するには下位の Xlib 入力メソッドのアーキテクチャの基本知識が必要ですが、開発者は XmIm の情報を理解していれば問題ありません。

アプリケーション固有および言語固有の中間フィードバック

一部のアプリケーションは、プリエディットにおける中間フィードバックを直接表示する必要があります。たとえばアプリケーションが Xlib の機能の限度を超えてしまうことがあります。この例には、PostScriptTM による描画や縦書きの仕様が挙げられます。

コア Xlib は、アプリケーションがプリエディットにおける中間フィードバックを表示できるようにするインタフェースの共通セットを提供します。アプリケーションのコールバックを登録し、プリエディットの形式を XNPreeditCallbacks に設定することで、アプリケーションは入力メソッドから中間のプリエディット・データを獲得し、必要なものをすべて描画できます。

複雑な言語処理を行うアプリケーションは、特定の XIM 処理系とその入力エンジンの中の拡張機能を認識することがあります。そのようなアプリケーションは最先端であり、XIM 関数の詳しい知識と経験を必要とします。

Text ウィジェットおよび TextField ウィジェット

基本プロンプトおよびダイアログには、Text ウィジェットか TextField ウィジェットをお勧めします。Text[Field] ウィジェットの中にローカライズされたテキストを獲得および設定するのに、リソースの他にすべての XmTextField 関数と XmText 関数を使用できます。

ほとんどの XmText 関数は、バイト数ではなく文字数に基づいています。たとえば、すべての XmTextPosition() 関数位置は文字の位置であり、バイトの位置ではありません。XmTextGetMaxLength() 関数はバイト数を返します。疑わしい場合、位置は常に文字単位であることを思い出してください。

Text ウィジェットまたは TextField ウィジェットの幅は、XmNcolumns のリソース値によって決定します。しかし、この値はフォント・セットの最も幅の広い文字の数を表すものであり、バイト数やカラム数ではありません。たとえば、Text ウィジェットに可変幅のフォントを選択したとします。文字 i の幅は 1 ピクセルであり、文字 W の幅は 7 ピクセルです。XmNcolumns の値が 10 に設定されると、これは Text ウィジェットを 10 文字以上表示できる幅にするための要求と見なされます。したがって Text ウィジェットは、最も広い文字の幅を使って Core ウィジェットのピクセル幅を決定しなければなりません。この例では、ウィジェットに W なら 10 個、i なら 70 個表示できます。XmNcolumns のこの構造は、コード・セットがマルチバイトでマルチカラム・エンコーディングのロケールの場合、問題を起こす可能性があります。この値はローカライズされたリソースの中で設定してください。

次節は、入力メソッドの管理に使用するアプリケーションで使用可能な関数のセットを示します。Text ウィジェットおよび TextField ウィジェットを使用するアプリケーションについては、入力メソッド (キーボード)を参照してください。

Text[Field] ウィジェットを使用しないカスタマイズされたウィジェット内での文字入力

アプリケーションはユーザから文字入力を受け付けても、そのために TextField ウィジェットや Text ウィジェットを使用しない場合があります。たとえば、DrawingArea ウィジェットを使用するアプリケーションでは、ユーザは直接 DrawingArea にテキストを入力できます。この場合、アプリケーションは、後の節で説明するように Xlib XIM 関数を使用できます。または、代わりにアプリケーションは Motif 1.2 の XmIm 関数を使用できます。XmIm 関数により、アプリケーションは最小限のコードで入力メソッドに接続および対話できます。さらに、XmIm 関数によって Motif VendorShell ウィジェットがアプリケーションに代わって入力メソッドのジオメトリ管理を実行できます。

XmIm 関数は Motif 1.2 のすべての処理系に含まれて出荷されますが、XmIm 関数は Motif 1.2 のドキュメントには記載されていません。OSF は、Motif 2.0 のために XmIm 関数を増やしてドキュメント化する意向を明らかにしています。ここで説明する関数は Motif 1.2 の XmIm 関数です。


注 –

Motif 1.2 の XmIm 関数は、プリエディット・コールバック形式やステータス・コールバック形式の入力メソッドをサポートしません。Xlib API によりプリエディット・コールバックが使用できます。詳細は、XIM 管理を参照してください。


Motif 1.2 ベースのアプリケーションで安全に使用できる XmIm 関数を次に示します。パラメータと型の正式な説明は xm.h ヘッダ・ファイルにあります。

関数名 

説明 

XmImRegister()

XOpenIM() を実行し、サポートされている形式の入力メソッドを照会します。

XmImSetValues()

プリエディットおよびステータスの形式を調整および選択します。 

XmImSetFocusValues()

XIC がなければ作成します。入力メソッドにウィジェットがフォーカスを獲得したことを通知します。XIC に渡される値を設定します。 

 

XmImUnsetFocus()

入力メソッドにウィジェットがフォーカスを失ったことを通知します。 

XmImMbLookupString()

XmbLookupString() と等価の Xm の関数で、1 つ以上のキー・イベントを文字に変換します。戻り値は XmbLookupString() と等価です。

 

XmImUnregister()

入力メソッドとウィジェットを切り離し、新しい入力メソッドへの接続を可能にします。必ずしも入力メソッドを閉じるわけではありません (処理系によります)。 

XmImSetValues() 関数と XmImSetFocusValues() 関数により、アプリケーションは入力メソッドが必要とする情報を渡すことができます。すべての値が必要ではない場合でも、(それぞれの値はプリエディットおよびステータスの形式をサポートするので) アプリケーションがすべての値を渡すことが重要です。これは、ユーザまたは VendorShell ウィジェットによってどの形式が選択されたかをアプリケーションは認識できないからです。次に、XmImSet[Focus]Values() 関数への呼び出しで渡されるべき各値の引き数とデータ型を示します。

引き数名 

データ型 

XmNbackground

Pixel 

XmNforeground

Pixel 

XmNbackgroundPixma

Pixmap 

XmNspotLocation

XPoint 

XmNfontList

Motif fontlist  

XmNlineSpace

int (連続ベースライン間のピクセルの高さ) 

XmIm 関数は次のように使用されます。

XIM 管理

XIM 管理関数を次に示します。

関数名 

説明 

XOpenIM()

入力メソッドへの接続を確立します。 

XCloseIM()

あらかじめ XOpenIM() への呼び出しで確立された入力メソッドへの接続を閉じます。

XGetIMValues()

属性リストの入力メソッドを照会します。現在、Xlib での唯一の標準引き数は XNQueryInputstyle です。

XDisplayOfIM()

入力メソッドに関連付けられたディスプレイを返します。 

XLocaleOfIM()

入力メソッドのロケールを識別する文字列を返します。標準的な文字列はありません。この呼び出しで返される値は処理系が定義します。 

XCreateIC()

入力コンテキストを作成します。入力コンテキストには、(もしあれば) 入力メソッドが必要とするデータと、そのデータを表示するのに必要な情報の両方が含まれます。 

XDestroyIC()

入力メソッドを破棄し、関連付けられていたメモリを解放します。 

XIMOfIC()

指定された入力コンテキストに、現在関連付けられている入力メソッドを返します。 

XSetICValues()

文字データの入力、プリエディット情報、またはステータス情報の表示をコントロールするために、0 個以上の値を入力コンテキストに渡します。すべての有効な入力コンテキスト値の引き数の表が、X11R5 の仕様書に記述されています。 

XGetICValues()

0 個以上の入力コンテキスト値を得るために入力コンテキストを照会します。すべての有効な入力コンテキスト値の引き数の表が、X11R5 の仕様に記述されています。 

XIM イベント処理

XIM イベント処理関数を次に示します。

関数名 

説明 

XmbLookupString()

キーを押したイベントをマルチバイト文字に変換します。 

XwcLookupString()

キーを押したイベントをワイド文字に変換します。 

XmbResetIC()

入力コンテキストを初期状態にリセットします。そのコンテキストで保留されている入力はすべて削除されます。現在のプリエディットの値を char* 文字列として返します。入力メソッドの処理系によっては、戻り値は NULL になります。

XwcResetIC()

入力コンテキストを初期状態にリセットします。そのコンテキストで保留されている入力はすべて削除されます。現在のプリエディットの値を wchar_t* 文字列として返します。

XFilterEvent()

クライアントへのすべての着信イベントを、アプリケーションが処理する前に、入力メソッドが処理できるようにします。 

XSetICFocus()

指定された入力コンテキストに接続されたフォーカス・ウィンドウが、キーボード・フォーカスを受信したことを入力メソッドに通知します。 

XUnsetICFocus()

指定された入力コンテキストがキーボード・フォーカスを失い、そのコンテキストに接続されたフォーカス・ウィンドウには入力できなくなったことを入力メソッドに通知します。 

XIM コールバック

X 入力メソッド (XIM) は 3 種類のコールバックを提供します。1 番目はプリエディット・コールバックで、これによりアプリケーションはプリエディットの間に中間フィードバックを表示できます。2 番目はジオメトリ・コールバックで、これによりアプリケーションと XIM は XIM で使用されるジオメトリをネゴシエートできます。3 番目はステータス・コールバックで、これによりアプリケーションは XIM の内部ステータスを表示できます。

XIM プリエディット・コールバック: PreeditStartCallback

XXIM ステータス・コールバック: StatusStartCallback

XIM プリエディット・キャレット・コールバック: PreeditCaretCallback

XIM ジオメトリ・コールバック: GeometryCallback

XIM Preedit Callback: PreeditDoneCallback

XIM Status Callbacks: StatusDoneCallback

XIM Preedit Callback: PreeditDrawCallback

XIM Status Callbacks: StatusDrawCallback

ローカライズされたテキストの抽出

アプリケーションをローカライズする方法はいくつかありますが、一般的な規則では、言語依存情報はアプリケーションの外側に置き、ロケール名で識別される別のディレクトリに格納します。

この節では、アプリケーションの言語環境を確立するために、ユーザとアプリケーション開発者と処理系の組み合わせ方を説明します。アプリケーションをローカライズするための 2 つの一般的なアプローチについても説明します。次の 3 つの方法があります。

リソース・ファイル

リソース・ファイルは、アプリケーションに関するあらゆる種類の情報をカスタマイズするための GUI ツールキット機構です。イントリンシクス・ライブラリ (libXt) が、コマンド行オプション、アプリケーション定義のリソース、ユーザ定義のリソースをマージするための高性能な機構を提供します。リソース・ファイルは、ローカライズされたテキストの抽出にも使用できます。リソース・ファイルとメッセージ・カタログの違いは、リソース・データベースは読み込まれるたびに毎回コンパイルされることです。したがって、どの文字列をリソース・ファイルに置き、どの文字列をメッセージ・カタログに置くかは注意して決定してください。

また、Xm ライブラリ関数は、ローカライズされたリソースが読み込まれる位置を指定するときに、LC_MESSAGES カテゴリには依存しないので注意してください。詳細は、XtSetLanguageProc() のマニュアル・ページを参照してください。

メッセージ・カタログ

メッセージ・カタログは、ローカライズされたテキストを含む外部データベースにアクセスするための、伝統的なオペレーティング・システムの機構です。これらの関数は、あらかじめコンパイルされてアクセスの準備ができているカタログ・ファイルを読み込みます。またこれらは、カタログが見つからない場合のために、実際のプログラム内にデフォルトのメッセージを用意しています。

メッセージ機能のサポートは XPG4 と System V Release 4 (SVR4) の両方のメッセージ・カタログへのアクセスのインタフェースに基づいています。

プライベート・ファイル

ローカリゼーション・テキストだけでなく、カスタマイズされた総称的なデータベースを提供するために、アプリケーションはプライベート・データベースを使用できます。このようなデータベースは、通常はテキストを格納します。データベースが多数のファイルに広がるようであれば、ローカライズされたテキストの実行時の間接アクセスが提供されます。このアクセスがないと、ローカリゼーションは普通のユーザにとっては難しくなります。一般的に、このようなプライベート・ファイル形式はローカリゼーションを行うグループに反対されます。しかし、テキストのみのローカリゼーション専用のツールが提供されれば問題は少なくなります。

メッセージ・ガイドライン

メッセージ・ガイドラインは、メッセージおよびヘルプ情報を一貫性のある形式にするのに役立ちます。また、経験の少ない翻訳者はもちろん、英語に堪能でないエンド・ユーザにも簡単に理解できるメッセージの作成と管理を促進します。これらのガイドラインを利用して、一貫性のある言葉で意味が明確にわかるメッセージ・ファイルを作成してください。これらのガイドラインが配布されることによって、プログラマと記述者がメッセージの記述に関して整合性を取ることができます。国際化対応サポートを完全に実現するには、各実行ファイルに対してデフォルト・メッセージ、外部メッセージ・ファイル、翻訳可能なメッセージの計画的な配布が必要です。

メッセージ抽出関数

国際化対応を行うプログラム (基本コマンドおよびユーティリティを含む) の要求事項の 1 つは、出力デバイスに表示されるメッセージがユーザの言語であることです。これらのプログラムは多くの国々 (国際的なロケール) で使用されるため、メッセージはそれらの国々のさまざまな言語に翻訳されなければなりません。

デスクトップ環境には、XPG4 関数と Xlib 関数の 2 つのメッセージ抽出関数のセットがあります。

XPG4/ 統合 UNIX メッセージ関数

XPG4 メッセージ機能は、メッセージ・ソース・ファイル、カタログ生成機能、プログラミング・インタフェースから構成されています。次に示すのは、XPG4/ 統合 UNIX メッセージ関数です。

XPG4 メッセージ例

次の例はカタログからメッセージを取り出す方法を示しており、3 つのパートがあります。1 番目のパートはメッセージ・ソース・ファイルを示し、2 番目のパートはカタログ・ファイルを生成するために使う方法を示します。3 番目のパートは、そのカタログを使用したプログラム例です。

メッセージ・ソース・ファイル

メッセージ・カタログは次のように指定します。

example.msg ファイル
$quote “  
$ every message catalog should have a beginning set number.
$set 1 This is the set 1 of messages  
1 “Hello world\n”  
2 “Good Morning\n”  
3 “example: 1000.220 Read permission is denied for the file  
%s.\n“  
$set 2  
1 “Howdy\n”
カタログ・ファイルの生成

このファイルは、メッセージ・カタログ example.cat を生成するために gencat ユーティリティに次のように入力されます。

gencat example example.msg
プログラム内のカタログへのアクセス
#include <locale.h>  
#include <nl_types.h>  
char *MF_EXAMPLE = "example.cat"   

main()  
{
        nl_catd catd;
        int error;

        (void)setlocale(LC_ALL, “”);

        catd = catopen(MF_EXAMPLE, 0);
            /* Get the message number 1 from the first set.*/

        printf( catgets(catd,1,1,“Hello world\n”) );
            /* Get the message number 1 from the second set.*/

        printf( catgets(catd, 2, 1,“Howdy\n”) );
            /* Display an error message.*/

        printf( catgets(catd, 1, 4,“example: 100.220
                Permission is denied to read the file %s.\n“) ,
                MF_EXAMPLE);
        catclose(catd);  
}

Xlib メッセージ関数

次の Xlib メッセージ関数は、リソースに対して同じような入力/出力 (I/O) 操作を提供します。

これらは『X Window System, The Complete Reference to Xlib, Xprotocol, ICCCM, XLFD - X Version 11, Release 5』に説明されています。

Xlib メッセージおよびリソース機能

システム環境の国際化対応の一部であるツールキット・ベースのアプリケーションは、アプリケーションのソースの中にハードコードされたロケール固有のデータを持っていません。ロケール固有の共通項目は、標準 I/O のアプリケーションによって返される (エラーおよび警告) メッセージです。

一般に、システム環境ツールキット・ウィジェットまたはガジェットを介してユーザに表示されるすべてのエラー・メッセージおよび警告メッセージについては、メッセージ・カタログを介してメッセージをアプリケーションの外側に置いてください。

ツールキット・コンポーネントを介して表示されるダイアログ・メッセージについては、ローカライズされたリソース・ファイルを介してメッセージをアプリケーションの外側に置いてください。この方法は、XmLabelXmPushButton クラスの XmNlabelString リソースやウィンドウのタイトルなどのリソースのローカライズと同じです。

たとえば、警告メッセージが XmMessageBox ウィジェット・クラスを介して表示される場合、XmNmessageString リソースはアプリケーションのソースコード内でハードコードできません。その代わりに、このリソースの値はメッセージ・カタログから取り出さなければなりません。異なる複数のロケールで実行される国際化対応のアプリケーションの場合は、サポートされる各ロケールに対してローカライズされた別個のカタログが存在しなければなりません。このようにすれば、アプリケーションを再構築する必要がなくなります。

ローカライズされたリソース・ファイルは /usr/lib/X11/%L/app-defaults サブディレクトリに入るか、または XENVIRONMENT 環境変数によって指定されます。%L 変数は、実行時に使用されるロケール名に置換されます。

ローカライズされたリソース

この節では、どのウィジェットおよびガジェット・リソース内容がロケールに依存するかを説明します。情報は関連機能別に構成されています。たとえば、最初のセクションでは、ラベルを表示したりプッシュ・ボタン機能を提供するのに使用されるウィジェットのためのロケールを区別するリソースを説明します。

ラベルおよびボタン

表 2–2 に、ラベルとして使用されるローカライズできるリソースを示します。多くは XmString 型です。その他の型は color か char* です。これらのリソースの詳しい説明は、『Motif 1.2 Reference Manual』を参照してください。どんな場合でも、アプリケーションはこれらのリソースをハードコードしてはいけません。リソース値がアプリケーションによって指定されなければならない場合は、app-defaults ファイルで指定してください。それにより、そのリソースがローカライズできることが保証されます。

ここにはウィジェット・クラス・リソースのみを示し、それらのウィジェットのサブクラスは示していません。たとえば、XmDrawnButton ウィジェット・クラスは、ローカライズされた新しいリソースを使えるようにしませんが、このウィジェットは XmLabelWidget ウィジェット・クラスのサブクラスです。したがって、そのアクセラレータ・リソース、acceleratorText リソースその他が同様にローカライズされ、アプリケーションによるハードコードはできません。

表 2–2 ローカライズできるリソース

ウィジェット・クラス 

リソース名 

Core

*background: 1

XmCommand

*command:

XmCommand

*promptString:

XmFileSelectionBox

*dirListLabelString:

XmFileSelectionBox

*fileListLabelString:

XmFileSelectionBox

*filterLabelString:

XmFileSelectionBox

*noMatchString:

XmLabel[Gadget]

*accelerator:

XmLabel[Gadget]

*acceleratorText:

XmLabel[Gadget]

*labelString:

XmLabel[Gadget]

*mnemonic:

XmList

*stringDirection:

XmManager

*stringDirection:

XmMessageBox

*cancelLabelString:

XmMessageBox

*helpLabelString:

XmMessageBox

*messageString:

XmMessageBox

*okLabelString:

XmPrimitive

*foreground: 1

XmRowColumn

*labelString:

XmRowColumn

*menuAccelerator:

XmRowColumn

*mnemonic:

XmRowColumn(SimpleMenu*)

*buttonAccelerators:

XmRowColumn

*mnemonic:

XmRowColumn

*mnemonic:

XmRowColumn

*mnemonic:

XmRowColumn

*mnemonic:

XmSelectionBox

*applyLabelString:

XmSelectionBox

*cancelLabelString:

XmSelectionBox

*helpLabelString:

XmSelectionBox

*listLabelString:

XmSelectionBox

*okLabelString:

XmSelectionBox

*selectionLabelString:

XmSelectionBox

*textAccelerators:

  1. カラー名はポータブル文字セットに限定するという X プロトコルの制限により、フォアグラウンド・カラーおよびバックグラウンド・カラーはローカライズされません。ローカライズされたカラー名の提供方法は、アプリケーションにゆだねられ、ポータブル文字セットでエンコードされた名前にマップするためにローカライズされたデータベースを提供するべきです。

XmRowColumn ウィジェットには、別のローカライズ可能な文字列リソースがあります。それらのリソースは XmRowColumn のマニュアル・ページの、「シンプル・メニュー作成リソース・セット」の見出しの下で確認できます。このタイトルが示すように、これらのリソースは XmCreateSimpleMenu() 関数で作成された RowColumn ウィジェットにしか影響を与えません。影響を受けるリソースは次のとおりです。*buttonAccelerator*buttonAcceleratorText*buttonMnemonics*optionLabel*optionMnemonic。これらのリソースはほとんど使用されず、またシンプル・メニューの作成時のみ RowColumn に適用されるので、表 2–2 には入っていません。

リスト・リソース

いくつかのウィジェットにより、アプリケーションはウィジェットの項目のリストを設定または読み込むことができます。表 2–3 は、どのウィジェットによってそれを実行できるか、またウィジェットがリストを設定または読み込むのに使用するリソースを示します。リスト項目はローカライズされるかもしれないので、それらのリストをハードコードしないでください。それよりは、app-defaults ファイルにリソースとして設定し、ローカライズできるようにしてください。各リストの型は XmStringList です。

表 2–3 リストの読み込みに使用されるリソース

ウィジェット・クラス 

リソース名 

XmList

*items:

XmList

*selectedItems:

XmSelectionBox

*listItems:

タイトル

表 2–4 はタイトルおよびアイコン名の設定に使用されるリソースの一覧です。通常、アプリケーションが設定する必要があるのは *title: リソースと *iconName: リソースだけです。それぞれのエンコーディングは、適切なロケール管理を行なっているクライアントでは自動的に検出されます。これらの型はすべて char * または XmString です。

表 2–4 タイトルおよびアイコン名の設定に使用されるリソース

ウィジェット・クラス 

リソース名 

TopLevelShell

*iconName:

TopLevelShell

*iconNameEncoding: 1

WmShell

*title:

WmShell

*titleEncoding: 1

XmBulletinBoard

*dialogTitle:

XmScale

*titleString:

  1. このリソースはアプリケーションが設定してはなりません。アプリケーションが XtSetLanguageProc を呼び出すと、このリソースのデフォルト値 (なし) が自動的に設定され、それにより、ローカライズされたテキストがタイトルに使用できることが保証されます。

Text ウィジェット

表 2–5 は、ロケール別に設定する、または国際化対応アプリケーションの開発者が知っておくべき Text[Field] リソースの一覧です。

表 2–5 ロケール別に設定する Text[Field] リソース

ウィジェット・クラス 

リソース名 

XmSelectionBox

*textColumns: 1

XmSelectionBox

*textString:

XmText

*columns: 1

XmText

*modifyVerifyCallback:

XmText

*modifyVerifyCallbackWcs:

XmText

*value:

XmText

*valueWcs:

XmTextField

*columns: 1

XmTextField

*modifyVerifyCallback:

XmTextField

*modifyVerifyCallbackWcs:

XmTextField

*value:

XmTextField

*valueWcs:

  1. *columns リソースは、表示される文字数によって Text[Field] ウィジェットの初期幅を指定します。可変幅のフォントの場合、また文字サイズが非常に変化するロケールの場合は、カラムはそのロケールの文字レパートリーの中で最も幅の広い文字を表示するのに必要なスペースの量です。たとえば、カラム幅が 10 なら、現在のロケールの文字が少なくとも 10 文字表示できることが保証されます。割り当てられたスペースに、その数以上の文字数を表示することも可能です。

入力メソッド (キーボード)

表 2–6 は、入力メソッドのカスタマイズのためにローカライズできるリソースの一覧です。それらのリソースにより、ユーザまたはアプリケーションは、指定されたロケールにどの入力メソッドが使用されるか、また (プリエディットが適用でき、使用可能な場合) どのプリエディット形式が使用されるかを制御できます。

表 2–6 入力メソッドのカスタマイズ用のローカライズできるリソース

ウィジェット・クラス 

リソース名 

VendorShell

*inputMethod:

VendorShell

*preeditType:

ピックスマップ (アイコン)・リソース

表 2–7 はピックスマップ・リソースの一覧です。場合により、指定されたロケールに対して違うピックスマップが必要になる場合があります。

表 2–7 ピックスマップ・リソース

ウィジェット・クラス 

リソース名 

Core

*backgroundPixmap:

WMShell

*iconPixmap:

XmDragIcon

*pixmap:

XmDropSite

*animation[Mask|Pixmap]:

XmLabel[Gadget]

*labelInsensitivePixmap:

XmLabel[Gadget]

*labelPixmap:

XmMessageBox

*symbolPixmap:

XmPushButton[Gadget]

*armPixmap:

XmToggleButton[Gadget]

*selectInsensitivePixmap:

XmToggleButton[Gadget]

*selectPixmap:

ピックスマップは、必要なときに再呼び出しして表示できるようにメモリに格納された画面イメージです。デスクトップには多数のピックスマップ・リソースがあり、それによってアプリケーションは、バックグラウンド、ボーダ、影、ラベルとボタンの表面、ドラッグ・アイコンその他の用途にピックスマップを供給できます。テキストと同様、一部のピックスマップは特定の言語環境に固有のものです。それらのピックスマップはローカライズされていなければなりません。

デスクトップはピックスマップおよびイメージのキャッシュを管理します。XmGetPixmapByDepth() 関数は、要求されたピックスマップを探してそれらのキャッシュを検索します。要求されたピックスマップがピックスマップのキャッシュに存在せず、対応するイメージがイメージのキャッシュにない場合は、XmGetPixmapByDepth() 関数が、要求されたイメージ名と名前が一致する X ビットマップ・ファイルを検索します。XmGetPixmapByDepth() 関数は、ファイルを検索するために XtResolvePathname() 関数を呼び出します。要求されたイメージ名が絶対パス名の場合、そのパス名が XtResolvePathname() 関数の検索パスです。そうでない場合、XmGetPixmapByDepth() 関数は次のように検索パスを構築します。

これらのパスには %B 置換フィールドがあるかもしれません。XtResolvePathname() 関数への呼び出しのたびに、XmGetPixmapByDepth() 関数は %B を要求されたイメージ名に置き換えます。パスには、XtResolvePathname() 関数が受け取るその他の置換フィールドがあるかもしれません。特に、XtResolvePathname() 関数は %L を表示の言語文字列に置き換え、%l%t%c を表示の言語文字列のコンポーネント (ベンダ依存) に置き換えます。置換フィールド %T は常にビットマップにマップされ、%S は常にヌルにマップされます。

デフォルトでは文字列からピックスマップへのコンバータがないので、ピックスマップは通常 XmGetPixmap() への呼び出しで最初にピックスマップを取り出すことにより、アプリケーションによって作成時に設定されます。XmGetPixmap() は、現在のロケールを使用してピックスマップをどこから検索するか決定します (ピックスマップの検索とロケールの関係については、XmGetPixmap() のマニュアル・ページを参照してください)。

フォント・リソース

表 2–8 はローカライズできるフォント・リソースの一覧です。すべての XmFontList リソースの型は XmFontList です。ほぼすべての場合、フォント・リスト要素を指定するときにはフォント・セットが使用されます。唯一の例外は、ユーザの文字セットに現れない文字データを表示するときです (たとえば数学の記号や読者の注意を引く記号を表示する場合)。

表 2–8 ローカライズできるフォント・リソース

ウィジェット・クラス 

リソース名 

VendorShell

*buttonFontList:

VendorShell

*defaultFontList:

VendorShell

*labelFontList:

VendorShell

*textFontList:

XmBulletinBoard

*buttonFontList:

XmBulletinBoard

*defaultFontList:

XmBulletinBoard

*labelFontList:

XmBulletinBoard

*textFontList:

XmLabel[Gadget]

*fontList:

XmList

*fontList:

XmMenuShell

*buttonFontList:

XmMenuShell

*defaultFontList:

XmMenuShell

*labelFontList:

XmText

*fontList:

XmTextField

*fontList:

オペレーティング・システム国際化対応関数

表 2–9 は、共通オープン・ソフトウェア環境の基本オペレーティング・システムの国際化対応関数の一覧です。

ロケールでは 1 文字のコード化に 1〜4 バイト必要であるという仮定の下に、アプリケーションが適切なロケール管理を実行するべきです。

表 2–9 基本オペレーティング・システム国際化対応関数

ロケール管理 

シングルバイト 

マルチバイト 

ワイド文字 

mb <-> wcwc 間の変換 

 

mbtowc

mbstowcs

wctomb

wcstombs

分類 

isalpha

is*

 

isalpha

isw*

wctype

ケース・マッピング 

tolower

toupper

 

towlower

towupper

形式に関する雑多な情報 

 

localeconv

nl_langinfo

 

数値の形式 

 

strtol

strtod

wcstol

wcstod

wcstoi

時刻/通貨の形式 

 

strftime

strptime

strfmon

wcsftime

文字列のコピー 

 

strcat

strcpy

strncat

strncpy

wcscat

wcsncat

wcscpy

wcsncpy

文字列の照合 

 

strcoll

wcscoll

wcsxfrm

文字列の操作 

strlen

mblen

 

wcscmp

wcsncmp

文字列の検索 

strchr

strcspn

strpbrk

strrchr

strspn

strtok

 

wcschr

wcscspn

wcspbrk

wcsrchr

wcsspn

wcstok

wcswcs

wcscspn

I/O 表示幅 

 

 

wcwidth 1

wcswidth

I/O 出力 

 

printf

vprintf

sprintf

vsprint

fprintf

vfprint

printf

vprintf

sprintf

vsprint

frpintf

vfprint

 

I/O スキャン 

 

scanf

sscanf

fscanf

scanf

sscanf

fscanf

I/O 文字 

getc

gets

putc

puts

ungetc

 

fgetwc

fgetws

fputwc

fputws

ungetwc

メッセージ 

 

gettxt

catopen

catgets

catclose

 

コードセット変換 

 

iconv_open

iconv

iconv_close

 

  1. これらの関数は、端末を使用するアプリケーションに提供されます。グラフィカル・ユーザ・インタフェース (GUI) アプリケーションには、これらの関数を使用しないでください。その代わりに、シンプル・テキストにリストされているフォント・メトリック関数を使用してスペーシングを決定します。