使用注册表字符串重定向

在注册表中存储硬编码字符串是 Windows Vista 之前本地化模型的一部分。 MUI 不支持它。 在当前模型中,操作系统的用户界面在中性语言基础上运行在语言特定资源文件中。 操作系统的组件以中性语言的方式使用注册表。

MUI 仅在基础语言资源文件中使用由 Win32 PE 资源定义的重定向注册表字符串。 重定向是单独定义的,例如,在 .inf 文件中。 使用此类型的存储,资源加载程序可以在资源模块加载期间自动选择正确的语言资源。

注意

本主题仅适用于 Win32 PE 资源。 如果使用非 Win32 PE 资源,则必须根据需要提供自定义的注册表字符串重定向。

 

创建中性语言资源

在 Windows Vista 和更高版本上运行的 MUI 应用程序使用中性语言字符串资源,以允许访问存储在字符串资源表中的语言特定字符串。 查找重定向字符串的“加载中性语言注册表值”部分介绍了从注册表读取这些值的应用程序代码。

中性语言注册表值的数据采用“@<PE-path>,-<stringID>[;<comment>]”格式,其中:

  • PE-path 指定了可执行文件的路径。 可以使用环境变量(如 %ProgramFiles)指定路径以支持部署。 进行字符串引用的替代方法是省略文件路径信息。 在这种情况下,应用程序必须可以通过某种方式(例如,另一个注册表值)来传达自己的安装目录。
  • stringID 指定了相关字符串资源的数值资源标识符,它的实现方式与任何其他可本地化字符串资源相同。
  • comment 指定了用于调试注册表值或有关注册表值可读性的可选信息。 加载字符串时,注册表 API 函数将忽略注释。

注意

注册表值的数据不会显式引用语言特定的资源文件。 正确的文件是根据当前用户界面语言首选项在运行时确定的。

 

输入注册表值时,在“,”和“-”之间不应存在空格。 正确的注册表值是:

shell32.dll,-22912

不正确的注册表值是:

shell32.dll, -22912

Windows Vista 中的一个示例是包含以下数据的注册表值:

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

为快捷方式字符串创建资源

当 MUI 应用程序在 shell 用户界面中显示其名称时,将会显示应用程序图标的 InfoTip 字符串。 应为每种受支持语言的应用程序显示名称和关联的 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 将项目(例如 Access Group 文件夹)添加到“开始”菜单时,请使用如下所示的语法。 此语法假定使用安装程序提供的 [StartMenuItems] 支持,这类似于 Syssetup.inf 中使用的语法。

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

将值 infotip 设置为字符串引用“@<path>,-resID”。

显示名称由 resDLLresID 值确定。 resID 值指定了与语言中性文件关联的字符串资源的资源标识符。 resDLL 值指定中性语言文件的路径。

为易记文档类型名称创建资源

必须将应用程序的易记名称和 InfoTip 字符串作为字符串资源实现。 要允许易记文档类型名称响应用户界面语言,应用程序必须使用文件类型的程序标识符键下的 FriendlyTypeName 值注册名称。 应保留程序标识符键的默认值,以保持向后兼容性。 有关从应用程序访问名称的信息,请参阅查找重定向字符串的“在注册表中查询易记文档类型名称”。

具体工作包括以下步骤:

  1. 将易记名称和 InfoTip 字符串实现为语言特定的字符串资源。
  2. 在文档类型注册表项下添加 FriendlyTypeName 值。 该值的数据遵循模式“@<path>,-<resID>”,其中 path 指示可执行文件,并且 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 谓词操作字符串提供资源

某些谓词的操作字符串(例如“open”和“edit”)会显示在用户右键单击 Windows 资源管理器中的文件时显示的弹出菜单中。 应用程序不必为常见 shell 谓词指定字符串,因为 shell 具有为这些谓词启用 MUI 的默认值。 但应为表示不常见谓词的字符串提供可本地化的字符串资源。

在 Windows XP 之前的操作系统上,注册表中 shell 谓词的字符串使用以下语法呈现,其中 verb 指定了实际的谓词名称:

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 字符串创建资源

应为谓词、协议和 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 定义每个单独的谓词字符串。
  • 如果 CLSID 在 HKCR\{progid}\Protocol\Stdfileediting\Verb 下具有一个或多个子项,请使用 HKCR\{progid}\Protocol\Stdfileediting\Verb\xxx\LocalizedString 定义每个单独的谓词字符串。
  • 如果 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 提供值。 假设标识符为 1245,应将显示名称放在 DLL(如 Res.dll)中作为字符串资源。 然后,应用程序可以将显示名称注册为 DisplayName_Localized,其值为“@\res.DLL,-1245”。 所有其他注册表设置应保留不变,包括 DisplayName 的原始值。

为声音事件创建资源

Windows 将某些事件与声音文件相关联,例如新建邮件通知事件或严重电池警报事件。 事件名称必须由用户界面显示,并且必须支持全球化。 因此,应为每个事件说明的描述实现可本地化的字符串资源。 除了硬编码的默认值外,请为每个事件名称添加新的注册表值。

执行以下操作以启用声音事件:

  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 插入对象”对话框可从注册表项 HKCR\CLSID\{<GUID>} 获取显示名称,其中 GUID 标识了可插入 OLE 对象的类标识符。 Windows Vista 和更高版本以可本地化的方式实现此类型的对象,方法是使用支持自定义用户界面语言的 MUI 兼容显示名称。 相比之下,Windows Vista 之前的操作系统使用相应注册表项的默认值实现此类型对象的显示名称。 通常,此名称是英语(美国)名称或系统默认 UI 语言的名称。

注意

并非所有与注册表项的子项对应的对象都是可插入的。

 

HKCR\CLSID\{<GUID>} 项的默认值应保留人类可读名称以实现向后兼容性。 但它还应采用“@<path>,-ResID”格式定义 LocalizedString 值,其中路径标识了实现对象的可执行文件。 ResID 值指定了显示名称的可本地化字符串的资源标识符。

例如,可插入媒体剪辑对象的注册脚本包含以下行:

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

第一行通过将简单的文本字符串作为默认显示名称放置在注册表中来提供向后兼容性。 第二行提供对 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 服务的显示名称和说明”中所述。 如果应用程序未设置服务用户界面的注册表值,则注册表中的值仍设置为英语,即使用户界面采用其他语言也是如此。

准备资源

查找重定向字符串