MFC:使用单独的资源 dll 本地化 MFC APP 的步骤
Posted
技术标签:
【中文标题】MFC:使用单独的资源 dll 本地化 MFC APP 的步骤【英文标题】:MFC: Steps localizing MFC APP with seperate resource dlls 【发布时间】:2013-07-02 08:13:55 【问题描述】:在有人抨击我之前,请先阅读此内容,然后阅读此内容,我已尝试通过以下链接实现 MFC 的国际化。
创建资源 DLL: MFC 组件的本地化 http://msdn.microsoft.com/en-us/library/x6h91d9w.aspx
旧版 MFC 的本地化 htp://support.microsoft.com/kb/198846/en-us
我是 MFC 的新手,所以请善待您的回答。因此,为了使用 MFC 7 及更高版本进行本地化,我遵循了这些步骤。 (目前使用 MFC 和 Visual Studio11)
-
在共享 DLL 中使用 MFC 创建了一个 MFC 项目 (MyApp)
为了向应用程序添加另一种语言(德语),我创建了一个 win32 Dll 项目 (MyAppDEU)
将资源文件 (MyApp.rc) 复制到同一个文件夹中并重命名为 MyAppDEU.rc
将 MyAppDEU.rc 文件添加到 dll 项目中
在 MyAppDEU.rc 的资源视图中,将 VS_VERSION_INFO -> 块头更改为“Deutsch (000704b0)”
更改了字符串表中的一些字符串以查看主应用加载时的差异
将 MyAppDEU 项目的输出更改为在 MyApp 输出文件夹中构建
编译 MyAppDEU 以获取 Dll
编译 MyApp 是否遵循第 9 点的说明
http://support.microsoft.com/kb/198846/en-us
所有这些都完成后,我没有看到我的应用程序有任何不同。它加载了我创建应用程序的英文资源文件。我的电脑有一个德语 Windows 8 操作系统。据我所知,MFC 内置了 Satellite Dlls 的多语言支持。我有正确的命名格式 ApplicationNameXXX.dll。 dll与exe在同一目录中。
我希望有人能在这里看到我做错了什么或遗漏了什么。我是 MFC 的新手,非常感谢有关此方面的任何帮助。
【问题讨论】:
【参考方案1】:[答案改编自this SO answer]
我成功地使用了一种稍微不同的方法,跳过了 MFC 内置的卫星 DLL 多语言支持。
我们的解决方案中有多个 DLL 项目,每个项目仅包含一组用于单一语言的资源(例如:AppRes_ENU.DLL)。在运行时InitInstance()
,我们选择合适的语言 DLL,代码如下:
CString sResourceDllName;
// format sResourceDllName according to the language ("%s\AppRes_%s.DLL")
hInst_aRes = LoadLibrary(sResourceDllName);
if (hInst_aRes == NULL)
// handle <resoure-DLL not available>
return FALSE;
AfxSetResourceHandle(hInst_aRes);
并使用hInst_aRes
加载字符串、对话框……
【讨论】:
谢谢,我知道在 InitInstance() 加载 dll。我正在寻找一种使用卫星 dll 和当前语言环境自动加载它的方法(MFC 现在支持)。到目前为止,我使用插入副本在同一个 .rc 文件中创建了多个语言项。它在我的系统中加载了正确的语言。需要将其导出为资源 dll,因此在以不同语言发布时不必打包整个应用程序。该链接似乎很有帮助。我去看看。【参考方案2】:看看这个软件:http://www.apptranslator.com/。它有助于使用卫星 dll 进行本地化;该文档可能描述了如何做到这一点。一旦你弄清楚我们之间的关系 ::AfxGetResourceHandle() 和 hInstanceHandle 以及所有那些爵士乐,这很简单——了解它的最简单方法是阅读 MFC 源代码。然后你写了一些帮助类然后你就走了:)
【讨论】:
以上是关于MFC:使用单独的资源 dll 本地化 MFC APP 的步骤的主要内容,如果未能解决你的问题,请参考以下文章
WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)