我使用SHBrowseForFolder API在Windows中顯示文件夾選擇對話框。我的應用程序支持基於最終用戶選擇的UI語言本地化。這是通過使用FindResourceEx API爲特定的LCID加載所有資源來實現的。SHBrowseForFolder具有針對特定語言的本地化
所以我很好奇,有什麼辦法讓SHBrowseForFolder榮譽主題的LCID選擇?或者,以任何其他方式使其顯示基於LCID的我的首選語言的文本?
我使用SHBrowseForFolder API在Windows中顯示文件夾選擇對話框。我的應用程序支持基於最終用戶選擇的UI語言本地化。這是通過使用FindResourceEx API爲特定的LCID加載所有資源來實現的。SHBrowseForFolder具有針對特定語言的本地化
所以我很好奇,有什麼辦法讓SHBrowseForFolder榮譽主題的LCID選擇?或者,以任何其他方式使其顯示基於LCID的我的首選語言的文本?
只是好奇,誰低估了它?你們不關心本地化嗎?我想我found a solution。它在一個單獨的線程上向我建議,它是一個爲MessageBox
API設計的C#項目,但概念是相同的。在使用SetWindowsHookEx(WH_CALLWNDPROCRET)
調用SHBrowseForFolder
之前安裝線程範圍的掛鉤,然後從掛鉤過程中捕獲WM_INITDIALOG
通知。從那裏簡單地加載您的本地化的文本取決於UI語言,並將其設置爲使用SetDlgItemText
的控件,其中hDlg
=窗口句柄,您將進入鉤子程序,並且nIDDlgItem
=需要本地化的按鈕和文本字段的ID。以下是當前使用的:IDOK
=確定按鈕,IDCANCEL
=取消按鈕,0x3746
=「製作新文件夾」按鈕。您也可以通過在窗口句柄上調用SetWindowText
來更改瀏覽窗口本身的標題。然後當SHBrowseForFolder
返回呼叫UnhookWindowsHookEx
從它解除。
這種方法有一些缺點。一個是它依靠MS來保持瀏覽窗口的佈局。到目前爲止,它一直相當。所以你可能想跟蹤Windows版本GetVersionEx
並相應地進行修改。其次,添加新文字後,您可能需要調整按鈕和標籤的大小。但幸運的是,這不是問題。使用DrawText
和DT_CALCRECT
標誌查看新標籤的輪廓,然後使用MoveWindow
更改每個控件的尺寸。請注意,更復雜的方法將涉及瀏覽窗口本身的完整大小。但我會留給你的。
最後,我想說的是,微軟在爲他們的用戶界面本地化提供體面的手段方面如此蹩腳,實在令人遺憾。有一些API,這些API被設計理應做到這一點,僅舉幾例:
SetThreadLocale - 老實說,我不知道到底是什麼它做的,什麼是它的目的。該文件接近於無知。
SetThreadUILanguage - 儘管已經在Windows XP中引入,但該API只能從Windows Vista開始。但是,它仍然只爲所提供的LCID設置了大約80%的用戶界面。例如,SHBrowseForFolder
不受它的影響,但可能會有更多。我沒有檢查其他常見控件。
InitMUILanguage - 我不知道這是什麼。它對我的應用程序沒有任何影響...
setlocale - 僅影響傳統C的東西,如printf
等。儘管它沒有用於UI。
所以,你在這裏。它在技術上沒有任何作用。因此,一個開發人員被迫爲Windows編寫代碼(並且相信我會盡快避免它),他們希望讓最終用戶能夠從程序中更改UI語言,而無需訴諸繁瑣的Windows用戶範圍更改的語言,留下來設計他/她自己的做法。好的微軟!
最後是@HansPassant上面的建議。我無法讓我的用戶支付100美元,只是爲了能夠將我的語言用於我的應用的用戶界面。我很抱歉,但我不能那麼低...
AFAIK,SHBrowseForFolder()
本身不是用戶本地化的。對話框中的哪些文字是你想要準確定位的?你必須提供一個標題,所以你可以提供任何你想要的預定位文本。
您是否試圖本地化按鈕標題或其他控件,也許?您必須使用回調函數來手動訪問和操作對話框控件。
看看切換到IFileOpenDialog
接口。它至少有SetFileNameLabel()
和SetOkButtonLabel()
方法。
在最好的情況下,我希望它的所有UI都能夠本地化。但我明白你的觀點。我可能必須手動完成。謝謝。 – c00000fd
這是一個Windows對話框。您的用戶將無法識別它,它會說出他的語言。如果你需要這個用於本地化的截圖,那麼獲得MSDN或Windows Ultimate的許可證,這樣你就可以獲得語言包。 –
@HansPassant:他們不會遇到麻煩,它看起來很糟糕。說,我的Windows用戶界面語言是英語。最終用戶將我的應用程序的用戶界面更改爲德語,但此對話框仍以英文顯示窗口標題,取消按鈕和新文件夾按鈕。在這種情況下,我需要用德語顯示。 – c00000fd
德國用戶將擁有德語版本的Windows。如果他沒有出於某種奇怪的原因,那麼他會熟悉那種以另一種語言表達的對話,他每天都會使用它。事實上,他會認爲你的看起來很奇怪。 –