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

时间:2017-10-16 16:48:00

标签: c++ visual-c++ mfc

我有一个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仍坚持加载美国英语字符串。
  • 我已经在项目中搜索了与语言相关的任何代码,但没有任何内容。该项目是一个简单的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);

1 个答案:

答案 0 :(得分:2)

  • 请检查哪些资源实际打包到您的可执行文件中。您可以使用资源管理器套件或其他资源编辑器。
  • 在Windows Vista上,较新的资源加载顺序取决于您可以使用GetThreadPreferredUILanguages family of functions获取的首选语言列表(对于用户,进程和线程有一个单独的列表,用于执行资源查找)。可能它可能会被MFC运行时改变,但我不确定。在您的系统上,此列表可能包含4个条目:[de-CHdeen-USen]。
  • 将资源拆分为单独的mui dll可能是一个好主意,尽管当所有内容都打包到一个可执行文件中时它应该可以正常工作。