隨著貿(mào)易國際化,在軟件開發(fā)過程中,常會碰到需在現(xiàn)有中文版軟件加入多語言支持的情況。由于不同語言版本間的差別通常僅是軟件操作界面的不同,為實(shí)現(xiàn)多語言支持,使用純資源DLL是一個(gè)不錯(cuò)的解決之道。所謂純資源DLL是指只包含資源的DLL,譬如:快捷鍵、對話框、字符串、菜單、工具條、位圖、圖標(biāo)、版本信息等等。
具體做法是:利用VC可視化編輯環(huán)境為每種語言制作一套資源ID一一對應(yīng)的資源集并編譯生成DLL文件。應(yīng)用程序初始化時(shí)按預(yù)設(shè)的語言設(shè)置選擇合適的資源DLL調(diào)入,使用資源時(shí)依據(jù)資源ID進(jìn)行訪問,這樣即可實(shí)現(xiàn)軟件的多語言支持。當(dāng)然了,應(yīng)用程序退出前,注意將動態(tài)調(diào)入的DLL文件占用的資源釋放。
現(xiàn)有一個(gè)心電圖查看程序,工程名為DispECG,語言為中文,現(xiàn)需加入英文支持。下面根據(jù)這個(gè)具體實(shí)例來說明在VC中加入多語言支持的具體實(shí)施方法。
(一)建立純資源DLL
a)打開DispECG工程,在當(dāng)前工作區(qū)中添加一個(gè)工程。方法:使用菜單File\New…
b)從彈出的對話框中選擇“Projects”頁面,選擇“Win32 Dynamic-Link Library”,工程名設(shè)置為“DispECG_ENG”,DispECG工程的工作目錄為D:\MyProject\DispECG,DispECG_ENG工程的工作目錄為D:\MyProject\DispECG\DispECG_ENG。選擇添加到當(dāng)前工作區(qū)(注意Dependency of前的框不選),然后按OK。
c)建立一個(gè)簡單的DLL工程
選擇“A simple DLL project”,然后按“Finish”。此時(shí)新建的DispECG_ENG工程中會建立如下幾個(gè)文件:DispECG_ENG.cpp,StdAfx.cpp,StdAfx.h以及ReadMe.txt。注意沒有后綴為*.RC的資源文件。
其中DispECG_ENG.cpp中文件內(nèi)容如下:
(二)為DispECG_ENG加入資源并編輯
a)使用Windows資源管理器將DispECG工程下的resource.h和DispECG.rc拷貝到DispECG_ENG工程下,將DispECG工程下的res子目錄拷貝到DispECG工程下;
b)使用Windows資源管理器將DispECG_ENG工程下的DispECG.rc改名為DispECG_ENG.rc,將DispECG_ENG\res下的DispECG.rc2改名為DispECG_ENG.rc2;
c)回到VC編輯環(huán)境。選擇工作區(qū)中的文件視(FileView),選擇“DispECG_ENG files”,單擊右鍵,選擇“Add Files to Project…”將DispECG_ENG工程下的resource.h和DispECG_ENG.rc加入到DispECG_ENG工程。
資源文件DispECG_ENG.rc及資源ID定義文件resource.h加入工程后:
d)修改編輯resource.h和DispECG_ENG.rc
需要說明的是:MFC中含有一些預(yù)定義好的資源,不同的語言版本保存在不同的目錄下,英文版保存在MFC\Include下,其它語言的版本則保存在Include的子目錄中,譬如中文版對應(yīng)的目錄為l.chs,日文版對應(yīng)l.jpn,韓文版對應(yīng)l.kor,等等。
e)使用可視化編輯環(huán)境編輯對話框、菜單、字符串、版本等語言依賴性資源,將中文版翻譯為英文版。當(dāng)然,如果對資源文件的結(jié)構(gòu)非常了解,可使用文本編輯器對資源文件直接編輯。方法是:使用“File\Open…”打開文件對化框,找到“DispECG_ENG.rc”,注意打開方式選擇“Text”。
完成文本的翻譯是一項(xiàng)費(fèi)時(shí)耗力的體力活兒,請耐心地仔細(xì)地一一做完。
f)修改工程設(shè)置,調(diào)整編譯后DLL文件的存放位置。
由于按照默認(rèn)的工程設(shè)置,DispECG_ENG.DLL的Release版自動生成在D:\My Project\DispECG\DispECG_ENG\Release下,Debug版自動生成在D:\My Project\DispECG\DispECG_ENG\Debug下。為了程序的處理方便,資源DLL最好和應(yīng)用程序的可執(zhí)行文件存放在同一目錄。為做到這一點(diǎn),請修改工程配置。
方法:操作菜單“Project\Project Settings…”
在“Project Settings”中選擇“DispECG_ENG”工程,再選擇“Link”頁面,將輸出文件名由“Release/DispECG_ENG.dll”修改為“../Release/DispECG_ENG.dll”,這樣編譯后生成的DLL文件將保存在D:\My Project\DispECG\Release下。
調(diào)試版也作類似的修改,使得編譯后生成的DLL文件將保存在D:\My Project\DispECG\Debug下。
g)編譯DispECG_ENG工程,生成發(fā)行版和調(diào)試版的DispECG_ENG.DLL。
(三)在程序中添加多語言支持程序
a) 定義資源名稱
在DispECG工程中的StdAfx.h中添加:
b)定義兩個(gè)全局變量,一個(gè)表示當(dāng)前的語言選擇,另一個(gè)為資源句柄。
c)添加資源DLL載入程序
在完成應(yīng)用程序初始化的BOOL CDispECGApp::InitInstance()中添加依據(jù)語言選擇資源DLL的程序代碼。
d)添加資源DLL卸載程序
e) 添加語言選擇菜單和命令實(shí)現(xiàn)代碼。
同步更新各種版本的資源,編輯菜單加入語言選擇菜單項(xiàng)。注意同一菜單項(xiàng)不同語言版本的命令I(lǐng)D保持一致。
使用類向?qū)砑用铐憫?yīng):
(四)修改程序代碼,根據(jù)資源ID調(diào)用資源
如果原先的程序未考慮到多語言支持,在顯示提示信息時(shí)可能使用如下的語句:
此時(shí)應(yīng)該將諸如"文件無法打開!"此類的字符串添加到字符串資源中,其它語言版本同步更新。同樣,注意字符串ID的彼此一致。一個(gè)好的習(xí)慣是,各版本的資源同步更新后,使用VC開發(fā)環(huán)境自帶的WinDiff.exe對各個(gè)版本下的resource.h進(jìn)行文件內(nèi)容比較,以確保各語言的資源ID彼此完全一致。
修改完畢后,改用根據(jù)資源ID進(jìn)行資源訪問的函數(shù)。在實(shí)際編程中,最常用到的是對字符串資源的訪問以及提示信息的顯示,所以下面這些函數(shù)在需多語言支持的應(yīng)用程序中會常被使用:
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );
BOOL LoadString( UINT nID );
void Format( UINT nFormatID, ... );
void FormatMessage( UINT nFormatID, ... );
...
至于其它資源,比如對話框、菜單等,通常由系統(tǒng)自動完成加載,無需程序員在軟件中進(jìn)行特別處理。
(五)編譯調(diào)試