注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍了一些可用于本地化组件的设计和过程(如果它是应用程序或 OLE 控件或使用 MFC 的 DLL)。
概述
本地化使用 MFC 的组件时,确实有两个问题需要解决。 首先,必须本地化自己的资源,即特定于组件的字符串、对话框和其他资源。 使用 MFC 生成的大多数组件还包括和使用 MFC 定义的多个资源。 您还必须提供本地化的 MFC 资源。 幸运的是,MFC 本身已经提供了多种语言。
此外,您的组件应准备好在其目标环境中运行,无论是欧洲环境还是启用 DBCS 的环境。 在大多数情况下,这取决于应用程序正确处理高位设置的字符,并能够处理包含双字节字符的字符串。 默认情况下,MFC 在这两种环境中处于启用状态,以便可以获得一个可在所有平台上使用并在设置时插入不同资源的单一全球二进制文件。
本地化组件的资源
本地化应用程序或 DLL 应只涉及将资源替换为与目标语言匹配的资源。 对于自己的资源,这相对简单:在资源编辑器中编辑资源并生成应用程序。 如果你的代码编写得当,C++源代码中就不会有需要本地化的硬编码字符串或文本——所有的本地化都可以通过简单地修改资源来完成。 事实上,你可以实现组件,以便所有提供本地化版本甚至不涉及原始代码的生成。 这种方法更复杂,但很值得,并且这是为 MFC 本身选择的机制。 还可以通过将 EXE 或 DLL 文件加载到资源编辑器中并直接编辑资源来本地化应用程序。 尽管可能,但每次生成新版本的应用程序时,都需要重新应用这些更改。
避免这种情况的一种方法是将所有资源存放在单独的 DLL 中,有时称为卫星 DLL。 然后,此 DLL 在运行时动态加载,资源将从该 DLL 而不是包含所有代码的主模块加载。 MFC 直接支持此方法。 请考虑名为 MYAPP.EXE; 的应用程序;它可能具有其所有资源位于名为 MYRES.DLL 的 DLL 中。 在应用程序中 InitInstance
,它将执行以下操作以加载该 DLL,使得 MFC 从该位置加载资源:
CMyApp::InitInstance()
{
// one of the first things in the init code
HINSTANCE hInst = LoadLibrary("myres.dll");
if (hInst != NULL)
AfxSetResourceHandle(hInst);
// other initialization code would follow
// ...
}
此后,MFC 将从该 DLL 加载资源,而不是从 myapp.exe加载资源。 但是,所有资源都必须存在于该 DLL 中;MFC 不会在搜索给定资源时搜索应用程序的实例。 此方法同样适用于常规 MFC DLL 和 OLE 控件。 安装程序会根据用户想要的资源区域设置复制相应的MYRES.DLL版本。
创建纯资源 DLL 相对简单一些。 创建一个 DLL 项目,将你的 .RC 文件添加到项目中,并添加所需的资源。 如果现有项目不使用此方法,则可以从该项目复制资源。 将资源文件添加到项目后,你几乎已准备好生成项目。 唯一必须做的就是将链接器选项设置为包括 /NOENTRY。 这告诉链接器 DLL 没有入口点 - 因为它没有代码,所以没有入口点。
注释
Visual C++ 4.0 及更高版本中的资源编辑器支持在单个 .RC 文件中使用多种语言。 这样就可以轻松地在单个项目中管理本地化。 每种语言的资源由资源编辑器生成的预处理器指令控制。
使用提供的 MFC 本地化资源
生成的任何 MFC 应用程序都重复使用 MFC 中的两项内容:代码和资源。 也就是说,MFC 具有各种错误消息、内置对话以及 MFC 类使用的其他资源。 为了完全本地化应用程序,不仅需要本地化应用程序的资源,还需要本地化直接来自 MFC 的资源。 MFC 自动提供许多不同的语言资源文件,因此,如果目标语言是 MFC 已支持的语言之一,则只需确保使用这些本地化资源。
截至本文撰写,MFC 支持中文、德语、西班牙语、法语、意大利语、日语和朝鲜语。 包含这些本地化版本的文件位于 MFC\INCLUDE\L.* (“L”表示本地化)目录中。 例如,德语文件位于 MFC\INCLUDE\L.DEU 中。 若要使应用程序使用这些 RC 文件而不是位于 MFC\INCLUDE 中的文件,请添加到 /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU
RC 命令行(这只是一个示例;你需要替换所选区域设置以及安装 Visual C++ 的目录)。
如果应用程序静态链接到 MFC,则上述说明将起作用。 大多数应用程序动态链接(因为这是 AppWizard 默认值)。 在这种情况下,不仅代码是动态链接的,资源也是如此。 因此,可以在应用程序中本地化资源,但 MFC 实现资源仍将从MFC7x.DLL(或更高版本)或MFC7xLOC.DLL加载(如果存在)。 可以从两个不同的角度来解决此问题。
更复杂的方法是发送本地化的 MFC7xLOC.DLL(例如 MFC7xDEU.DLL,用于德语,MFC7xESP.DLL 用于西班牙语等)或更高版本,并在用户安装您的应用程序时将合适的 MFC7xLOC.DLL 安装到系统目录中。 对于开发人员和最终用户而言,这可能非常复杂,因此不建议这样做。 有关此技术及其注意事项的详细信息,请参阅 技术说明 56 。
最简单和最安全的方法是将本地化的 MFC 资源包含在应用程序或 DLL 本身中(如果使用附属 DLL,则包含在其附属 DLL 中)。 这可避免正确安装MFC7xLOC.DLL的问题。 为此,请遵循上述静态情况的相同说明(正确设置 RC 命令行以指向本地化资源),但还必须删除 /D_AFXDLL
AppWizard 添加的定义。 定义/D_AFXDLL
时,AFXRES.H(及其他 MFC RC 文件)实际上不会定义任何资源,因为它们将从 MFC DLL 中提取。