2013-06-18 68 views
0

我使用SHBrowseForFolder API在Windows中顯示文件夾選擇對話框。我的應用程序支持基於最終用戶選擇的UI語言本地化。這是通過使用FindResourceEx API爲特定的LCID加載所有資源來實現的。SHBrowseForFolder具有針對特定語言的本地化

所以我很好奇,有什麼辦法讓SHBrowseForFolder榮譽主題的LCID選擇?或者,以任何其他方式使其顯示基於LCID的我的首選語言的文本?

+0

這是一個Windows對話框。您的用戶將無法識別它,它會說出他的語言。如果你需要這個用於本地化的截圖,那麼獲得MSDN或Windows Ultimate的許可證,這樣你就可以獲得語言包。 –

+1

@HansPassant:他們不會遇到麻煩,它看起來很糟糕。說,我的Windows用戶界面語言是英語。最終用戶將我的應用程序的用戶界面更改爲德語,但此對話框仍以英文顯示窗口標題,取消按鈕和新文件夾按鈕。在這種情況下,我需要用德語顯示。 – c00000fd

+0

德國用戶將擁有德語版本的Windows。如果他沒有出於某種奇怪的原因,那麼他會熟悉那種以另一種語言表達的對話,他每天都會使用它。事實上,他會認爲你的看起來很奇怪。 –

回答

2

只是好奇,誰低估了它?你們不關心本地化嗎?我想我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並相應地進行修改。其次,添加新文字後,您可能需要調整按鈕和標籤的大小。但幸運的是,這不是問題。使用DrawTextDT_CALCRECT標誌查看新標籤的輪廓,然後使用MoveWindow更改每個控件的尺寸。請注意,更復雜的方法將涉及瀏覽窗口本身的完整大小。但我會留給你的。

最後,我想說的是,微軟在爲他們的用戶界面本地化提供體面的手段方面如此蹩腳,實在令人遺憾。有一些API,這些API被設計理應做到這一點,僅舉幾例:

  • SetThreadLocale - 老實說,我不知道到底是什麼它做的,什麼是它的目的。該文件接近於無知。

  • SetThreadUILanguage - 儘管已經在Windows XP中引入,但該API只能從Windows Vista開始。但是,它仍然只爲所提供的LCID設置了大約80%的用戶界面。例如,SHBrowseForFolder不受它的影響,但可能會有更多。我沒有檢查其他常見控件。

  • InitMUILanguage - 我不知道這是什麼。它對我的應用程序沒有任何影響...

  • setlocale - 僅影響傳統C的東西,如printf等。儘管它沒有用於UI。

所以,你在這裏。它在技術上沒有任何作用。因此,一個開發人員被迫爲Windows編寫代碼(並且相信我會盡快避免它),他們希望讓最終用戶能夠從程序中更改UI語言,而無需訴諸繁瑣的Windows用戶範圍更改的語言,留下來設計他/她自己的做法。好的微軟!

最後是@HansPassant上面的建議。我無法讓我的用戶支付100美元,只是爲了能夠將我的語言用於我的應用的用戶界面。我很抱歉,但我不能那麼低...

3

AFAIK,SHBrowseForFolder()本身不是用戶本地化的。對話框中的哪些文字是你想要準確定位的?你必須提供一個標題,所以你可以提供任何你想要的預定位文本。

您是否試圖本地化按鈕標題或其他控件,也許?您必須使用回調函數來手動訪問和操作對話框控件。

看看切換到IFileOpenDialog接口。它至少有SetFileNameLabel()SetOkButtonLabel()方法。

+0

在最好的情況下,我希望它的所有UI都能夠本地化。但我明白你的觀點。我可能必須手動完成。謝謝。 – c00000fd