# 国際化と共通デスクトップ環境

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

## ロケール管理

デスクトップでは、大部分の単一ディスプレイのクライアントは、通常、実行時に$LANGという環境変数の設定で決定される単一ロケールで運用されます。Motifライブラリ（libXm）は、各ウィジェットがインストールされる時に使用される単一ロケールしかサポートしません。
Motifライブラリがインストールされた後にロケールを変更すると、動作が予測できなくなる可能性があります。

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

ロケール環境変数（たとえば、`LC_ALL`、`LC_CTYPE`、`LANG`）は環境を制御するのに使用されます。ロケールの`LC_CTYPE`カテゴリはXおよびMotifライブラリによって使用され、実行時に用いられるロケール固有の機能を識別します。しかし、 `LC_MESSAGES`カテゴリはメッセージ・カタログ・サービスにより使用されて、ロケール固有のテキストを読み込みます。詳しくはIPG.deskt.mkr.13を参照してください。特に、ツールキットによって読み込まれるフォントと入力メソッドは、`LC_CTYPE`カテゴリの設定によって決定されます。

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

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

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

次に、
ロケール管理で使用される関数を挙げます。

- XtSetLanguageProc()

- setlocale()

- XSupportsLocale()

- XSetLocaleModifiers()

##
フォント管理

Xウィンドウ（X WindowsTM）のクライアントに
テキストを描画する時、少なくとも次の２つの事項が国際化に関係します。

- ローカライズされたテキスト自体の取得

- ローカライズされたテキストの文字を描画するのに必要なすべてのグリフを含むひとつ以上のフォントの選択

IPG.deskt.mkr.13で、ローカライズされたテキストを描画するための正しいフォントを選択する方法について説明しています。

### フォントをキャラクタ・セットに一致させる

フォント
には、
ロケールの文字を描画するのに使用されるグリフのセットが含まれています。しかし、指定されたロケールに対して次のようなことを行いたい場合もあります。

- 必要なフォントを決定する

- 必要なフォントを指定する

- リソース・ファイルにおいてフォントのcharsetを決定する

- ひとつのロケールにつき複数のフォントを選択する

フォント
XFLD名の最後の２つのフィールドは、どの
グリフがフォントに含まれるか、および、どの値がセットから特定のグリフを取得するのに使用されるか、を識別します。この最後の２つのフィールドは、フォントに含まれるグリフのエンコードを識別するものです。

たとえば、

    -adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1

このXLFG名の最後の２つのフィールド
は、`iso8859`と`1`です。これらのフィールドは、ISO8859-1標準のグリフがフォントに含まれるよう指定します。さらに、ISO8859-1標準の
キャラクタ・コード値は、各文字に対応するグリフを索引付けるのに使用されます。

データを描画するためにアプリケーションが使用するフォントは、ユーザが選択するロケールに依存します。データ変更のフォントcharsetはロケールの選択に基づいているため、フォント指定はアプリケーションによってハードコードされていてはなりません。ハードコードせずに、`app-defaults`ファイルでおこなって、
`app-defaults`ファイルのローカライズ版が作成されるようにします。

さらに、フォントはフォント・セットとして指定されなければなりません。フォント・セットはXlibの概念で、フォント指定にXLFDを使用するというものです。XLFDのフォントcharsetフィールドは、Xlibコードによって指定されます。Xlibコードはフォント・セットを生成し、ユーザが指定したロケールに基づいてこれらのフィールドを埋めます。

日本語、中国語、韓国語など多くの言語で、複数のフォントcharsetが組み合わされて単一のエンコードをサポートしています。このような場合、文字データを描画するためには複数のフォントをオープンしなければなりません。さらに、データは各フォントに対応するセグメントに分解されなければならず、場合によっては、文字値をグリフ・インデックスに変換するためにこれらのセグメントを変形しなければならないこともあります。 `XFontset`は、指定されたロケールで文字データを描画するのに必要なすべてのフォントの集合ですが、このような問題も扱います。さらに、描画とメトリック・ルーチンのセットを提供して、内部的に文字列をcharacter-set-consistentのセグメントに分解し、値をグリフ・インデックスに変換します。これらのルーチンによって、アプリケーション開発者の負荷は軽減されます。アプリケーション開発者が必要とするのは、ユーザのフォント・セットとXlib描画とメトリック・アプリケーション・プログラム・インタフェース（API）だけです。

「フォントをキャラクタ・セットに一致させる」について詳しくは、 DtStdInterfaceFontNames(1,5)を参照してください。またCDEが、 Standard Application Font Namesのセットを提供している場合は、ロケールに依存しないリソースを使用することができます。

### フォント・オブジェクト

この節では、次のフォント・オブジェクトについて説明します。

- フォント・セット

- フォント

- レンダー・テーブル

#### フォント・セット

一般に、Xlibを使用してローカライズされたテキストを描画するすべての国際化対応プログラムは、`XmFontSet`を使用してロケールに依存するフォントを指定しなければなりません。フォント・セットの中の特定フォントは、charsetフィールドを指定しないXLFD命名規則を使用して指定します。`XFontset`のリソース名は`*fontSet`です。フォント・リソースの一覧については、IPG.deskt.mkr.14を参照してください。

テキストを描画するのに、（`XmString`関数やウィジェットを使用するのではなく）直接Xlibを使用するアプリケーションは、Xtが提供するstring-to-fontSetコンバータを利用します。たとえば、次の部分コードは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`です。

#### レンダー・テーブル

レンダー・テーブルについては、「Motifプログラマーズ・ガイド」を参照してください。

### フォント・セットおよびレンダー・テーブルのシンタクス

IPG.deskt.mkr.4は、
フォント・セットとレンダー・テーブルのシンタクスを示しています。

### フォント・セットおよびレンダー・テーブルのシンタクス

`リソース型` | `XLFDセパレータ` | `ターミネータ` | `FontEntryセパレータ`
`*fontSet:` (Xlib) | コンマ | なし | なし
`*renderTable:` (Motif) | セミコロン | コロン | コンマ

次に
フォントのリソース指定の例を示します。

    app_foo*renderTable: -adobe-courier-medium-r-normal--24-240-75-75-m-\ 150-*:

上記のレンダー・テーブルは、ユーザのロケールに適切なものとして、ひとつ以上の24ポイントAdobe Courierフォントから構成されるフォント・セットを指定しています。

    app_foo*renderTable: -adobe-courier-medium-r-normal--18-*; *-gothic-\
    *-18-*:

このレンダー・テーブルは、ユーザのデータのある文字に対しては18ポイントCourierフォント（使用可能ならば）から、ある文字に対しては18ポイントGothicフォントから構成されるフォント・セットを指定しています。

###
フォント関数とレンダー・テーブル関数

次のXlibフォント管理API関数が使用できます。

- XCreateFontSet()

- XLocaleOfFontSet()

- XFontsOfFontSet()

- XBaseFontNameListOfFontSet()

- XFreeFontSet()

次のレンダー・テーブルAPI関数が使用できます。

- `XmRenderTableAddRenditions()`

- `XmRenderTableCopy()`

- `XmRenderTableCvtFromProp()`

- `XmRenderTableCvtToProp()`

- `XmRenderTableFree()`

- `XmRenderTableGetRendition()`

- `XmRenderTableGetRenditions()`

- `XmRenderTableGetTags()`

- `XmRenderTableRemoveRenditions()`

### フォントcharset

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

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

通常、開発者が使用する言語と関連づけられたフォント・セットのベース・フォント名を選択することは簡単です。開発者はその言語と必要なフォントのセットのことをよく知っているからです。

しかし、さまざまなロケールに対してフォント・セットのベース・フォント名を選択する場合は、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`）ファイルでフォント・セットを指定する時に、デスクトップ内で必須フィールドとして使用される各フィールドにおすすめの値の最小セットを示します。

#### Latin ISO8859-1 Fonts

FOUNDRY | `dt'
FAMILY_NAME | `interface user' `interface system' `application'
WEIGHT_NAME | medium or bold
SLANT | r or i
ADD_STYLE | sans or serif
SPACING | p or m

#### その他のISO8859フォント

ISO8859-1に対して定義されているのと同じ値をおすすめします。

#### JIS日本語フォント

FOUNDRY | `dt'
FAMILY_NAME | interface user, interface system, application, Gothic or Mincho
WEIGHT_NAME | medium or bold
SLANT | r
ADD_STYLE | *
SPACING | m

#### KSC韓国語フォント

FOUNDRY | `dt'
FAMILY_NAME | interface user, interface system, application, Totum or Pathang
WEIGHT_NAME | medium or bold
SLANT | r
ADD_STYLE | *
SPACING | m

FAMILY_NAMEの値は、２つの共通フォント・ファミリの公式のローマ字表記のうち使用されているものによって変化します。バックグラウンドとしては、Totumは、Gothic、Kodig、または、Dotumとして通常出荷されるフォントに対応します。Pathangは、MyungoまたはMyeongjoとして通常出荷されるフォントに対応します。

#### CNS繁体字中国語フォント

FOUNDRY | `dt'
FAMILY_NAME | interface user, interface system, application, Sung and Kai
WEIGHT_NAME | medium or bold
SLANT | r
ADD_STYLE | *
SPACING | m

#### GB簡体字中国語フォント

FOUNDRY | `dt'
FAMILY_NAME | interface user, interface system, application, Song and Kai
WEIGHT_NAME | medium or bold
SLANT | r
ADD_STYLE | *
SPACING | m

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

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

### シンプル・テキスト

次のXlibマルチバイト（`char*`）描画関数は国際化で使用できます。

- XmbDrawImageString()

- XmbDrawString()

- XmbDrawText()

次のXlibワイド・キャラクタ（`wchar_t*`）描画関数は国際化で使用できます。

- XwcDrawImageString()

- XwcDrawString()

- XwcDrawText()

次のXlibマルチバイト（`char*`）フォント・メトリック関数は国際化で使用できます。

- XExtentsOfFontSet()

- XmbTextEscapement()

- XmbTextExtents()

- XmbTextPerCharExtents

次のXlibワイド・キャラクタ（`char_t*`）フォント・メトリック関数は国際化で使用できます。

- XExtentsOfFontSet()

- XwcTextEscapement()

- XwcTextExtents()

- XwcTextPerCharExtents

### XmString（コンパウンド・ストリング）

Motifライブラリでは、
ローカライズされたテキストは`XmStringGenerate()`を使用してXmStringセグメントに挿入しなければなりません。ローカライズされたテキストに関連するタグは`XmFONTLIST_DEFAULT_TAG`で、これは、レンダー・テーブルのエントリに一致させるのに使用されます。

ローカライズされた文字列
は、リソース・ファイル
に記述することができます。リソース・ファイルで指定されるコンパウンド・ストリングは`Xm_FONTLIST_DEFAULT_TAG`付きのロケールでエンコードされたセグメントをもつことができるからです。たとえば、次の例の`renderTable`リソースは、自動的に`XmFONTLIST_DEFAULT_TAG`と関連づけられます。

    labelString: Japanese string
    *renderTable:-dt-interface system-medium-r-normal-L*-*-*-*-*-*-*:

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

- XmStringCreateLocalized()

- XmStringDraw()

- XmStringDrawImage()

- XmStringDrawUnderline()

次のセットの`XmString`
関数は、カバーされていない言語では動作しない可能性のある指示をするため、国際化にはおすすめできません。

- XmStringCreateLtoR()

- XmStringSegmentCreate()

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

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

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

### 基本的なプロンプトとダイアログ

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

###
DrawingAreaウィジェット内の入力

多くのアプリケーションは入力に基づくウィジェット内で描画を行います。デスクトップ環境内での一貫性を提供するために、`XmIm`関数をおすすめします。入力メソッドに必要なスタイル管理とジオメトリ管理が、`VendorShell`ウィジェット・クラスによって管理されるからです。アプリケーションに関係するのは、キー・イベント、フォーカス、描画領域内の現在の入力位置の通信だけです。これらの関数を使用するには下層のXlib入力メソッド機構の基本的な知識がいくらか必要ですが、開発者が考慮しなけらばならないのは、`XmIm`の情報だけです。

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

アプリケーションの中には、
前編集中の間接フィードバックを直接表示しなければならないものもあります。たとえば、アプリケーションがXlibが提供する機能の限度を超えるような場合などです。この例として、PostScriptTMの描画や縦書きなどが挙げられます。

コアXlibは、アプリケーションが前編集中に中間的なフィードバックを表示できるインタフェースの共通セットを提供します。アプリケーションのコールバックを登録して前編集スタイルを`XNPreeditCallbacks`に設定することにより、アプリケーションは入力メソッドから中間的な前編集中のデータを取得し、必要とするものをすべて描画することができます。これは、OnTheSpot入力メソッド・スタイルを使用することを意味します。

複雑な言語処理を行なうアプリケーションには、特定のXIMインプリメンテーションとその入力メソッド・エンジンの中の拡張機能を認識するものがあります。そのようなアプリケーションは最先端のものでありXIM機能を詳細まで精通していることが要求されます。

### TextウィジェットとTextFieldウィジェット

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

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

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

次の節では、入力メソッドの管理に使用されるアプリケーションで用いることができる関数のセットを示します。`Text`ウィジェットと`TextField`ウィジェットを使用するアプリケーションについては、IPG.deskt.mkr.20を参照してください。

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

アプリケーションが、ユーザからの文字入力を取得するけれども、そのために`TextField`ウィジェットも`Text`ウィジェットも使用しないという場合があります。たとえば、`DrawingArea`ウィジェットを使用するアプリケーションでは、ユーザは描画領域に直接テキストを入力することができます。このような場合、アプリケーションは、後節で説明するようにXlibのXIM機能を使用するか、Motifの`XmIm`機能を使用するかします。`XmIm`機能を使用すると、アプリケーションは最小のコードで入力メソッドと接続し操作することができます。さらに、Motif `VendorShell`ウィジェットは、アプリケーションに代わって、入力メソッドのジオメトリ管理を行なうことができるようになります。XmIm機能についてさらに詳しくは、「Motifプログラマーズ・ガイド」を参照してください。

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

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

この節では、アプリケーションの言語環境を確立するために、ユーザ、アプリケーション開発者、インプリメンテーションがどのように協力するかを説明します。アプリケーションをローカライズするための一般的な２つのアプローチについても説明します。 次の３つの方法を使用することができます。

- リソース・ファイル

- メッセージ・カタログ

- プライベート・ファイル

### リソース・ファイル

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

また、Motifライブラリ機能は、ローカライズされたリソースが読み込まれる位置を指定する際には、LC_MESSAGEカテゴリには依存しません。詳しくは、マニュアル・ページの`XtSetLanguageProc()`を参照してください。

### メッセージ・カタログ

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

メッセージ機能サポートは、XPG4とSystem V Release4（SVR4）のメッセージ・カタログへのアクセスのインタフェースに基づいています。

### プライベート・ファイル

アプリケーションは、プライベート・データベース
を使用して、単なるローカリゼーション・テキストだけでなく、一般的なカスタマイズされたデータベースを提供することができるようになります。このようなデータベースには、通常、テキストが含まれています。もしデータベースが多くのファイルに広がるようであれば、ローカライズされたテキストに実行時に間接的にアクセスできるなんらかの方法が提供されるようにすることをおすすめします。このアクセスがないと、平均的なユーザにとってローカリゼーションは困難になります。一般的に、このようなプライベート・ファイルの形式はローカリゼーションを行なう人々から支持されません。しかし、テキストのみのローカリゼーション専用にツールが提供されるならば、問題は少なくなります。

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

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

## メッセージ抽出関数

国際化対応プログラム（基本コマンドとユーティリティを含む）の必要条件のひとつは、メッセージがユーザが使用する言語で出力装置に表示されることです。国際化対応プログラムは多くの国（国際的ロケール）で使用されるので、メッセージはさまざまな言語に翻訳される必要があります。

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

### XPG4のユニバーサルUNIXメッセージ関数

XPG4メッセージ機能は、メッセージ・ソース・ファイル、カタログ生成機能、プログラミング・インタフェースから構成されています。次に、XPG4のユニバーサルUNIXTMメッセージ関数を示します。

- catopen()

- catgets()

- catclose()

### XPG4メッセージ
例

次の例は、カタログからメッセージを取り出す方法を示しており、３つの部分からなっています。第一の部分はメッセージ・ソース・ファイルを示しており、第二の部分はカタログ・ファイルの生成に使用される方法を示しています。第三の部分はこのカタログを使用するプログラム例です。

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

メッセージ・カタログは次のように指定することができます。

    example.msg file:
    $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”

##### カタログ・ファイルの生成

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

    gencat example.cat 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）操作を提供します。

- XrmPutFileDatabase()

- XrmGetFileDatabase()

- XrmGetStringDatabase()

- XrmLocaleOfDatabase()

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

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

システム環境の国際化の一部分、ツールキットを使用するアプリケーションは、アプリケーション・ソース内にハードコードされたロケール固有のデータをもっていません。ひとつの共通のロケール固有項目は、標準I/Oのアプリケーションによって返されるメッセージ（エラーと警告）です。

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

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

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

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

### Dtメッセージ関数

Dtメッセージ関数は、 `DtMsgLogMessage`(3)、 `DtMsgLogSetHandler`(3)、`DtMsgLogOpenFile`(3)です。詳しくは、共通デスクトップ環境 プログラマーズ・ガイドを参照してください。

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

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

### ラベルとボタン

IPG.deskt.mkr.15 IPG.deskt.mkr.16は、ラベルとして使用されるローカライズできる
リソースの一覧です。これらの多くは、 `XmString`型で、そうでないものは、color型またはchar*型です。これらのリソースについて詳しくは、Motifリファレンス・マニュアルを参照してください。どのような場合にも、アプリケーションはこれらのリソースをハードコードしてはいけません。リソース値をアプリケーションで指定する必要がある場合は、`app-defaults`ファイルで行い、リソースが確実にローカライズできるようにしておくべきです。

ここには、ウィジェット・クラスのリソースのみを示しており、ウィジェットのサブクラスはのせていません。たとえば、`XmDrawnButton`ウィジェット・クラスは、ローカライズされた新しいリソースを導入しませんが、これは`XmLabelWidget`ウィジェット・クラスのサブクラスです。したがって、そのアクセラレータ・リソース、 `acceleratorText`リソースなどもまたローカライズされ、アプリケーションでハードコードすべきではありません。

### ローカライズできるリソース

`ウィジェット・クラス` | `リソース名`
Core | . *background:1
XmCommand | *command:
XmCommand | *promptString:
XmFileSelectionBox | *dirListLabelString:
XmFileSelectionBox | *dirTextLabelString:
XmFileSelectionBox | *fileListLabelString:
XmFileSelectionBox | *filterLabelString:
XmFileSelectionBox | *noMatchString:
XmLabel[Gadget] | *accelerator:
XmLabel[Gadget] | *acceleratorText:
XmLabel[Gadget] | *labelString:
XmLabel[Gadget] | *mnemonic:
XmLabel[Gadget] | *stringDirection:
XmList | *stringDirection:
XmManager | *stringDirection:
XmMessageBox | *cancelLabelString:
XmMessageBox | *helpLabelString:
XmMessageBox | *messageString:
XmMessageBox | *okLabelString:
XmPrimitive | *foreground:1
XmRowColumn | *labelString:
XmRowColumn | *menuAccelerator:
XmRowColumn | *mnemonic:
XmRowColumn(SimpleMenu*) | *buttonAccelerators:
XmScale | *titleString:
XmSelectionBox | *applyLabelString:
XmSelectionBox | *cancelLabelString:
XmSelectionBox | *helpLabelString:
XmSelectionBox | *listLabelString:
XmSelectionBox | *okLabelString:
XmSelectionBox | *selectionLabelString:
XmSelectionBox | *textAccelerators:
1 カラー名は可搬的なキャラクタ・セットに限定するというXプロトコルの制限により、フォアグラウンド・カラーとバックグラウンド・カラーはローカライズされません。ローカライズされたカラー名はアプリケーションにゆだねられ、可搬的なキャラクタ・セットでエンコードされた名前にマップするためにローカライズされたデータベースが提供されます。

`XmRowColumn`ウィジェットは、ローカライズできる別の文字列リソースをもちます。これらのリソースは、マニュアル・ページの`XmRowColumn`の、見出しが、「シンプル・メニュー作成リソース・セット」の所にリストされています。タイトルが示すように、これらのリソースは、`XmCreateSimpleMenu()`関数で作成する`RowColumn`ウィジェットにしか影響を与えません。 影響があるリソースは、`*buttonAccelerators`、`*buttonAcceleratorText`、`*buttonMnemonics`、`*optionLabel`、`*optionMnemonic`です。これらのリソースはめったに使用されず、シンプル・メニューの作成時にRowColumnに適用されるだけなので、IPG.deskt.mkr.16には含まれません。

###
リスト・リソース

いくつかのウィジェットでは、アプリケーションはウィジェットの中の項目リストを、
設定、または、
読み込むことができます。 IPG.deskt.mkr.17は、どのウィジェットでそれができるのかということと、これらのリストを設定または読み込むために使用するリソースを示しています。リストの項目はローカライズする必要がある可能性があるので、これらのリストをハードコードしないでください。それよりも、リソースとして`app-defaults`ファイルにおき、ローカライズできるようにしておくべきです。各リストの型は`XmStringList`です。

### リストの読み込みに使用されるリソース

`ウィジェット・クラス` | `リソース名`
XmList | *items:
XmList | *selectedItems:
XmSelectionBox | *listItems:

### タイトル

IPG.deskt.mkr.18は、
タイトルとアイコン名の設定に使用されるリソースの一覧です。通常、アプリケーションが設定する必要があるのは、`*title`:リソースと`*iconName`:リソースだけです。各々のエンコードは、適当なロケール管理を行なっているクライアントでは自動的に検出されます。これらはすべて、`*char`型、もしくは、`XmString`型です。

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

`ウィジェット・クラス` | `リソース名`
TopLevelShell | *iconName:
TopLevelShell | *iconNameEncoding:1
WmShell | *title:
WmShell | *titleEncoding: 1
XmBulletinBoard | *dialogTitle:
1このリソースはアプリケーションが設定してはなりません。アプリケーションが`XtSetLanguageProc`を呼び出すと、このリソースのデフォルト値（None）が自動的に設定され、ローカライズされたテキストがタイトルに確実に使用できるようになります。

### テキスト・ウィジェット

IPG.deskt.mkr.19は、ロケール依存である、もしくは、国際化対応アプリケーションの開発者が知っているべき
`Text[Field]`
リソースの一覧です。

### ロケール依存の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文字が表示されることが保証されます。割り当てられたスペースに、その数以上の文字数を表示することも可能です。

### 入力メソッド（キーボード）

IPG.deskt.mkr.21に、入力メソッドの
カスタマイズのためにローカライズできる
リソースを示します。これらのリソースにより、ユーザやアプリケーションは、特定のロケールで使用される入力メソッド、（各シェルごと、または、個々のウィジェットごとの）入力コンテキスト生成時に従うべきポリシー、（適応可能で使用可能である場合）使用される前編集スタイル、を制御することができます。

### 入力メソッドのカスタマイズのためにローカライズできるリソース

`ウィジェット・クラス` | `リソース名`
VendorShell | *inputMethod:
VendorShell | *preeditType:
VendorShell | *verifyPreedit:

### 配置方向

次の表に`*layoutDirection`リソースを使用するウィジェットを示します。

### 配置方向リソース

`ウィジェット・クラス` | `リソース名`
VendorShell | *layoutDirection:
XmGadget | *layoutDirection:
XmMenuShell | *layoutDirection:
XmPrimitive | *layoutDirection:
XmManager | *layoutDirection:

### ピックスマップ（アイコン）・リソース

IPG.deskt.mkr.22は、ピックスマップ・リソースの一覧です。指定されたロケールに対して異なったピックスマップが必要な場合もあります。

### ピックスマップ・リソース

`ウィジェット・クラス` | `リソース名`
Core | *backgroundPixmap:
WMShell | *iconPixmap:
XmContainers | *collapsedStatePixmap:、および、*expandedStatePixmap:
XmDragIcon | *pixmap:
XmDragIcon | *mask:
XmDropSite | *animation[Mask|Pixmap]:
XmGadget | *backgroundPixmap:
XmLabel[Gadget] | *labelInsensitivePixmap:
XmLabel[Gadget] | *labelPixmap:
XmMessageBox | *symbolPixmap:
XmPushButton[Gadget] | *armPixmap:
XmToggleButton[Gadget] | *selectInsensitivePixmap:
XmToggleButton[Gadget] | *selectPixmap:
XmToggleButton[Gadget] | *indeterminatePixmap:
XmIconPixmap | *[large|small]IconPixmap:

これらのリソースについて詳しくは、「Motifプログラマーズ・ガイド」を参照してください。

### Font Resources

IPG.deskt.mkr.24は、ローカライズできるフォント・リソースの一覧です。`XmRenderTable`リソースはすべて`XmRenderTable`型です。ほとんどすべての場合、レンディション・テーブルを指定する時には、フォント・セットが使用されます。唯一の例外は、ユーザのキャラクタ・セットに現れない文字データを表示する場合です（たとえば、数学の記号や読者の注意をひく記号の表示）。

### ローカライズできるフォント・リソース

`ウィジェット・クラス` | `リソース名`
VendorShell | *buttonFontList:
VendorShell | *buttonRenderTable:
VendorShell | *defaultFontList:
VendorShell | *labelFontList:
VendorShell | *labelRenderTable:
VendorShell | *textFontList:
VendorShell | *textRenderTable:
XmBulletinBoard | *buttonFontList:
XmBulletinBoard | *buttonRenderTable:
XmBulletinBoard | *labelFontList:
XmBulletinBoard | *labelRenderTable:
XmBulletinBoard | *textFontList:
XmBulletinBoard | *textRenderTable:
XmComboBox | *renderTable:
XmContainer | *renderTable:
XmLabel[Gadget] | *renderTable:
XmList | *renderTable:
XmMenuShell | *buttonFontList:
XmMenuShell | *renderTable:
XmMenuShell | *defaultFontList:
XmMenuShell | *labelFontList:
XmMenuShell | *renderTable:
XmText | *renderTable:
XmScale | *renderTable:
XmTextField | *renderTable:
XmIconGadget | *renderTable:

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

IPG.deskt.mkr.26は、
共通デスクトップ環境の基本
オペレーティング・システム国際化対応関数の一覧です。

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

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

`ロケール管理` | `シングルバイト` | `マルチバイト` | `ワイド・キャラクタ`
mb <-> wc間の変換 |  | 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 |  | fgetwc fgetws fputwc fputws ungetwc
メッセージ |  | gettxt catopen catgets catclose |
コードセット変換 |  | iconv_open iconv iconv_close |
1これらの関数は、端末を使用するアプリケーションに提供されます。グラフィカル・ユーザ・インタフェース（GUI）を使用するアプリケーションではこれらの関数を使わず、IPG.deskt.mkr.8にリストされているフォント・メトリック関数を使ってスペーシングを決定してください。