共用方式為


使用登錄檔字串重新導向

在登錄中儲存硬式編碼字串是 Windows Vista 預先當地語系化模型的一部分。 MUI 不支援它。 在目前的模型中,作業系統的使用者介面會在語言特定的資源檔中運行,並在語言中立的基底上運行。 作業系統的元件會以語言中性的方式使用登錄。

MUI 只會使用基底語言資源檔中 Win32 PE 資源所定義的重新導向登錄字串。 重新導向是以個別方式定義,例如,在 .inf 檔案中。 這種類型的記憶體可讓資源載入器在資源模組載入期間自動選取正確的語言資源。

注意

本主題僅適用於 Win32 PE 資源。 如果使用非 Win32 PE 資源,則必須視需要提供自定義的登錄字串重新導向。

 

建立 Language-Neutral 資源

在 Windows Vista 和更新版本上執行的 MUI 應用程式會使用語言中性字串資源,允許存取儲存在字串資源數據表中的特定語言字串。 請參閱 [載入 Language-Neutral 登錄值] 區段,以瞭解應用程式程式代碼如何從登錄讀取這些值,此區段位於 [定位重新導向字串]中。

語言中性登錄值的數據格式為 「@<PE-path>,-<stringID>[;<comment>]」,其中:

  • PE 路徑 指定可執行檔案的路徑。 您可以使用環境變數來指定路徑,例如 %ProgramFiles%,以支援部署。 建立字串參考的替代方法是省略檔案路徑資訊。 在這種情況下,您的應用程式必須具備某種方法,例如使用另一個登錄值,以傳達其安裝目錄。
  • stringID 指定相關字串資源的數值資源標識符,就像任何其他可本地化的字串資源一樣實作。
  • 註解 指定用於偵錯或提升登錄值可讀性的選擇性資訊。 載入字串時,登錄 API 函式會忽略批注。

注意

登錄值的數據未明確提及特定於語言的資源檔。 根據目前使用者介面的語言偏好,在運行時決定正確的檔案。

 

輸入登錄值時,在 “,” 和 “-” 之間沒有空格。 正確的登入值為:

shell32.dll,-22912

不正確的登錄值如下:

shell32.dll, -22912

Windows Vista 的範例是具有下列數據的登錄值:

@%SystemRoot%\system32\input.dll,-5020

為快捷字串建立資源

當 MUI 應用程式在使用者介面中顯示其名稱時,應用程式圖示會顯示提示資訊字串。 您應該為應用程式顯示名稱和相關聯的 InfoTip 字串建立字串資源,以支援每個語言。 當資源準備就緒時,您的應用程式可以按照尋找重新導向的字串中描述的方式,使用 Shell API 從註冊表載入快捷鍵字串。

準備使用 Windows Installer 建立之快捷方式的資源

如果您使用 Windows Installer (MSI) 來建立快捷方式,字串資源會包含快捷方式顯示名稱和描述。 在 MSI 快捷方式數據表中,資源 DLL 會在適當的數據行中參考,而快捷方式顯示名稱和描述的資源識別符則用於對應的資源標識符數據行中。

讓應用程式快捷方式與 MUI 資源技術正常運作,在準備快捷鍵字串時,請記住下列幾點:

  • 使用環境變數或相對路徑來註冊 DLL。 只要登錄字串類型是REG_EXPAND_SZ,您就可以指定 @%systemroot%\system32\shell32.dll。 Shell32.dll 中「文字檔」的字串資源標識碼為 12345。
  • 請勿在 “,” 和 “-” 符號周圍使用空格。 正確的範例是 “shell32.dll,-22912”。
  • 請勿使用簡短檔名。 這種類型的名稱不適用於資源載入器。

準備使用 INF 格式的快捷方式資源

如果您使用 INF 檔案格式來建立快捷方式字串,資源文件應該進行下列登錄設定。 這些指示假設使用安裝程式 API 的 ProfileItems 語法。

  1. 使用路徑和資源識別碼,將 InfoTip 值變更為指向字串重新導向參考。
  2. 在 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 將 [存取群組] 資料夾等專案新增至 [開始] 選單時,請使用下列語法。 此語法假設使用安裝程式中的 [StartMenuItems] 支援,類似於 Syssetup.inf 中使用的語法。

[StartMenuItems]
<description> = <binary>,<commandline>,<iconfile>,<iconnum>,<infotip>,<resDLL,resID>

將資訊提示 設定為字串參考 「@<path>,-resID」。

顯示名稱是由 resDLLresID 值所決定。 resID 值指定了與語言無關的檔案關聯的字串資源的資源識別符。 resDLL 值會指定語言中性檔案的路徑。

建立友好文件類型名稱的資源

您必須將應用程式的易記名稱和 InfoTip 字串實作為字串資源。 若要讓易記的檔案類型名稱能夠依據使用者介面語言作出回應,應用程式必須使用檔案類型的程式識別碼金鑰下的 FriendlyTypeName 值來註冊名稱。 應保留程式識別碼密鑰的預設值,以保持回溯相容性。 如需從應用程式存取名稱的相關資訊,請參閱 尋找重新導向字串中的「登錄表」節,查詢友好的文件類型名稱。

特定工作牽涉到下列步驟:

  1. 實作易記名稱和 InfoTip 字串做為語言特定的字串資源。
  2. 在文件類型登錄機碼下新增「FriendlyTypeName」值。 值的數據會遵循模式 「@<path>,-<resID>」,其中 路徑 指出可執行檔,resID 是與該可執行文件相關聯的可當地語系化字串資源的資源識別符。
  3. 根據 「@<path>,-<resID>」 格式指定 InfoTip 登錄值。

下列範例顯示 .txt 檔案的登錄設定:

HKCR\.txt
@="txtfile"
"Content Type"="text/plain"

HKCR\txtfile
@="Text Document"

"FriendlyTypeName" = "@%systemroot%\system32\shell32.dll,-12345"

"InfoTip" = "@%systemroot%\system32\shell32.dll,-12346"

提供 Shell 動詞操作字串的資源

特定動詞的動作字串,例如「開啟」和「編輯」,會在使用者以滑鼠右鍵按兩下 Windows 檔案總管中的檔案時,顯示在彈出視窗中顯示。 您的應用程式不需要為常用的系統動詞指定字串,因為系統本身提供了這些動詞的內建 MUI 預設值。 不過,您應該為代表不常見動詞的字串提供可本地化的字串資源。

在 Windows XP 操作系統之前,登錄中 shell 動詞的字串會使用下列語法來呈現,其中 動詞 指定實際的動詞名稱:

HKCR\<progid>\shell\<verb>
@ = <friendly-name>

以下是範例:

HKCR\Sample.app\shell\Disc
@ = "Disconnect"

在 Windows XP 及其後續版本上,您可以使用一個間接層級,使動作字串依賴於使用者介面語言。 這些作系統支援 MUIVerb 值來定義與 MUI 相容的字串。 以下是罕見動詞的登錄專案範例:

HKCR\Sample.app\shell\Disc
@ = "Disconnect"
"MUIVerb" = "@%systemroot%\system32\sample.exe,-9875"

您的 MUI 應用程式也應該能夠將舊的預設值註冊為可本地化的字串,如下所示:

HKCR\Sample.app\shell\Disc
@ = "@%systemroot%\system32\sample.exe,-9875"

附註

不建議註冊舊的預設值,因為在 Windows XP 及更新版本上,與舊版系統所使用的安裝設定不同,需要進行另一種設定。

 

建立動詞、通訊協定和 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 指定的值只包含或取代 Your Verb的值,而不是兩個旗標值。

以下是可協助您確保正確登錄設定的摘要:

  • 如果 CLSID 有 HKCR\CLSID\{clsid}\Insertable 索引鍵,請使用 HKCR\CLSID\{clsid}\LocalizedString 定義預設 CLSID 值。
  • 如果 CLSID 在 HKCR\CLSID\{clsid}\Verb 下有一個或多個子機碼,請使用 HKCR\CLSID\{clsid}\Verb\xxx\LocalizedString 定義每個個別的 Verb 字符串。
  • 如果 CLSID 在 HKCR\{progid}\Protocol\Stdfileediting\Verb 下有一或多個子機碼,請使用 HKCR\{progid}\Protocol\Stdfileediting\Verb\xxx\LocalizedString 定義每個個別的 Verb 字符串。
  • 如果 CLSID 在 HKCR\CLSID\{clsid}\AuxUserType 下有一或多個列出的 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。

注意

若要啟用每個值的 MUI 技術,您可以將 「_Localized」 附加至值名稱。

 

作業系統元件必須以 MUI 特定方式為 DisplayName_Localized 提供值。 您應該將顯示名稱放在 DLL 中,例如 Res.dll作為字串資源,假設標識碼為 1245。 然後,應用程式可以使用值 “@\res.DLL,-1245” 將顯示名稱註冊為 DisplayName_Localized。 所有其他登錄設定都應該保留,包括 DisplayName 的原始值。

建立音效事件的資源

Windows 會將特定事件與聲音檔案產生關聯,例如 New Mail Notification 事件或重大電池警示事件。 事件名稱必須由使用者介面顯示,而且必須支援全球化。 因此,您應該針對每個事件描述的描述實作可本地化的字串資源。 新增每個事件名稱的新登錄值,以及硬式編碼的預設值。

執行下列動作以啟用音效事件:

  1. 實作描述做為可本地化的字串資源。
  2. 除了硬式編碼的預設值之外,新增顯示名稱的新登錄值。 相關聯的登錄配置如下所示:
HKCR\AppEvents\EventLabels
<event_name>
    (Default) REG_SZ "<description>"
    DispFileName REG_EXPAND_SZ "@<path>,-<resID>"

如果 Shell 找不到或擷取 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 Insert Object 對話框 會從登錄機碼 HKCR\CLSID\{<GUID>}取得顯示名稱,其中 GUID 識別可插入 OLE 對象的類別標識符。 Windows Vista 和更新版本會使用符合 MUI 規範的顯示名稱,以可當地語系化的方式實作這種類型的物件,以允許自定義使用者介面語言。 相反地,Windows Vista 前作系統會使用對應登錄機碼的預設值,實作這種類型的對象的顯示名稱。 此名稱通常是英文(美國)名稱,或系統預設 UI 語言中的名稱。

注意

並非所有對應至登錄機碼子機碼的物件都能夠被插入。

 

HKCR\CLSID\{<GUID>} 索引鍵的預設值應保留人類可讀取的名稱,以提供回溯兼容性。 不過,它也應該以 「@<path>,-ResID」 格式定義 LocalizedString 值,其中 path 會識別實作 物件的可執行檔。 ResID 值指定顯示名稱的可當地語系化字串的資源識別碼。

例如,可插入 Media Clip 物件的註冊腳本包含下列幾行:

HKCR,"CLSID\%CLSID_Media_Clip%",,,"%default description%"
HKCR,"CLSID\%CLSID_Media_Clip%","LocalizedString",,"@%systemroot%\system32\mplay32.exe,-9217"

第一行會將簡單的文字字串放在登錄中做為預設顯示名稱,以提供回溯相容性。 第二行提供 MUI 相容顯示名稱的存取權。 指出儲存在 Mplay32.exe中的字串標識碼。 Mplay32.exe 中標識子為9217的字串可以與任意數目語言的字串資源值相關聯。 其英文(美國)名稱是「媒體剪輯」。

建立 Microsoft Management Console Snap-Ins 的字串資源

您應該為 MUI 應用程式所使用的每個 Microsoft Management Console (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 Management Console Snap-In Strings Not Read from the Registry。

建立 Windows 服務的字串資源

雖然 Windows 服務通常幾乎沒有或沒有使用者介面,但它必須顯示符合 MUI 規範的名稱,而且通常提供符合 MUI 規範的語言特定描述。 描述 Windows 服務的登錄機碼僅支援表示服務名稱的 DisplayName 值和表示服務描述的 Description 值。

Windows 服務的設定是從應用程式建立,如從登錄設定 Windows 服務的顯示名稱和描述中所述,尋找重新導向字串。 如果您的應用程式未設定服務使用者介面的登錄值,則即使使用者介面是其他語言,登錄中的值仍會設定為英文。

準備資源

尋找重新導向的字串