SHBrowseForFolder具有特定语言的本地化

时间:2013-06-18 20:17:56

标签: c++ winapi localization windows-shell

我使用SHBrowseForFolder API在Windows中显示文件夹选择对话框。我的应用程序支持基于最终用户选择的UI语言本地化。这是通过使用FindResourceEx API为特定LCID加载所有资源来实现的。

所以我很好奇,有没有办法让SHBrowseForFolder荣誉线程的LCID选择?或者,以任何其他方式使其显示基于LCID的首选语言的文本?

2 个答案:

答案 0 :(得分:3)

AFAIK,SHBrowseForFolder()本身不是用户可本地化的。对话框中的哪些文本您要尝试本地化?您必须为其提供标题,以便您可以提供所需的任何预先本地化的文本。

您是否尝试本地化按钮标题或其他控件?您必须使用回调功能来手动访问和操作对话框控件。

看看切换到IFileOpenDialog界面。它至少有SetFileNameLabel()SetOkButtonLabel()方法。

答案 1 :(得分:2)

只是好奇,谁在贬低它?你们不关心本地化吗?

尽管如此,我认为我found a solution。它是在一个单独的线程上向我建议的,它是为MessageBox API设计的C#项目,但概念是相同的。在使用SHBrowseForFolder调用SetWindowsHookEx(WH_CALLWNDPROCRET)之前安装线程范围的挂钩,然后从挂钩过程中捕获WM_INITDIALOG通知。从那里只需根据UI语言加载本地化文本,并使用SetDlgItemText将其设置为控件,其中hDlg =挂钩程序中的窗口句柄和nIDDlgItem =按钮ID和需要本地化的文本字段。以下是当前使用的:IDOK =确定按钮,IDCANCEL =取消按钮,0x3746 =“创建新文件夹”按钮。您还可以通过调用窗口句柄上的SetWindowText来更改浏览窗口的标题。然后当SHBrowseForFolder返回时调用UnhookWindowsHookEx取消挂钩。

这种方法有一些缺点。一个是它依赖于MS来保持浏览窗口的布局。到目前为止它已经相对相同了。因此,您可能希望使用GetVersionEx跟踪Windows版本并进行相应调整。

其次,添加新文本后,您可能需要调整按钮和标签的大小。但幸运的是,这不是问题。将DrawTextDT_CALCRECT标记一起使用可查看新标签的轮廓,然后使用MoveWindow更改每个控件的大小。请注意,更复杂的方法将涉及完全调整浏览窗口本身的大小。但是我会把它留给你。

最后,我想说,微软在证明其UI的本地化方式方面如此蹩脚,这是一种耻辱。有些API据说是为了做到这一点而设计的,仅举几例:

  • SetThreadLocale - 老实说,我不知道它究竟是做什么的,它的目的是什么。文件接近于愚蠢。

  • SetThreadUILanguage - 尽管已经在Windows XP中引入,但这个API只能从Windows Vista开始。但是,它仍然只为提供的LCID设置了大约80%的UI。例如,SHBrowseForFolder不受其影响,但可能会有更多。我没有检查其他常用控件。

  • InitMUILanguage - 我不知道这件事是做什么的。它对我的应用程序没有任何影响......

  • setlocale - 仅影响printf之类的遗留C等内容。但它们都没有用于UI。

所以你走了。它们在技术上都不起作用。因此,开发人员不得不为Windows编写(并相信我,我会尽快避免使用),他们希望为最终用户提供从程序中更改UI语言的能力,而无需在Windows用户范围内进行繁琐的更改这种语言,只是设计他/她自己的方式。好好的微软!

最后,@HansPassant建议如上所述。我不能让我的用户支付100美元+只是为了能够将他们的语言用于我的应用程序的UI。对不起,但我不能摔倒......