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

ロケール管理

この節では、すべてのロケール依存の Xlib 関数と共通デスクトップ環境関数をコントロールするロケール機構のサポートを定義します。

X ロケール管理

X ロケールは、ホスト環境に定義された 1 つ以上のロケールをサポートします。Xlib は ANSI (米国規格協会) C ライブラリに準拠しており、ロケール通知は setlocale() 関数で行います。setlocale() 関数は、ホスト C ライブラリと Xlib の両方のロケール・オペレーションを構成します。Xlib のオペレーションは LC_CTYPE カテゴリに管理されます。これを現在のロケールと言います。

XSupportsLocale() 関数は、現在のロケールが X によってサポートされているかどうかを判別するのに使用します。

クライアントは、ロケールと X モディファイアを選択する責任があります。クライアントは、ユーザがクライアントの起動時のロケール選択を無効にできる手段を提供すべきです。ほとんどのシングル・ディスプレイ X クライアントは、X とホストの処理環境の両方で、単一のロケールでオペレーションを行います。単一ディスプレイ X クライアントは、setlocale()XSupportsLocale()XSetLocaleModifiers() の 3 つの関数を呼び出すことによりロケールを構成します。

X 国際化対応機能の特定のカテゴリのセマンティクスは、モディファイアを設定することで構成できます。モディファイアは実装に依存するロケール固有の文字列で命名されます。この機能の現在の唯一の標準使用方法は、キーボード入力メソッドのいくつかのスタイルの中から 1 つを選択することです。

XSetLocaleModifiers() 関数は、現在のロケールの Xlib ロケール・モディファイアを構成するために使用されます。

ロケールとモディファイアを初期化するクライアントの推薦するプロシージャが、ロケールとモディファイアを通知する方法を、以下のソースのうちの 1 つから別々に取得します (数字は優先順位を示します)。

  1. コマンド行オプション

  2. リソース

  3. 空の文字列 (" ")

定義された最初のものが使用されます。


注 -

ロケール・コマンド行オプション、またはロケール・リソースが定義された場合、その影響として、ローカル・ホスト環境のカテゴリ固有の設定をすべて無効にして、指定したロケールにすべてのカテゴリを設定するべきです。


ロケール依存性とモディファイア依存性

国際化対応の Xlib 関数は、ホスト環境により構成された現在のロケールで、XSetLocaleModifiers() 関数により設定された X ロケール・モディファイアにおいて機能するか、その関数に供給される何らかのオブジェクトの作成時に構成されたロケールとモディファイアにおいて機能します。表 5-1 では、それぞれのロケール依存の関数についてロケール依存性とモディファイア依存性を示しています。

表 5-1 ロケール依存性とモディファイア依存性

ロケール 

影響を受ける関数 

対象 

 

ロケール照会 / 構成

 

setlocale

XSupportsLocale

XSetLocaleModifiers

照会されたロケール 

変更されたロケール 

 

リソース

 

setlocale

XrmGetFileDatabase

XrmGetStringDatabase

Xrm データベースのロケール 

XrmDatabase 

XrmPutFileDatabase

XrmLocaleOfDatabase

Xrm データベースのロケール 

 

標準属性の設定

 

setlocale

XmbSetWMProperties

供給されて返されたテキスト 

(環境ロケールの WM_property テキストのいずれか) のエンコーディング

setlocale

XmbTextPropertyToTextList

XwcTextPropertyToTextList

XmbTextListToTextProperty

XwcTextListToTextProperty

供給された / 返されたテキストのエンコーディング 

 

テキスト入力

 

setlocale

XOpenIM

XIM 入力メソッド. 

XIM 

XCreateIC

XLocaleOfIM など

XIC 入力メソッド構成 

照会されたロケール 

XIC 

XmbLookupText

XwcLookupText

キーボード配置 

返されたテキストのエンコーディング 

 

テキスト描画 

 

setlocale

XCreateFontSet

XFontSet のフォントの Charset 

XFontSet  

XmbDrawText,

XwcDrawText など

XExtentsOfFontSet など

XmbTextExtents,

XwcTextExtents など

Xlib エラー

供給されたテキストのロケール 

供給されたテキストのロケール 

ロケール依存メトリクス 

setlocale

XGetErrorDatabaseText 

XGetErrorText 

エラー・メッセージのロケール 

クライアントは、X の関数と C ライブラリ関数の呼び出しのロケールが同じである場合は、X の関数に返されたロケール・エンコード・テキスト文字列が C ライブラリ関数に渡されることが可能である、または C ライブラリ関数の結果の文字列が X の関数に渡されることが可能であると想定しています。

ロケールのエンコーディングが状態に依存する場合は、国際化対応 Xlib の関数によって処理されるすべてのテキスト文字列は、ロケールのエンコーディングの初期状態で開始すると見なされます。Xlib の関数はすべて、現在のロケールや X モディファイアの設定を変更しないかのように動作します (これはつまり、Xlib またはアプリケーションのいずれかによってライブラリ内で提供され、ロケールを変更するか XSetLocaleModifiers() 関数をヌルでない引き数で呼び出す関数はすべて、入力時と終了時に現在のロケール状態を保存および復元しなければならないという意味です)。また、ANSI C ライブラリに準拠する実装の Xlib の関数は、ANSI C の関数 mblen()mbtowc()wctomb()strtok() に関連付けられたグローバルな状態を変更しません。

Xt ロケール管理

Xt ロケール管理には次の 2 つの関数が含まれます。

XtSetLanguageProc

Xt ツールキットの初期化前に、アプリケーションは通常 XtSetLanguageProc() 関数を次のうちどれか 1 つの形式で呼び出します。

XtSetLanguageProc (NULL, NULL, NULL)

注 -

ロケールは、(たとえば XtAppInitialize() 関数を介して) ツールキットが初期化されるまでは、実際には設定されません。したがって、XtSetLanguageProc() 関数と、ツールキットの初期化の後に (たとえば catopen() 関数を呼び出す場合)、setlocale() 関数が必要になるかもしれません。


リソース・データベースは現在のプロセスのロケールに作成されます。画面ごとのリソース・データベースを作成する前のディスプレイ初期化の間に、イントリンシクス関数は、コマンド行かディスプレイごとのリソース指定にあるオプションに応じてロケールを設定するために、指定されたアプリケーション・プロシージャを呼び出します。

アプリケーションにより提供されるコールアウト・プロシージャの型は XtLanguageProc で、形式は次のとおりです。

typedef String(*XtLanguageProc)(displayID,languageID, clientdata);  
Display *displayID;  
String languageID;  
XtPointer clientdata;
displayID

ディスプレイを渡します。

languageID

コマンド行またはサーバのディスプレイごとのリソース指定から取得される初期言語値を渡します。

clientdata

XtSetLanguageProc() 関数への呼び出しで指定された追加のクライアント・データを渡します。

言語プロシージャにより、アプリケーションは、ロケールを XtDisplayInitialize() 関数で決定された言語リソースの値に設定できます。この関数は、以降にリソース・ファイルを読み込むために XtDisplayInitialize() 関数が使用する新しい言語文字列を返します。

最初は、イントリンシクス関数によって言語プロシージャは設定されていません。XtDisplayInitialize() 関数によって使用されるように言語プロシージャを設定するには、XtSetLanguageProc() 関数を使用してください。

XtLanguageProc XtSetLanguageProc(applicationcontext, procedure, clientdata) 
XtAppContext applicationcontext;  
XtLanguageProc procedure;  
XtPointer clientdata;
applicationcontext

言語プロシージャが使用されるアプリケーション・コンテキストか、またはヌルの値を指定します。

procedure

言語プロシージャを指定します。

clientdata

言語プロシージャが呼び出されたときに言語プロシージャに渡される追加のクライアント・データを指定します。

XtSetLanguageProc() 関数は、XtDisplayInitialize() 関数から呼び出される言語プロシージャを、指定されたアプリケーション・コンテキストで初期化される以降のすべてのディスプレイのために設定します。applicationcontext パラメータがヌルの場合、指定された言語プロシージャは、呼び出しプロセスによって作成されたすべてのアプリケーション・コンテキスト (将来作成されるかもしれないアプリケーション・コンテキストも含みます) に登録されます。procedure パラメータがヌルの場合、デフォルトの言語プロシージャが登録されます。XtSetLanguageProc() 関数は、前に登録されていた言語プロシージャを返します。言語プロシージャが登録されていなかった場合の戻り値は不定です。しかし、その戻り値が XtSetLanguageProc() 関数以降の呼び出しに使用される場合は、デフォルトの言語プロシージャが登録されることになります。

デフォルトの言語プロシージャは次のことを行います。

クライアントはこの機構を利用して、次の例のように XtDisplayInitialize() 関数の前に XtSetLanguageProc() 関数を呼び出すことにより、ロケールを確立できます。

Widget top; 
XtSetLanguageProc(NULL, NULL, NULL);  
top = XtAppInitialize( ... ); 
...

XtDisplayInitialize

XtDisplayInitialize() 関数は、まず指定されたディスプレイに使用される言語文字列を決定し、ディスプレイとホストとアプリケーションの組み合わせのためのアプリケーションのリソース・データベースを、次のソースから読み込みます (数字は優先順位を示します)。

  1. アプリケーション・コマンド行 (argv)

  2. ローカル・ホストのホストごとのユーザ環境リソース・ファイル

  3. サーバのリソース属性またはローカル・ホストのユーザ選択リソース・ファイル

  4. ローカル・ホストのアプリケーション固有ユーザ・リソース・ファイル

  5. ローカル・ホストのアプリケーション固有クラス・リソース・ファイル

XtDisplayInitialize() 関数は、指定された各 display パラメータに対して固有のリソース・データベースを作成します。データベースが作成されると、display パラメータの言語文字列が以下のアクションのシーケンスと同じ方法で決定されます。

XtDisplayInitialize() 関数は、まず一時的なデータベースを 2 つ作成します。1 番目のデータベースはコマンド行を解析することにより構築されます。2 番目のデータベースは XResourceManagerString() 関数が返す文字列から構築されるか、あるいは XResourceManagerString() 関数がヌルの値を返す場合は、ユーザのホーム・ディレクトリのリソース・ファイルの内容から構築されます。このようなユーザ選択リソース・ファイルの名前は $HOME/.Xdefaults です。

コマンド行から構築されるデータベースが、リソース name.xnlLanguage とクラス class.XnlLanguage で照会されます。この nameclass は指定されたアプリケーション名とアプリケーション・クラスです。このデータベース照会が失敗した場合、サーバのリソース・データベースが照会されます。この照会も失敗した場合は、言語は環境から決定されます。環境からの言語の決定は、LANG 環境変数の値を取り出すことで実行されます。言語文字列が見つからない場合は、空の文字列が使用されます。

アプリケーション固有のクラス・リソース・ファイル名は、アプリケーションのクラス名から構築されます。アプリケーションのクラス名は、アプリケーションのインストール時に通常サイト・マネージャによってインストールされるローカライズされたリソース・ファイルを指します。このファイルは、XtResolvePathname() 関数をパラメータ (displayID, applicationdefaults, NULL, NULL, NULL, NULL, 0, NULL) で呼び出すと見つけられます。このファイルはアプリケーションが正しく機能するのに必要な場合があるので、アプリケーション開発者が提供すべきです。クラス・リソース・ファイルがないときにリソースのセットを最小限しか必要としないシンプルなアプリケーションは、XtAppSetFallbackResources() 関数でフォールバック・リソース指定を宣言できます。

アプリケーション固有のユーザ・リソース・ファイル名はユーザ固有のリソース・ファイルを指し、アプリケーションのクラス名から構築されます。このファイルは、アプリケーションによって所有され、ふつうユーザのカスタマイズを格納しています。このファイルは、XtResolvePathname() 関数をパラメータ (displayID, NULL, NULL, NULL, path, NULL, 0, NULL) で呼び出すと見つけられます。この path はオペレーティング・システム固有の方法で定義されます。path 変数は、XUSERFILESEARCHPATH 環境変数が設定されている場合は、その値に定義されます。そうでない場合は、デフォルトはベンダの定義した値です。

結果のリソース・ファイルが存在する場合は、そのファイルはリソース・データベースにマージされます。このファイルはアプリケーションと共に提供されるか、またはユーザによって作成されます。

言語の決定の間にサーバのリソース属性かユーザ・リソース・ファイルから作成される一時的なデータベースが、リソース・データベースにマージされます。サーバのリソース・ファイルは完全にユーザによって作成されるので、ディスプレイに依存しないユーザ選択とディスプレイ固有のユーザ選択が含まれています。

ユーザの環境リソース・ファイルが存在する場合は、それがリソース・データベースに読み込まれ、マージされます。このファイル名はユーザおよびホスト固有です。ユーザの環境リソース・ファイル名は、絶対パス名としてユーザの XENVIRONMENT 環境変数の値から構築されます。この環境変数が存在しない場合、XtDisplayInitialize() 関数はユーザのディレクトリで .Xdefaults-host ファイルを検索します。この host はアプリケーションが実行されるマシン名です。結果のリソース・ファイルが存在する場合は、リソース・データベースにマージされます。環境リソース・ファイルには、サーバのリソース・ファイルでそれらのユーザ選択指定を補足するプロセス固有のリソース仕様が指定されることが予想されます。