Xt ロケール管理には次の 2 つの関数が含まれます。
XtSetLanguageProc()
XtDisplayInitialize()
Xt ツールキットの初期化前に、アプリケーションは通常 XtSetLanguageProc() 関数を次のうちどれか 1 つの形式で呼び出します。
XtSetLanguageProc (NULL, NULL, NULL)
ロケールは、(たとえば XtAppInitialize() 関数を介して) ツールキットが初期化されるまでは、実際には設定されません。したがって、XtSetLanguageProc() 関数と、ツールキットの初期化の後に (たとえば catopen() 関数を呼び出す場合)、setlocale() 関数が必要になるかもしれません。
リソース・データベースは現在のプロセスのロケールに作成されます。画面ごとのリソース・データベースを作成する前のディスプレイ初期化の間に、イントリンシクス関数は、コマンド行かディスプレイごとのリソース指定にあるオプションに応じてロケールを設定するために、指定されたアプリケーション・プロシージャを呼び出します。
アプリケーションにより提供されるコールアウト・プロシージャの型は XtLanguageProc で、形式は次のとおりです。
typedef String(*XtLanguageProc)(displayID,languageID, clientdata); Display *displayID; String languageID; XtPointer clientdata;
ディスプレイを渡します。
コマンド行またはサーバのディスプレイごとのリソース指定から取得される初期言語値を渡します。
XtSetLanguageProc() 関数への呼び出しで指定された追加のクライアント・データを渡します。
言語プロシージャにより、アプリケーションは、ロケールを XtDisplayInitialize() 関数で決定された言語リソースの値に設定できます。この関数は、以降にリソース・ファイルを読み込むために XtDisplayInitialize() 関数が使用する新しい言語文字列を返します。
最初は、イントリンシクス関数によって言語プロシージャは設定されていません。XtDisplayInitialize() 関数によって使用されるように言語プロシージャを設定するには、XtSetLanguageProc() 関数を使用してください。
XtLanguageProc XtSetLanguageProc(applicationcontext, procedure, clientdata) XtAppContext applicationcontext; XtLanguageProc procedure; XtPointer clientdata;
言語プロシージャが使用されるアプリケーション・コンテキストか、またはヌルの値を指定します。
言語プロシージャを指定します。
言語プロシージャが呼び出されたときに言語プロシージャに渡される追加のクライアント・データを指定します。
XtSetLanguageProc() 関数は、XtDisplayInitialize() 関数から呼び出される言語プロシージャを、指定されたアプリケーション・コンテキストで初期化される以降のすべてのディスプレイのために設定します。applicationcontext パラメータがヌルの場合、指定された言語プロシージャは、呼び出しプロセスによって作成されたすべてのアプリケーション・コンテキスト (将来作成されるかもしれないアプリケーション・コンテキストも含みます) に登録されます。procedure パラメータがヌルの場合、デフォルトの言語プロシージャが登録されます。XtSetLanguageProc() 関数は、前に登録されていた言語プロシージャを返します。言語プロシージャが登録されていなかった場合の戻り値は不定です。しかし、その戻り値が XtSetLanguageProc() 関数以降の呼び出しに使用される場合は、デフォルトの言語プロシージャが登録されることになります。
デフォルトの言語プロシージャは次のことを行います。
環境に応じてロケールを設定します。ANSI C システムでは、これは setlocale (LC_ALL, “language”) 関数を呼び出すことで実行されます。エラーが発生した場合は、XtWarning() 関数で警告メッセージが発行されます。
現在のロケールがサポートされているかを確認するために、XSupportsLocale() 関数を呼び出します。サポートされていない場合、XtWarning() 関数で警告メッセージが発行され、ロケールは C に設定されます。
空の文字列を指定する XSetLocaleModifiers() 関数を呼び出します。
現在のロケールの値を返します。ANSI C システムでは、これは setlocale (LC_CTYPE, NULL) 関数への最終呼び出しからの戻り値です。
クライアントはこの機構を利用して、次の例のように XtDisplayInitialize() 関数の前に XtSetLanguageProc() 関数を呼び出すことにより、ロケールを確立できます。
Widget top; XtSetLanguageProc(NULL, NULL, NULL); top = XtAppInitialize( ... ); ...
XtDisplayInitialize() 関数は、まず指定されたディスプレイに使用される言語文字列を決定し、ディスプレイとホストとアプリケーションの組み合わせのためのアプリケーションのリソース・データベースを、次のソースから読み込みます (数字は優先順位を示します)。
アプリケーション・コマンド行 (argv)
ローカル・ホストのホストごとのユーザ環境リソース・ファイル
サーバのリソース属性またはローカル・ホストのユーザ選択リソース・ファイル
ローカル・ホストのアプリケーション固有ユーザ・リソース・ファイル
ローカル・ホストのアプリケーション固有クラス・リソース・ファイル
XtDisplayInitialize() 関数は、指定された各 display パラメータに対して固有のリソース・データベースを作成します。データベースが作成されると、display パラメータの言語文字列が以下のアクションのシーケンスと同じ方法で決定されます。
XtDisplayInitialize() 関数は、まず一時的なデータベースを 2 つ作成します。1 番目のデータベースはコマンド行を解析することにより構築されます。2 番目のデータベースは XResourceManagerString() 関数が返す文字列から構築されるか、あるいは XResourceManagerString() 関数がヌルの値を返す場合は、ユーザのホーム・ディレクトリのリソース・ファイルの内容から構築されます。このようなユーザ選択リソース・ファイルの名前は $HOME/.Xdefaults です。
コマンド行から構築されるデータベースが、リソース name.xnlLanguage とクラス class.XnlLanguage で照会されます。この name と class は指定されたアプリケーション名とアプリケーション・クラスです。このデータベース照会が失敗した場合、サーバのリソース・データベースが照会されます。この照会も失敗した場合は、言語は環境から決定されます。環境からの言語の決定は、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 はアプリケーションが実行されるマシン名です。結果のリソース・ファイルが存在する場合は、リソース・データベースにマージされます。環境リソース・ファイルには、サーバのリソース・ファイルでそれらのユーザ選択指定を補足するプロセス固有のリソース仕様が指定されることが予想されます。