在不使用资源DLL的情况下将第二种语言添加到MFC项目中

时间:2018-11-30 12:25:31

标签: c++ mfc multilingual

我用MFC编写的带有德语菜单的应用程序很少。现在,我也被要求制作英文版本。 但目标是不使用其他语言DLL 。最后应该只有两个.exe文件(德语和英语)。 您是否了解任何逐步手册,如何为英语对话添加第二个资源文件(如果需要)以及如何在我的C ++代码中使用它们? 我的想法是使用预处理器指令:

#ifdef APPLANG=EN
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON_EN);
#else if
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
#endif

以这种方式这样做是一个好主意吗? 简单复制现有资源文件并将其修改为英语的正确步骤是什么?

我已经尝试了几种方法,例如制作一个新的资源文件,然后将原始的德语菜单复制到新文件中。但是,我收到诸如“输入合法资源ID”之类的几个错误。

1 个答案:

答案 0 :(得分:2)

您可以在单个.exe文件中嵌入多种语言资源,而不必使用资源DLL。 Visual Studio资源编辑器不支持此用例,因此必须使用文本编辑器手动编辑资源脚本。

要定义资源,请使用Visual Studio资源编辑器不会尝试修改的.rc2文件。确保使用 Unicode(UTF-16 LE)编码存储.rc2文件,并始终以换行符结尾,否则资源编译器将失败。

步骤

  1. 通过MFC应用程序向导创建的项目已经包含一个空的.rc2文件,我们可以将其用作“主” .rc2文件。否则,按照the documentation进行操作,或使用向导创建一个新的MFC应用程序以剖析.rc2文件的包含方式。
  2. 在.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
    
  3. 创建特定于语言的.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
    
  4. 构建可执行文件,并在资源编辑器中对其进行检查,以查看是否实际上包含了多种语言的资源。除了使用资源编辑器,您还可以在Visual Studio中打开.exe文件以检查其资源。例如,在Visual Studio中打开时,我为此答案构建的演示.exe如下所示:

    Multi language string table

在代码中,您可以照常加载资源,Windows将自动加载与当前用户区域设置最匹配的语言资源。如果找不到匹配项,则返回英文。

如果要显式加载给定语言的资源,则可以使用具有语言参数(例如e)的资源函数来完成。 G。 FindResourceEx()

包括标准MFC资源

事不宜迟,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资源文件的包含保护,通常可以防止多个包含。在我们的例子中,这是可以的,因为资源将最终位于可执行文件的不同语言资源部分。