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

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”。

zet*_*t42 6

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

\n\n

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

\n\n

脚步

\n\n
    \n
  1. 通过 MFC 应用程序向导创建的项目已经包含一个空的 .rc2 文件,我们可以将其用作“主”.rc2 文件。否则,请遵循文档或使用向导创建一个新的 MFC 应用程序来剖析如何包含 .rc2 文件。
  2. \n
  3. 在主 .rc2 文件中#include为每种特定于语言的 .rc2 文件添加一个:

    \n\n
    #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\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 创建特定于语言的 .rc2 文件。每个文件必须以LANGUAGE <LANGID>, <SUBLANGID>指示以下资源的语言开头:

    \n\n

    lang_en.rc2

    \n\n
    LANGUAGE 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\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    lang_de.rc2

    \n\n
    LANGUAGE 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\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. 构建可执行文件并在资源编辑器中检查它,以查看资源是否实际上包含多种语言。您还可以在 Visual Studio 中打开 .exe 文件来检查其资源,而不是使用资源编辑器。例如,我为此答案构建的演示 .exe 在 Visual Studio 中打开时如下所示:

    \n\n

    多语言字符串表

  8. \n
\n\n

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

\n\n

如果您想显式加载给定语言的资源,您可以使用具有语言参数的资源函数来完成此操作,例如FindResourceEx()

\n\n

包括标准MFC资源

\n\n

言归正传,标准 MFC 资源将仅包含在项目资源属性中配置的“主”语言中。

\n\n

在我使用此方法的项目中,我不需要标准 MFC 资源。以下只是一个未经测试的想法,如何可能做到这一点。

\n\n

在每个非“主”语言的特定于语言的 .rc2 文件中,在行后添加#includes 表示 MFC 标准资源LANGUAGE,例如:

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n\n

#undef是为了规避标准 MFC 资源文件的包含保护,这通常会阻止多次包含。在我们的例子中,这是可以的,因为资源最终会出现在可执行文件的不同语言资源部分中。

\n