5

文档SetThreadUILanguage声明:

Windows XP:应用程序只能将此参数设置为 0。此设置会使函数选择最支持控制台显示的语言。有关详细信息,请参阅备注部分。

它后来继续(相当隐藏在段落中间):

(...) Windows XP 不支持与线程语言环境分离的线程用户界面语言的概念。因此,此函数会更改 Windows XP 上的线程区域设置。(...)

这实际上似乎是发生了什么,也就是说,SetThreadUILanguage在 Windows XP 上调用似乎等于调用SetThreadLocale,而在 Vista+ 上它似乎导致与调用基本相同的事情SetThreadPreferredUILanguages(这在 XP 上根本不可用)。

文档对我来说很清楚,所以我的基本问题可能是:我是否应该调用SetThreadUILanguageWindows XP 来更改(首选)UI 语言,这是否正确记录在某处,在 Windows 7 上,我应该调用这个功能,还是我应该打电话SetThreadPreferredUILanguages

4

1 回答 1

4

我知道这是一个旧线程,但我很好奇您是否找到了解决方案?我正在处理同样的问题,我完全被微软的文档弄糊涂了。这是我到目前为止所学到的:

1SetThreadLocale基本没用。我不确定它到底是做什么的。这里的MSDN页面首先说明了这一点:

SetThreadLocale 通过 LANGUAGE 语句影响资源的选择。该语句影响 CreateDialog、DialogBox、LoadMenu、LoadString 和 FindResource 等函数。它设置 CP_THREAD_ACP 隐含的代码页,但不影响 FindResourceEx。

好的。我明白这部分。但是它有这个“宝石”:

Windows Vista 和更高版本:不要使用 SetThreadLocale 选择用户界面语言。

现在它是纯粹的微软 :) 那么上面这段中的所有废话到底是什么?

2SetThreadUILanguage仅适用于 Vista 和更高版本的操作系统。在 XP 上它几乎什么也没做,所以除非你想错过大量仍然坚持使用 XP 的用户,否则这个 API 现在也没什么用。(不过,它似乎可以在 Vista 和更高版本的操作系统上自行完成这项工作。)

3SetThreadPreferredUILanguages仅适用于 Vista 和更高版本的操作系统,所以我们要回到缺乏 XP 支持的问题上。据我了解,如果您在资源中包含一堆语言,请说这三种:美式英语、法语、德语。当资源加载器加载它时,比如说,在瑞士,一个愚蠢的微软加载器会默认选择美国英语。所以这个 API 告诉它使用什么语言。(我知道,完全多余,但是,嘿,记住,我们正在与微软打交道。)

我似乎无法解决的问题是如何在 XP 中定义 UI 语言。可以FindResourceEx用于字符串和对话框(使用CreateDialogIndirect),但是文件打开/保存对话框或GetOpenFileName属性表或CPropertySheet

所以我很好奇你是怎么处理的?

于 2013-06-07T00:35:34.157 回答