我使用SHBrowseForFolder API在Windows中显示文件夹选择对话框。我的应用程序支持基于最终用户选择的UI语言本地化。这是通过使用FindResourceEx API为特定LCID加载所有资源来实现的。
所以我很好奇,有没有办法让SHBrowseForFolder荣誉线程的LCID选择?或者,以任何其他方式使其显示基于LCID的首选语言的文本?
答案 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版本并进行相应调整。
其次,添加新文本后,您可能需要调整按钮和标签的大小。但幸运的是,这不是问题。将DrawText
与DT_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。对不起,但我不能摔倒......