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

C++ 在加载资源时,MFC如何确定默认语言ID?,c++,visual-c++,mfc,C++,Visual C++,Mfc,我有一个MFC项目,它包含一个.rc文件(美国英语)和一个.rc文件(瑞士德语)。这两个.rc文件完全相同,除了1)我用于测试的单个字符串和2)顶部的.rc文件使用不同的语言语句: LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US >>> for US English LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_SWISS >>> for Swiss German 我将包含单个主.rc

我有一个MFC项目,它包含一个.rc文件(美国英语)和一个.rc文件(瑞士德语)。这两个.rc文件完全相同,除了1)我用于测试的单个字符串和2)顶部的.rc文件使用不同的
语言
语句:

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条目时,默认的加载字符串成功加载瑞士德语测试字符串。我的结论是,如果存在,美国英语资源优先于瑞士德语资源
  • 我尝试将线程区域设置设置为瑞士德语(本文末尾的代码片段),但没有成功。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和更高版本上,资源加载顺序由您可以使用的首选语言列表决定(用户、进程和线程有一个单独的列表,它们组合起来执行资源查找)。它可能会被MFC运行时修改,但我不确定。在您的系统上,此列表可能包含4个条目:[code>de-CH,
    de
    en-US
    en
    ]
  • 将资源拆分为单独的mui DLL可能是一个好主意,但当所有内容都打包到一个可执行文件中时,它应该工作得非常好

您的操作系统是什么语言?@ZDF操作系统是德语,Visual Studio是英语。当我从Visual Studio外部启动测试应用程序时,问题仍然存在。当我使用
GetThreadPreferredUILanguages
检查默认语言列表时,我得到“de de”。这就解释了为什么我的瑞士-德国资源在默认情况下从不加载。我还不知道Windows是如何理解“de de”是正确的语言环境的,但这是另一个主题。最后,当我使用
SetThreadPreferredUILanguages
显式地将语言设置为“de CH”时,我的瑞士德语测试字符串资源被加载,一切都按预期工作。