您可以将多种语言资源嵌入到单个 .exe 文件中,而无需使用资源 DLL。 Visual Studio 资源编辑器不支持此用例,因此必须使用文本编辑器手动编辑资源脚本。
要定义资源,请使用 Visual Studio 资源编辑器不会尝试修改的 .rc2 文件。确保存储 .rc2 文件统一码 (UTF-16 LE)编码并始终以换行符结束它们,否则资源编译器会失败。
Steps
- 通过 MFC 应用程序向导创建的项目已经包含一个空的 .rc2 文件,我们可以将其用作“主”.rc2 文件。否则遵循文档 https://learn.microsoft.com/en-us/previous-versions/6e7446zd(v=vs.140)或者使用向导创建一个新的 MFC 应用程序来剖析如何包含 .rc2 文件。
-
在主 .rc2 文件中添加#include
对于每个特定于语言的 .rc2 文件:
#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_en.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 文件来检查其资源,而不是使用资源编辑器。例如,我为此答案构建的演示 .exe 在 Visual Studio 中打开时如下所示:
在代码中你可以照常加载资源,Windows会自动加载最匹配当前用户区域设置的语言资源。如果找不到匹配项,则会返回英语。
如果要显式加载给定语言的资源,可以使用具有语言参数的资源函数来完成此操作,例如: G。FindResourceEx() https://learn.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-findresourceexa.
包括标准MFC资源
无需再费周折,标准 MFC 资源 https://learn.microsoft.com/en-us/cpp/mfc/tn023-standard-mfc-resources?view=vs-2017将仅包含在项目资源属性中配置的“主”语言中。
在我使用此方法的项目中,我不需要标准 MFC 资源。以下只是一个untested想法如何可能做到这一点。
在每个非“主”语言的特定于语言的 .rc2 文件中,添加#include
s 为 MFC 标准资源LANGUAGE
莱恩岛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
The #undef
是为了规避标准 MFC 资源文件的包含保护,这通常会阻止多次包含。在我们的例子中,这是可以的,因为资源最终会出现在可执行文件的不同语言资源部分中。