使用注册表字符串重定向

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

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

注释

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

 

创建 Language-Neutral 资源

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

非特定语言注册表值的数据格式为“@<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 显示其名称时,将显示应用程序图标的信息提示字符串。 应为每种受支持的语言创建应用程序显示名称的字符串资源以及关联的提示信息字符串资源。 当资源准备就绪后,您的应用程序可以按照《查找重定向字符串》中“使用 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>

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

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

为用户友好的文档类型名称创建资源

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

具体工作涉及以下步骤:

  1. 将友好名称和信息提示字符串实现为语言特定的字符串资源。
  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"

为动作字符串提供资源

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

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

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

下面是一个示例:

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

在 Windows XP 及更高版本上,可以使用间接方法使操作字符串依赖于用户界面语言。 这些作系统支持 MUIVerb 值来定义与 MUI 兼容的字符串。 下面是一个不常见 verb 注册表项的示例:

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 和更高版本上,需要的设置与早期操作系统不同。

 

为 Verb、Protocol和 AuxUserType 字符串创建资源

应为 VerbProtocolAuxUserType 字符串创建可本地化的字符串资源。 使用以下注册表设置:

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、、 CommentsDisplayIcon、Readme、UrlUpdateInfo。

注释

若要为每个值启用 MUI 技术,可以将“_Localized”追加到值名称。

 

操作系统组件需要以特定于 MUI 的方式提供 DisplayName_Localized 的值。 应将显示名称放在 DLL 中(例如 Res.dll)作为字符串资源,假设标识符为 1245。 然后,应用程序可以将显示名称注册为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 的字符串可与任意数量的语言的字符串资源值相关联。 其英语(美国)名称为“媒体剪辑”。

为Microsoft管理控制台 Snap-Ins 创建字符串资源

应为 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 管理控制台 Snap-In 字符串查找重定向字符串 中。

为 Windows 服务创建字符串资源

尽管 Windows 服务通常几乎没有或没有用户界面,但它必须显示符合 MUI 的名称,并且通常提供特定于 MUI 的语言说明。 描述 Windows 服务的注册表项仅支持服务名称的 DisplayName 值和服务说明的 Description 值。

Windows 服务的设置是通过应用程序完成的,如在从注册表设置 Windows 服务的显示名称和说明查找重定向字符串所述。 如果应用程序未为服务用户界面设置注册表值,则注册表中的值将保持设置为 English,即使用户界面采用其他语言也是如此。

准备资源

查找重定向字符串