實現思想:
傳統的做法是把所有的資源都放到動態庫中,一種語言一個動態庫,程序運行的時候通過加載不同的動態庫來實現多語言功能。這樣做的缺點是不能動態切換語言,如果更換語言後必須重新啟動軟件。當然,沒有人會需要經常的切換語言玩兒,但是采用動態庫的方法,如果程序需要修改資源的話,就要更新所有的動態庫,這是一個非常枯燥而且容易出現疏漏的工作。
我的方法是把所有用到的字符串都放到文件中,一種語言一個文件,根據選擇的語言到對應的文件中去加載字符串。這樣不但可以動態切換語言,而且用戶可以根據需要自己添加新的語言。
具體實現:
1、程序啟動時檢查所選擇的語言,確定該語言文件,保存該文件路徑
2、提供一個全局函數,如 g_LoadString(CString szID),根據提供的字符串ID返回
其內容,具體是哪個語言的在函數中判斷,這樣在程序中只要提供一個字符串ID就可以自動
加載不同語言的文字了。
3、如何在程序中使用:
原來代碼:
CString str;
改動後:
str = "語言";CString str;
4、對話框中如何實現
str = g_LoadString("IDS_LANGUAGE");
如果像在程序中使用一樣,每一個字符串都要去加載一次的話,如果對話框比較多,工作量可就太大了。
所以我提供了一個函數g_SetDialogStrings(CDialog *pDlg,UINT uDlgID),每個對話框在初始化的時候調 用該函數,傳遞對話框的指針,我在函數中循環枚舉所有的子控件,逐個設置文字。這樣就可以省去很多工作
注意:由於靜態文本(CStatic)默認的ID是IDC_STATIC,值都是65535,無法區分,所以在需要改變其文字的CStatic的ID要改一改,不能用默認的
5、語言文件樣例:
中文版:
[Setting]
英文版:
Language=Chinese
[String]
IDS_MENU_FILE=文件
IDS_MENU_FILE_NEW=新建(&N)
IDS_MENU_FILE_OPEN=打開(&O)
IDS_MENU_FILE_CLOSE=關閉(&C)
IDS_MENU_FILE_EXIT=退出(&E)[Setting]
Language=English
[String]
IDS_MENU_FILE=File
IDS_MENU_FILE_NEW=&New
IDS_MENU_FILE_OPEN=&Open
IDS_MENU_FILE_CLOSE=&Close
IDS_MENU_FILE_EXIT=&Exit
本文配套源碼