我用MFC编写的带有德语菜单的应用程序很少。现在,我也被要求制作英文版本。 但目标是不使用其他语言DLL 。最后应该只有两个.exe文件(德语和英语)。 您是否了解任何逐步手册,如何为英语对话添加第二个资源文件(如果需要)以及如何在我的C ++代码中使用它们? 我的想法是使用预处理器指令:
#ifdef APPLANG=EN
m_wndRibbonBar.LoadFromResource(IDR_RIBBON_EN);
#else if
m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
#endif
以这种方式这样做是一个好主意吗? 简单复制现有资源文件并将其修改为英语的正确步骤是什么?
我已经尝试了几种方法,例如制作一个新的资源文件,然后将原始的德语菜单复制到新文件中。但是,我收到诸如“输入合法资源ID”之类的几个错误。
答案 0 :(得分:2)
您可以在单个.exe文件中嵌入多种语言资源,而不必使用资源DLL。 Visual Studio资源编辑器不支持此用例,因此必须使用文本编辑器手动编辑资源脚本。
要定义资源,请使用Visual Studio资源编辑器不会尝试修改的.rc2文件。确保使用 Unicode(UTF-16 LE)编码存储.rc2文件,并始终以换行符结尾,否则资源编译器将失败。
在.rc2主文件中,为每个特定于语言的.rc2文件添加#include
:
#include "lang_en.rc2"
#include "lang_de.rc2"
// Restore default language for resources included after current file
LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
创建特定于语言的.rc2文件。每个文件必须以LANGUAGE <LANGID>, <SUBLANGID>
开头以指示以下资源的语言:
lang_zh.rc2
LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_STRING1 "Stack Overflow"
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."
END
lang_de.rc2
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_STRING1 "Stapelüberlauf"
IDS_STRING2 "Stack Overflow (englisch für Stapelüberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen können."
END
构建可执行文件,并在资源编辑器中对其进行检查,以查看是否实际上包含了多种语言的资源。除了使用资源编辑器,您还可以在Visual Studio中打开.exe文件以检查其资源。例如,在Visual Studio中打开时,我为此答案构建的演示.exe如下所示:
在代码中,您可以照常加载资源,Windows将自动加载与当前用户区域设置最匹配的语言资源。如果找不到匹配项,则返回英文。
如果要显式加载给定语言的资源,则可以使用具有语言参数(例如e)的资源函数来完成。 G。 FindResourceEx()
。
事不宜迟,standard MFC resources仅包含在项目资源属性中配置的“主要”语言中。
在使用这种方法的项目中,我不需要标准的MFC资源。以下只是一个未经实验的想法,可能如何实现。
在不是“主要”语言的每个特定于语言的.rc2文件中,在#include
行之后添加LANGUAGE
用于MFC标准资源,例如。 g。:
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
#ifdef __AFXRES_RC__
#undef __AFXRES_RC__ // To be able to include multiple language versions of afxres.rc
#endif
#include "l.deu\afxres.rc" // Standard MFC resources
STRINGTABLE
BEGIN
IDS_STRING1 "Stapelüberlauf"
IDS_STRING2 "Stack Overflow (englisch für Stapelüberlauf) ist eine Internetplattform, auf der angemeldete Benutzer Fragen zum Thema Softwareentwicklung stellen können."
END
#undef
可以绕过标准MFC资源文件的包含保护,通常可以防止多个包含。在我们的例子中,这是可以的,因为资源将最终位于可执行文件的不同语言资源部分。