【发布时间】:2018-03-28 06:22:12
【问题描述】:
我有一个 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 文件设置为“从构建中排除”。
我相信我已经正确设置了一切,因为我可以使用如下所示的 sn-p 从瑞士德语资源文件中成功加载字符串资源:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
CString teststring;
teststring.LoadString(AfxGetResourceHandle(), IDS_TESTSTRING, swissGermanLCID);
问题是:当我省略语言ID时,例如在下面的sn-p中,MFC 总是从美国英语资源中加载资源,无论我尝试什么:
CString teststring;
teststring.LoadString(IDS_TESTSTRING);
我尝试过/检查过的事情:
- 我在 Windows 控制面板中反复检查了我的区域设置是否设置为瑞士德语。
- 当我从美国英语资源文件中删除 所有 STRINGTABLE 条目时,默认
LoadString成功加载了瑞士德语测试字符串。我的结论是,如果存在的话,美国英语资源优先于瑞士德语资源。 - 我尝试将线程语言环境设置为瑞士德语(本文末尾的 sn-p),但未成功。 MFC 仍然坚持加载美国英语字符串。
- 我已经在项目中搜索了任何与语言相关的代码,但什么也没有。该项目是我通过 Visual Studio 2013 中的项目向导创建的一个简单的 MFC 应用程序。
- 我还尝试了项目属性“资源”部分中“文化”选项的各种设置。目前我正在明确设置
/l 0x0807,它对应于瑞士德语。 - 在最后一次尝试中,我尝试将 Swiss German 资源拆分为一个单独的附属 DLL - 显然这很完美,因为 MFC 在后台调用了
AfxSetResourceHandle()。
好的,最后,问题来了:MFC 如何确定它在加载资源时使用的默认语言 ID?甚至更好:如何更改默认语言 ID?
这是我上面提到的用来设置线程语言环境的 sn-p:
WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
SetThreadLocale(swissGermanLCID);
【问题讨论】:
-
您的操作系统是什么语言?
-
@ZDF 操作系统是德语,Visual Studio 是英语。当我从 Visual Studio 外部启动测试应用程序时,问题仍然存在。
标签: c++ visual-c++ mfc