レジストリ文字列リダイレクトの使用
レジストリ内のハードコーディングされた文字列の格納は、Windows Vista より前のローカライズ モデルの一部です。 MUI ではサポートされていません。 現在のモデルでは、オペレーティング システムのユーザー インターフェイスは、言語に依存しないベース上の言語固有のリソース ファイルで実行されます。 オペレーティング システムのコンポーネントは、言語に依存しない方法でレジストリを使用します。
MUI では、Win32 PE リソースによって定義されているリダイレクトされたレジストリ文字列のみが基本言語リソース ファイルで使用されます。 リダイレクトは、たとえば .inf ファイル内で個別に定義されます。 この種類のストレージを使用すると、リソース ローダーにより、リソース モジュールの読み込み中に正しい言語リソースが自動的に選択されます。
Note
このトピックは、Win32 PE リソースにのみ関連します。 Win32 以外の PE リソースを使用する場合は、必要に応じて、カスタマイズされたレジストリ文字列リダイレクトを指定する必要があります。
言語に依存しないリソースを作成する
Windows Vista 以降で実行されている MUI アプリケーションでは、言語に依存しない文字列リソースを使用して、文字列リソース テーブルに格納されている言語固有の文字列にアクセスできます。 レジストリからこれらの値を読み取るアプリケーション コードについては、「リダイレクトされた文字列の検索」の「言語に依存しないレジストリ値を読み込む」セクションで説明されています。
言語に依存しないレジストリ値のデータの形式は "@<PE-path>,-<stringID>[;<comment>]
" で、次が適用されます。
- "PE パス" は、実行可能ファイルのパスを指定します。 デプロイをサポートするには、%ProgramFiles% などの環境変数を使用してパスを指定できます。 文字列参照を作成する代わりに、ファイル パス情報を除外することもできます。 この場合、アプリケーションは、独自のインストール ディレクトリが通信するために、別のレジストリ値などの何らかの手段を持っている必要があります。
- stringID は、他のローカライズ可能な文字列リソースと同様に実装される、関連する文字列リソースの数値リソース識別子を指定します。
- comment は、レジストリ値のデバッグまたは読みやすさに関する省略可能な情報を指定します。 レジストリ API 関数では、文字列を読み込むときにコメントが無視されます。
Note
レジストリ値のデータは、言語固有のリソース ファイルへの明示的な参照を行いません。 現在のユーザー インターフェイス言語のユーザー設定に基づいて、実行時に正しいファイルが決定されます。
レジストリ値は、"," と "-" の間にスペースを入れずに入力されます。 正しいレジストリ値は次のとおりです。
shell32.dll,-22912
正しくないレジストリ値は次のとおりです。
shell32.dll, -22912
Windows Vista の例では、レジストリ値に次のデータがあります。
@%SystemRoot%\system32\input.dll,-5020
ショートカット文字列のリソースを作成する
MUI アプリケーションにより、その名前がシェル ユーザー インターフェイスに表示されると、アプリケーション アイコンのヒント文字列が表示されます。 サポートされている言語ごとに、アプリケーションの表示名と関連するヒント文字列の文字列リソースを作成する必要があります。 リソースの準備ができたら、「リダイレクトされた文字列の検索」の、レジストリからのショートカット文字列の読み込みにシェル API を使用する方法に関するセクションに説明されているように、アプリケーションで文字列を使用できます。
Windows インストーラーで作成されたショートカットのリソースを準備する
Windows インストーラー (MSI) を使用してショートカットを作成する場合、文字列リソースにはショートカットの表示名と説明が含まれます。 MSI ショートカット テーブルでは、リソース DLL が適切な列で参照され、ショートカット表示名と説明のリソース識別子が対応するリソース識別子の列で使用されます。
アプリケーション ショートカットが MUI リソース テクノロジで適切に動作するように、ショートカット文字列を準備するときは、次の点にご注意ください。
- DLL を登録するには、環境変数または相対パスを使用してください。 レジストリ文字列型が REG_EXPAND_SZ である限り、@%systemroot%\system32\shell32.dll を指定できます。 Shell32.dll の "Text Document" の文字列リソース識別子は 12345 です。
- "," と "-" 記号の周囲にスペースを使用しないでください。 正しい例は、"shell32.dll,-22912" です。
- 短いファイル名は使用しないでください。 この種類の名前は、リソース ローダーでは機能しません。
INF 形式を使用してショートカットのリソースを準備する
INF ファイル形式を使用してショートカット文字列を作成する場合、リソース ファイルに次のレジストリ設定を行う必要があります。 これらの手順では、Setup API の ProfileItems 構文を使用することを前提としています。
- パスとリソース識別子を使用して、文字列リダイレクト参照を指すヒント値を変更してください。
- ProfileItems インストール セクションの下に新しい値 DisplayResource を追加してください。
[スタート] メニューに電卓アプリケーションを追加する例を次に示します。
[CalcInstallItems]
"Name" = %Calc_DESC%
"CmdLine" = 11, calc.exe
"SubDir" = %Access_GROUP%
"WorkingDir" = 11
"InfoTip" = "@%systemroot%\system32\shell32.dll,-22531"
"DisplayResource" = "%systemroot%\system32\shell32.dll",22019
INF を使用して [スタート] メニューにアクセス グループ フォルダーなどの項目を追加する場合は、次に示す構文を使用してください。 Syssetup.inf で使用される構文と同様に、この構文では、[StartMenuItems] のサポートがセットアップから使用されていることを前提としています。
[StartMenuItems]
<description> = <binary>,<commandline>,<iconfile>,<iconnum>,<infotip>,<resDLL,resID>
値 infotip を文字列参照 "@<path>,-resID
" に設定してください。
表示名は、resDLL と resID 値によって決まります。 resID 値は、言語に依存しないファイルに関連付けられている文字列リソースのリソース識別子を指定します。 resDLL 値は、言語に依存しないファイルへのパスを指定します。
ドキュメントの種類名がフレンドリ名のリソースを作成する
アプリケーションのフレンドリ名とヒント文字列を文字列リソースとして実装する必要があります。 ドキュメントの種類のフレンドリ名がユーザー インターフェイス言語に対応できるようにするには、アプリケーションは、ファイルの種類のプログラム識別子キーの下に FriendlyTypeName 値を使用して名前を登録する必要があります。 下位互換性を維持するには、プログラム識別子キーの既定値を保持する必要があります。 アプリケーションから名前にアクセスする方法の詳細については、「リダイレクトされた文字列の検索」の「レジストリ」セクションの「ドキュメントの種類のフレンドリ名にクエリを実行する」を参照してください。
具体的な作業には、次の手順が含まれます。
- フレンドリ名とヒント文字列を言語固有の文字列リソースとして実装します。
- ドキュメントの種類のレジストリ キーの下に FriendlyTypeName 値を追加してください。 値のデータはパターン "
@<path>,-<resID>
" に従います。ここで path は実行可能ファイルを示し、resID は、その実行可能ファイルに関連付けられているローカライズ可能な文字列リソースのリソース識別子です。 - "
@<path>,-<resID>
" の形式に従ってヒント レジストリ値を指定してください。
次の例に、.txt ファイルのレジストリ設定を示します。
HKCR\.txt
@="txtfile"
"Content Type"="text/plain"
HKCR\txtfile
@="Text Document"
"FriendlyTypeName" = "@%systemroot%\system32\shell32.dll,-12345"
"InfoTip" = "@%systemroot%\system32\shell32.dll,-12346"
シェル動詞アクション文字列のリソースを提供する
"開く" や "編集" のような、特定の動詞のアクション文字列は、ユーザーが Windows エクスプローラーでファイルを右クリックしたときに表示されるポップアップ メニューに表示されます。 シェルには、これらの動詞に対して独自の MUI 対応の既定値があるため、アプリケーションで共通のシェル動詞の文字列を指定する必要はありません。 ただし、一般的でない動詞を表す文字列には、ローカライズ可能な文字列リソースを提供する必要があります。
Windows XP より前のオペレーティング システムでは、レジストリ内のシェル動詞の文字列は次の構文を使用してレンダリングされ、ここでのverb は、実際の動詞名を指定します。
HKCR\<progid>\shell\<verb>
@ = <friendly-name>
次に例を示します。
HKCR\Sample.app\shell\Disc
@ = "Disconnect"
Windows XP 以降では、間接参照レベルを使用して、アクション文字列をユーザー インターフェイス言語に依存させることができます。 これらのオペレーティング システムは、MUI 互換文字列の定義に MUIVerb 値をサポートします。 一般的でない動詞のレジストリ エントリの例を次に示します。
HKCR\Sample.app\shell\Disc
@ = "Disconnect"
"MUIVerb" = "@%systemroot%\system32\sample.exe,-9875"
MUI アプリケーションでは、次に示すように、以前の既定値をローカライズ可能な文字列として登録することもできます。
HKCR\Sample.app\shell\Disc
@ = "@%systemroot%\system32\sample.exe,-9875"
Note
Windows XP 以降では、それ以前のオペレーティング システムで使用されていたセットアップとは異なるセットアップが必要になるため、以前の既定値の登録はお勧めしません。
Verb、Protocol、AuxUserType 文字列のリソースを作成する
Verb、Protocol、AuxUserType 文字列のローカライズ可能な文字列リソースを作成する必要があります。 次のレジストリ設定を使用してください。
HKCR\CLSID\{<Your_CLSID>}\Verb\<number> @="<Your Verb>, <menu_flag>, <verb_flag>"
"LocalizedString"="@<resDLLpath\resDLL.DLL>,-resStrID"
...
HKCR\CLSID\{<Your_CLSID>}\AuxUserType\<number>
@="<Your Short Name>"
"LocalizedString"="@<resDLLpath\resDLL.DLL>,-resStrID1"
...
HKCR\<Your_Name>\protocol\StdFileEditing\verb\<number>
@="<Your Verb>"
"LocalizedString"="@<resDLLpath\resDLL.DLL>,-resStrID"
...
LocalizedString に指定された値は、2 つのフラグ値ではなく、"動詞" 値のみを含めるか、置き換えます。
正しいレジストリ設定を確認するのに役立つ概要を次に示します。
- CLSID に HKCR\CLSID\{clsid}\Insertable キーがある場合は、HKCR\CLSID\{clsid}\LocalizedString を使用して既定の CLSID 値を定義します。
- CLSID の HKCR\CLSID\{clsid}\Verb の下に 1 つ以上のサブキーがある場合は、HKCR\CLSID\{clsid}\Verb\xxx\LocalizedString を使用して個々の動詞文字列を定義します。
- CLSID の HKCR\{progid}\Protocol\Stdfileediting\Verb の下に 1 つ以上のサブキーがある場合は、HKCR\{progid}\Protocol\Stdfileediting\Verb\xxx\LocalizedString を使用して個々の動詞文字列を定義します。
- CLSID の HKCR\CLSID\{clsid}\AuxUserType の下に 1 つ以上の AuxUserType サブキーが一覧表示されている場合は、HKCR\CLSID\{clsid}\AuxUserType\xxx\LocalizedString を使用して各 AuxUserType エントリを定義します。
アンインストール プログラムのリソースを作成する
アプリケーションのアンインストール プログラムを登録するには、レジストリ キー HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall の下の、アプリケーションの一意識別子サブキーにレジストリ値を作成します。 設定する値は、DisplayName、DisplayVersion、Publisher、ProductID、RegOwner、RegCompany、UrlInfoAbout、HelpTelephone、HelpLink、InstallLocation、InstallSource、InstallDate、Contact、Comments、DisplayIcon、Readme、UrlUpdateInfo です。
Note
各値に対して MUI テクノロジを有効にするには、値名に "_Localized" を追加します。
オペレーティング システム コンポーネントは、MUI 固有の方法で DisplayName_Localized の値を提供するために必要です。 識別子が 1245 であると仮定して、表示名を文字列リソースとして Res.dll などの DLL に配置する必要があります。 その後、アプリケーションは表示名を DisplayName_Localized として、値は "@\res.DLL,-1245" で登録できます。 他のすべてのレジストリ設定は、DisplayName の元の値を含め、そのまま保持する必要があります。
サウンド イベントのリソースを作成する
Windows では、特定のイベントがサウンド ファイル (たとえば、新しいメール通知イベントや重大なバッテリー アラーム イベントなど) に関連付けられます。 イベント名は、ユーザー インターフェイスによって表示される必要があり、グローバリゼーションをサポートする必要があります。 そのため、各イベントの説明にローカライズ可能な文字列リソースを実装する必要があります。 ハードコーディングされた既定値に加えて、各イベント名に新しいレジストリ値を追加します。
サウンド イベントを有効にするには、次の操作を行います。
- 説明を、ローカライズ可能な文字列リソースとして実装してください。
- ハードコーディングされた既定値に加えて、表示名の新しいレジストリ値を追加します。 関連付けられているレジストリ レイアウトを次に示します。
HKCR\AppEvents\EventLabels
<event_name>
(Default) REG_SZ "<description>"
DispFileName REG_EXPAND_SZ "@<path>,-<resID>"
シェルが DispFileName の値を検索または取得できない場合は、既定の説明が使用されます。
キーボード レイアウト文字列のリソースを作成する
アプリケーションでキーボード レイアウトを実装する場合、キーボード レイアウトの一覧などに、画面表示用のレイアウトの名前のローカライズ可能な文字列リソースが必要です。 各キーボード レイアウトには、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
の下にレジストリ キーがあります。
そのキーの値の中には、下位互換性のための人間が判読できる名前 Layout Text
と Layout Display Name
があります。 Layout Display Name
に指定するデータは、キーボード レイアウトに関連付けられているローカライズ可能な文字列リソースを参照する、フォーム @<path>,-resID
の文字列参照である必要があります。
スペイン語キーボード レイアウトのレジストリ設定の例を次に示します。
HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\
0000040a
Layout Text REG_SZ "Spanish"
Layout Display Name REG_EXPAND_SZ "@%SystemRoot%\system32\input.dll,-5020"
OLE 挿入オブジェクトの共通ダイアログ文字列を表す
OLE 挿入可能オブジェクトの表示名は、そのオブジェクトを実装するコードに関連付けられたローカライズ可能な文字列リソースとして実装できます。 [OLE オブジェクトの挿入] ダイアログ ボックスは、レジストリ キー HKCR\CLSID\{<GUID>} から表示名を取得し、ここで GUID は、挿入可能な OLE オブジェクトのクラス識別子を識別します。 Windows Vista 以降では、ユーザー インターフェイス言語のカスタマイズを可能にする MUI 準拠の表示名を使用して、ローカライズ可能な方法でこの種類のオブジェクトを実装します。 これに対し、Windows Vista より前のオペレーティング システムでは、対応するレジストリ キーの既定値を使用して、この種類のオブジェクトの表示名が実装されます。 通常、この名前は英語 (米国) の名前か、システムの既定の UI 言語の名前です。
Note
レジストリ キーのサブキーに対応するすべてのオブジェクトを挿入できるわけではありません。
HKCR\CLSID\{<GUID>} キーの既定値は、下位互換性のために人間が判読できる名前を保持する必要があります。 ただし、LocalizedString 値を "@<path>,-ResID
"という形式で定義する必要もあります。ここで、path はオブジェクトを実装する実行可能ファイルを識別します。 ResID 値は、表示名のローカライズ可能な文字列のリソース識別子を指定します。
たとえば、挿入可能なメディア クリップ オブジェクトの登録スクリプトには、次の行が含まれます。
HKCR,"CLSID\%CLSID_Media_Clip%",,,"%default description%"
HKCR,"CLSID\%CLSID_Media_Clip%","LocalizedString",,"@%systemroot%\system32\mplay32.exe,-9217"
最初の行は、レジストリに既定の表示名として単純なテキスト文字列を配置して、下位互換性を提供します。 2 行目では、MUI 準拠の表示名へのアクセスが提供されます。 これは、Mplay32.exe に格納されている文字列識別子を示します。 Mplay32.exe の識別子 9217 の文字列は、任意の数の言語の文字列リソース値に関連付けることができます。 この英語 (米国) の名前は "Media Clip" です。
Microsoft 管理コンソール スナップインの文字列リソースを作成する
MUI アプリケーションで使用される Microsoft 管理コンソール (MMC) スナップインごとにローカライズ可能な文字列リソースを作成する必要があります。 スナップインはコンソールの一部であるため、ユーザー インターフェイスを備えており、複数の言語で動作するにはグローバル化する必要があります。
ほとんどの場合、MMC スナップインでは、MUI アプリケーション自体と同じグローバリゼーションとローカライズの問題が発生します。 MMC スナップインは、表示のためにレジストリにその名前を反映する必要があります。 レジストリ エントリには、下位互換性のためにローカライズ可能な文字列リソースへの間接参照とリテラル文字列の両方を含める必要があります。
各 MMC スナップインには、HKEY_LOCAL_MACHINE\Software\Microsoft\MMC\SnapIns の下にレジストリ キーがあります。 そのキーの値の中には、下位互換性のために人間が判読できる名前を指定する NameString と、ローカライズ可能な文字列リソースへの間接参照を指定する NameStringIndirect があります。 NameStringIndirect の場合は、ローカライズ可能な文字列リソースを表す "@<path>,-resID
" という形式の文字列参照を指定する必要があります。
たとえば、Mymmc.dll に対して次のように設定することができますが、ここで、12345 は、スナップインのローカライズ可能な名前を含む対応する文字列リソースの識別子です。
NameStringIndirect=@%systemroot%@c:\windir\system32\mymmc.dll,-12345
一部のスナップインは、MMC によってレジストリから読み取られない他のレジストリ文字列値を登録します。 これらの値の使用方法の詳細については、「リダイレクトされた文字列の検索」の「レジストリから読み取られない Microsoft 管理コンソール スナップイン文字列を登録する」を参照してください。
Windows サービスの文字列リソースを作成する
通常、Windows サービスにはユーザー インターフェイスがほとんど、またはまったくありませんが、MUI 準拠の名前を表示する必要があり、通常は MUI 準拠の言語固有の説明が提供されます。 Windows サービスを記述するレジストリ キーでは、サービス名の DisplayName 値とサービスの説明の Description 値のみがサポートされます。
Windows サービスの設定は、「リダイレクトされた文字列の検索」の「レジストリから Windows サービスの表示名と説明を設定する」に説明されているように、アプリケーションから作成されます。 アプリケーションでサービス ユーザー インターフェイスのレジストリ値が設定されていない場合、ユーザー インターフェイスが別の言語であっても、レジストリ内の値は英語に設定されたままになります。
関連トピック