注释
自联机文档中首次包含此说明以来,尚未更新以下技术说明。 因此,某些过程和主题可能过期或不正确。 有关最新信息,建议在在线文档索引中搜索您感兴趣的主题。
此说明介绍了一些可用于本地化组件的设计和过程(如果它是应用程序或 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、德语、MFC7xESP.DLL等)或更高版本一起 MFC7xLOC.DLL寄送到系统目录中。 对于开发人员和最终用户而言,这可能非常复杂,因此不建议这样做。 有关此技术及其注意事项的详细信息,请参阅 技术说明 56 。
最简单的最安全方法是将本地化的 MFC 资源包含在应用程序或 DLL 本身(或其附属 DLL(如果使用)。 这可避免正确安装MFC7xLOC.DLL的问题。 为此,请遵循上述静态情况的相同说明(正确设置 RC 命令行以指向本地化资源),但还必须删除 /D_AFXDLL
AppWizard 添加的定义。 定义时 /D_AFXDLL
,AFXRES。H(和其他 MFC RC 文件)实际上没有定义任何资源(因为它们将改为从 MFC DLL 中提取)。