noo*_*son 3 c++ multilingual mfc
我有一个用 MFC 制作的带有德语菜单的非常小的应用程序。现在我也被要求制作一个英文版本。但目标是不使用其他语言 DLL。最后应该只有两个 .exe 文件(德语和英语)。您是否知道如何为英语对话添加第二个资源文件(如果需要)以及如何在我的 C++ 代码中使用它们的分步手册?我的想法是使用预处理器指令:
#ifdef APPLANG=EN
m_wndRibbonBar.LoadFromResource(IDR_RIBBON_EN);
#else if
m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
#endif
Run Code Online (Sandbox Code Playgroud)
这样做是个好主意吗?简单地复制现有资源文件并将其修改为英文的正确步骤是什么?
我尝试了几种方法,例如制作新的资源文件并将原始的德语菜单复制到新文件中。但我收到了几个错误,例如“输入合法的资源 ID”。
您可以将多种语言资源嵌入到单个 .exe 文件中,而无需使用资源 DLL。Visual Studio 资源编辑器不支持此用例,因此必须使用文本编辑器手动编辑资源脚本。
\n\n要定义资源,请使用 Visual Studio 资源编辑器不会尝试修改的 .rc2 文件。确保使用Unicode (UTF-16 LE)编码存储 .rc2 文件,并始终以换行符结束,否则资源编译器将失败。
\n\n在主 .rc2 文件中#include为每种特定于语言的 .rc2 文件添加一个:
#include "lang_en.rc2"\n#include "lang_de.rc2"\n\n// Restore default language for resources included after current file\nLANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL\nRun Code Online (Sandbox Code Playgroud)创建特定于语言的 .rc2 文件。每个文件必须以LANGUAGE <LANGID>, <SUBLANGID>指示以下资源的语言开头:
lang_en.rc2
\n\nLANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL\nSTRINGTABLE\nBEGIN\n IDS_STRING1 "Stack Overflow"\n IDS_STRING2 "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network, created in 2008 by Jeff Atwood and Joel Spolsky."\nEND\nRun Code Online (Sandbox Code Playgroud)\n\nlang_de.rc2
\n\nLANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL\nSTRINGTABLE\nBEGIN\n IDS_STRING1 "Stapel\xc3\xbcberlauf"\n IDS_STRING2 "Stack Overflow (englisch f\xc3\xbcr Stapel\xc3\xbcberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen k\xc3\xb6nnen."\nEND\nRun Code Online (Sandbox Code Playgroud)构建可执行文件并在资源编辑器中检查它,以查看资源是否实际上包含多种语言。您还可以在 Visual Studio 中打开 .exe 文件来检查其资源,而不是使用资源编辑器。例如,我为此答案构建的演示 .exe 在 Visual Studio 中打开时如下所示:
\n\n在代码中你可以照常加载资源,Windows会自动加载最匹配当前用户区域设置的语言资源。如果找不到匹配项,则会返回英语。
\n\n如果您想显式加载给定语言的资源,您可以使用具有语言参数的资源函数来完成此操作,例如FindResourceEx()。
言归正传,标准 MFC 资源将仅包含在项目资源属性中配置的“主”语言中。
\n\n在我使用此方法的项目中,我不需要标准 MFC 资源。以下只是一个未经测试的想法,如何可能做到这一点。
\n\n在每个非“主”语言的特定于语言的 .rc2 文件中,在行后添加#includes 表示 MFC 标准资源LANGUAGE,例如:
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL\n\n#ifdef __AFXRES_RC__\n #undef __AFXRES_RC__ // To be able to include multiple language versions of afxres.rc\n#endif\n#include "l.deu\\afxres.rc" // Standard MFC resources\n\nSTRINGTABLE\nBEGIN\n IDS_STRING1 "Stapel\xc3\xbcberlauf"\n IDS_STRING2 "Stack Overflow (englisch f\xc3\xbcr Stapel\xc3\xbcberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen k\xc3\xb6nnen."\nEND\nRun Code Online (Sandbox Code Playgroud)\n\n这#undef是为了规避标准 MFC 资源文件的包含保护,这通常会阻止多次包含。在我们的例子中,这是可以的,因为资源最终会出现在可执行文件的不同语言资源部分中。
| 归档时间: |
|
| 查看次数: |
2619 次 |
| 最近记录: |