この節では、すべてのロケール依存の Xlib 関数と共通デスクトップ環境関数をコントロールするロケール機構のサポートを定義します。
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 つから別々に取得します (数字は優先順位を示します)。
コマンド行オプション
リソース
空の文字列 (“ ”)
定義された最初のものが使用されます。
ロケール・コマンド行オプション、またはロケール・リソースが定義された場合、その影響として、ローカル・ホスト環境のカテゴリ固有の設定をすべて無効にして、指定したロケールにすべてのカテゴリを設定するべきです。
国際化対応の 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 ロケール管理には次の 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 はアプリケーションが実行されるマシン名です。結果のリソース・ファイルが存在する場合は、リソース・データベースにマージされます。環境リソース・ファイルには、サーバのリソース・ファイルでそれらのユーザ選択指定を補足するプロセス固有のリソース仕様が指定されることが予想されます。