在Windows XP和Vista上设置Thread UI语言?

时间:2013-04-27 11:30:47

标签: winapi visual-c++ localization locale embedded-resource

docs for SetThreadUILanguage表示:

  

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

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

  

(...)Windows XP不支持线程用户界面的概念   语言与线程区域设置分开。因此,此功能会发生变化   Windows XP上的线程区域设置。 (...)

事实上这似乎就是发生了什么,也就是说,在Windows XP上调用SetThreadUILanguage似乎相当于调用SetThreadLocale,而在Vista +上它似乎与调用基本相同SetThreadPreferredUILanguages(根本不在XP上提供)。

文档对我来说很明显,所以我的基本问题可能是:我是否应该在Windows XP上调用SetThreadUILanguage来更改(首选)用户界面,并在Windows上正确记录,并在Windows上7,我应该完全调用这个函数,还是应该调用SetThreadPreferredUILanguages

1 个答案:

答案 0 :(得分:4)

我知道这是一个老线程,但我很好奇你是否找到了解决方案?我正在处理同样的问题,我对微软的文档感到非常困惑。这是我到目前为止所学到的:

1 SetThreadLocale几乎没用。我真的不确定它到底做了什么。 MSDN page here首先声明:

  

SetThreadLocale会影响使用LANGUAGE选择资源   声明。该语句影响CreateDialog等函数,   DialogBox,LoadMenu,LoadString和FindResource。它设置代码   CP_THREAD_ACP隐含的页面,但不影响FindResourceEx。

行。我得到这个部分。但它有这个“宝石”:

  

Windows Vista及更高版本:请勿使用SetThreadLocale选择用户   界面语言。

现在它是纯粹的微软:)那么上面段落中的所有羞辱是什么?

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

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

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

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