MFC在加载资源时如何确定默认语言ID

How does MFC determine the default language ID when loading resources?

本文关键字:何确定 默认 语言 ID 加载 资源 MFC      更新时间:2023-10-16

我有一个MFC项目,其中包含一个用于美国英语的.rc文件和一个用于瑞士德语的.rec文件。这两个.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仍然坚持加载美国英语字符串
  • 我已经在项目中搜索了任何与语言相关的代码,但什么都没有。该项目是一个简单的MFC应用程序,我通过Visual Studio 2013中的项目向导创建了它
  • 我还在项目属性的"资源"部分尝试了"文化"选项的各种设置。目前我正在明确设置对应于瑞士德语的/l 0x0807
  • 在最后一次尝试中,我尝试将瑞士-德国资源拆分为一个单独的卫星DLL——显然,我认为这非常有效,因为MFC在幕后调用AfxSetResourceHandle()

好的,最后,这里有一个问题:MFC如何确定加载资源时使用的默认语言ID?更好的是:我如何更改默认的语言ID?


这是我上面提到的用于设置线程区域设置的片段:

WORD swissGermanLanguageID =
MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS);
WORD swissGermanLCID =
MAKELCID(swissGermanLanguageID, SORT_DEFAULT);
SetThreadLocale(swissGermanLCID);
  • 请检查哪些资源实际打包到可执行文件中。您可以使用资源管理器套件或其他资源编辑器
  • 在Windows Vista和更新版本上,资源加载顺序由使用GetThreadPreferredUILanguages函数族可以获得的首选语言列表决定(用户、进程和线程有一个单独的列表,它们组合在一起执行资源查找)。MFC运行时可能会更改它,但我不确定。在您的系统中,此列表可能包含4个条目:[de-CHdeen-USen]
  • 将资源拆分为单独的mui-dll可能是一个好主意,尽管当所有内容都打包到一个可执行文件中时,它应该可以很好地工作