我有一个 MFC 项目,其中包含一个用于美国英语的 .rc 文件和一个用于瑞士德语的 .rc 文件。这两个 .rc 文件相同,除了 1) 我用于测试的单个字符串,以及 2) .rc 文件在顶部使用不同的 LANGUAGE
语句:
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US >>> for US English
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS >>> for Swiss German
我从一个主 .rc 文件中包含了两个 .rc 文件。主 .rc 文件已编译,特定语言的 .rc 文件设置为“从构建中排除”。
我相信我已经正确设置了所有内容,因为我可以使用如下代码片段从瑞士德语资源文件中成功加载字符串资源:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
CString teststring;
teststring.LoadString(AfxGetResourceHandle(), IDS_TESTSTRING, swissGermanLCID);
问题是:当我省略语言 ID 时,例如在下面的代码片段中,无论我尝试什么,MFC 总是从美国英语资源加载资源:
CString teststring;
teststring.LoadString(IDS_TESTSTRING);
我已经尝试/检查过的事情:
- 我已在 Windows 控制面板中反复检查我的区域设置是否设置为瑞士德语。
- 当我从美国英语资源文件中删除所有 STRINGTABLE 条目时,默认的
LoadString
会成功加载瑞士德语测试字符串。我的结论是,如果存在,美国英语资源优先于瑞士德语资源。 - 我曾尝试将线程语言环境设置为瑞士德语,但没有成功(本文末尾的片段)。 MFC 仍然坚持加载美国英文字符串。
- 我已经在项目中搜索了任何与语言相关的代码,但没有任何内容。该项目是我通过 Visual Studio 2013 中的项目向导创建的一个简单的 MFC 应用程序。
- 我还尝试了项目属性“资源”部分中“文化”选项的各种设置。目前,我正在明确设置与瑞士德语相对应的
/l 0x0807
。 - 在最后一次尝试中,我尝试将瑞士德语资源拆分为一个单独的卫星 DLL - 显然效果很好,我认为是因为 MFC 在幕后调用了
AfxSetResourceHandle()
。
OK,最后,问题来了:MFC 如何确定它在加载资源时使用的默认语言 ID?更好的是:如何更改默认语言 ID?
这是我在上面提到的用于设置线程区域设置的片段:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
SetThreadLocale(swissGermanLCID);
最佳答案
- 请检查哪些资源实际打包到您的可执行文件中。您可以使用 Explorer's Suite 或其他资源编辑器之类的东西。
- 在 Windows Vista 和较新版本中,资源加载顺序由您可以使用
GetThreadPreferredUILanguages
family of functions 获得的首选语言列表决定。 (有一个单独的列表供用户、进程和线程合并以执行资源查找)。它可能会被 MFC 运行时更改,但我不确定。在您的系统上,此列表可能包含 4 个条目:[de-CH
、de
、en-US
、en
]. - 将资源拆分为单独的 mui dll 可能是个好主意,但当所有内容都打包到单个可执行文件中时,它应该可以完美地工作。
关于c++ - MFC加载资源时如何确定默认语言ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46775240/