【问题标题】:How does MFC determine the default language ID when loading resources?MFC在加载资源时如何确定默认语言ID?
【发布时间】: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


【解决方案1】:
  • 请检查哪些资源实际打包到您的可执行文件中。您可以使用 Explorer's Suite 或其他资源编辑器之类的工具。
  • 在 Windows Vista 和更新的资源加载顺序由您可以使用 GetThreadPreferredUILanguages family of functions 获得的首选语言列表确定(对于用户、进程和线程有一个单独的列表,它们组合起来执行资源查找)。 MFC 运行时可能会更改它,但我不确定。在您的系统上,此列表可能包含 4 个条目:[de-CHdeen-USen]。
  • 将资源拆分为单独的 mui dll 可能是一个好主意,尽管将所有内容打包到一个可执行文件中时它应该可以正常工作。

【讨论】:

  • 当我使用GetThreadPreferredUILanguages 检查默认语言列表时,我得到“de-DE”。这就解释了为什么我的瑞士德语资源默认不会加载。我还不知道 Windows 是如何认为“de-DE”是正确的语言环境,但这是另一个话题。最后,当我使用SetThreadPreferredUILanguages 将语言显式设置为“de-CH”时,我的瑞士德语测试字符串资源已加载,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多