在VC 5.0中實現基於MFC的組件的本地化

轉自:http://www.vckbase.com/article/cpp_mfc/0007.htm
浙江大學計算機系344信箱(310027) 鄭傑
    Visual C++(以下簡稱VC)是微軟公司的Visual 系列軟件開發工具之一。對非英語地區的程序員,不可避免地要解決軟件的本地化問題。VC 本身就支持多語種編程,給本地化帶來了極大的方便。這裏我們主要討論基於 MFC 的組件的本地化。


要實現那些使用 MFC 的組件的本地化,需要解決下面兩個問題。
    第一問題是,要實現組件本身的一些特殊資源的本地化,例如字符串、對話框等等。由於大多數在 MFC 基礎上構架的組件也包含和使用了一部分由 MFC 定義的資源,所以必須同時本地化這些 MFC 資源。幸運的是,MFC 本身已提供了多種語言的本地化版本,它們包括:漢語、德語、西班牙語、法語、意大利語、日語和韓國語。存在於VC光盤中相應的 \DevStudi\ VC\MFC\[src|include]\l.xxx\ 目錄下," l "代表"本地化"的意思,"l.chs"即代表簡體中文。將這些目錄下的 *.rc 文件拷入硬盤中相應的目錄即可。當應用程序與MFC之間採用靜態鏈接的模式時應採用該方法,但它只在VC 5.0的專業版與企業版中才支持。
    大多數的應用程序與MFC之間採用動態鏈接的方式,這時在Win95的system目錄下必須有相應的MFC 資源 DLL 文件的本地版本——MFC4xLOC.DLL(Pwin95 OEMSR2版本提供的是MFC0 LOC.DLL)。將VC光盤的目錄 \DevStudio\VC\Redist 中的文件:MFC42xxx.DLL 拷貝入Pwi95 的system目錄下,並更名爲:MFC42LOC.DLL即可(其中MFC42CHS.DLL即代表簡體中文版的資源 DLL 文件)。拷入前除了要解決同名DLL相覆蓋的版本問題外,還應注意以下兩方面的內容:
    首先,不應該在英文版的系統(如英文 Win95)上安裝 MFC4xLOC.DLL。因爲英文版的資源文件代碼已內建於MFC4x.DLL 中,應用程序從MFC4x.DLL 中載入代碼的速度比從 MFC4XLOCD LL 中先搜尋再載入代碼的速度要快得多。
    其次,由於有多個版本的 MFC4xLOC.DLL ,在VC光盤的目錄 \DevStudio\VC\Redist 中可同時找到如: MFC4xCHS.DLL——簡體中文版本、MFC4xDEU.DLL——德國版本、MFC4xESP.LL——意大利版本等等。
所以在安裝之前,應先確定所安裝的MFC4xLOC.DLL 的本地版本代號與所使用的Window 系統是否相一致,例如:只有MFC42CHS.DLL 才能安裝在 Pwin95 的系統上。
    需要指出的是,以上的方法會給應用程序的安裝帶來一定的複雜性,因爲用戶的系統下可能會安裝多種本地化版本的應用程序。例如:支持簡體中文;後來又裝了一個日文版的軟件而鏈接庫文件MFC4xLOC.DLL 只有一個,若後者覆蓋了前者,應用程序運行時就會發生資源鏈接出錯。所以我們建議採用另一種方法,即建立自己的本地版本的MFC 資源 DLL 文件,而不是直接調用MFC4xLOC.DLL 文件,該方法後面會繼續分析。


處理代碼
    第二個問題是,應處理好各組件本地化資源的代碼,使之能良好地運行於目標環境。大多數情況下,這依賴於應用程序對字節的高位及雙字節字符的處理能力。在缺省情況下,MFC對它們直接支持。
    所以,本地化應用程序和DLL實質上只需用本地語言改寫相應的資源即可。如果C++源代碼中不帶有需要本地化的字符串或正文,那麼只需對資源文件作修改。實際上,用戶可以實現自己的組件,這樣無須重建原始代碼即可獲得本地版本。這或許很複雜,但很值得,MFC本身也採用這種技術。可打開資源文件編輯器直接用本地語言進行編輯,但這樣每次版本的升級都需對應用程序進行重建。
注意:VC 4.0或以後的版本直接支持多種語言的.RC文件。
    避免這樣做的一種方法就是建立一個分離的DLL並對其進行本地化,該 DLL 有時也叫做"衛星式 DLL"。在程序運行期間它將被動態地進行鏈接,此時資源將從這個"衛星式 DLL"載入,而不是從代碼的主模塊載入。MFC 直接支持這種方法,MFC4xLOC.DLL 本身就是一個本地化的"衛星式 DLL",只不過是在缺省狀況下是由 MFC 提供的。我們可以建立一個自己的"衛星式 DLL",如有一名爲MYAPP.EXE 的應用程序,它的所有資源全來源於一個叫做 MYRES.DLL 的文件。這些都在其應用程序的InitInstance 事件中完成,如下所示:
CMyApp::InitInstance()
{
// 初始化代碼的開始部分
HINSTANCE hInst = LoadLibrary("myres.dll");
if (hInst != NULL)
AfxSetResourceHandle(hInst);
// 以下是其它初始化代碼
.
.
.
}
    這段代碼執行後,MFC 將從 MYRES.DLL 中載入資源,而不是直接從 MYAPP.EXE 中載入。
建立一個單一的資源DLL文件並不難。先建立一個 DLL 項目文件,並加入.RC文件和其他必要的資源,然後在鏈接器(Linker)的參數裏增加一個 "/NOENTRY"參數即可。這個參數告訴鏈接器該 DLL 沒有接入點,因爲資源 DLL 文件沒有代碼。
    另外,若應用程序以 Win32 Release 的方式建立(即EXE 文件中不嵌入調試代碼),則還需完成以下步驟。在工程文件裏,打開菜單 Projects/settings... ,分別選中c/c++ 頁和R esources頁,將其中的參數[ /D "_AFXDLL"]去掉(它一般由 AppWizard 自動生成)。該參數指定只從 MFC 的共享 DLL 文件中載入資源,而並不定義其他的資源來源,這樣用戶自己建立的資源 DLL 文件將不起作用。
    最後,由於AppWizard 是VC++的一大特色,VC++ 允許在使用AppWizard 創建基於MFC的應用程序框架時就可以選擇不同的語言,直接生成本地化的程序框架。其中日文、韓文與簡體中文,由於需要支持雙字節版本的操作系統,所以在缺省情況下,與這三種遠東語言相對應的MFC AppWizard DLLs並沒有被VC 5.0的安裝程序裝入硬盤。因此,在應用程序生成嚮導的第一頁下拉式列表框中,找不到這些語言條目,但可以在VC光盤的\DevStudio\SharedIDE\Bi\ IDE 目錄中找到:
語言 AppWizard DLL
-----------------------------------
日文 ---- APPWZJPN.DLL
韓文 ---- APPWZKOR.DLL
簡體中文 ---- APPWZCHS.DLL
    在簡體中文Pwin95下,只需將相應的APPWZCHS.DLL 文件從VC光盤拷貝入硬盤的 \DevSudio\SharedIDE\Bin\IDE 目錄下即可。這時,"簡體中文"這一條目就會出現在應用程序生成嚮導的第一頁下拉式列表框中, 這樣,AppWizard 生成的應用程序框架將自動包含簡體中文的菜單、標題、狀態欄等。我們將框架程序編譯鏈接,運行後將會看到一個漂亮的全中文界面。
    所以,用VC製作簡體中文的軟件非常方便,感興趣的朋友可以繼續查看VC幫助系統,以獲得更多的信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章