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

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

ローカライズされた文字列を描画するための機構がいくつか提供されていますが、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() 関数のセットは、サポートされていない言語では動作しない可能性があることを示す情報を使用するので、国際化対応にはお勧めしません。