|
只用一套源代碼就可以方便地支持多種文字和多個地域,那么這個軟件就可以方便地被翻譯成本地版本,這個過程叫做地域化(Localization)。怎樣才能不修改任何源代碼就使之能動態(tài)地轉(zhuǎn)換到不同的地域資源上呢?那就是使用Windows的程序特性之一--資源。把在軟件中用到的可見資源維系在一個資源DLL(Dynamic Link Library動態(tài)鏈接庫)中,就能使地域化很容易地被實現(xiàn),因為它把具體的文字組件單獨提取放在一個文件中,所以,一個可執(zhí)行文件就可以裝載幾種不同的語言文字,并且選擇用酒程序來裝載適合的文字DLL。創(chuàng)建一個CString對象的實例,并用該字串的資源標識符(string ID)調(diào)用LoadString,即可避免繁瑣的字串編碼工作。[喝小酒的網(wǎng)摘]http://blog./a/1475.htm 在大多數(shù)情況下,資源包含在應用程序的單元中,如果調(diào)用AfxSetResource Handle,就可以指向另一個不同的單元,我下面給出的StateDemo程序就是這樣處理的。調(diào)用AfxSetResource Handle,從DLL資源中采集軟件所需資源,通過替換掉不同語種的DLL資源,程序便可以使用一套完全不同的資源(如String字串、Dialogue對話框、Bmp位圖、Menu菜單等)。 初始情況下,作為主執(zhí)行體的StateDemo不含任何資源。首先,創(chuàng)建一個包含所有英文資源的DLL,在使用這個資源DLL時,應用程序就會以英文形式出現(xiàn),即軟件為英文版;然后,創(chuàng)建中文DLL,再次運行StateDemo程序,程序就以中文形式出現(xiàn)(即使應用程序未被重新編譯)。 I. 應用程序的創(chuàng)建與編譯 (1)創(chuàng)建StateDemo.EXE文件(1)創(chuàng)建StateDemo工作區(qū) 在Microsoft Visual C++ 5.0開發(fā)環(huán)境下,單擊File | New選項,在創(chuàng)建類型選擇框New中選擇MFC AppWizard(exe)、Projectname:StateDemo,創(chuàng)建新項目StateDemo工作區(qū),應用程序類型選擇Multiple Documents,單擊Finish完成工作區(qū)的建立。 (2)添加字串資源 這步實際上是在為英文資源DLL添加字串資源,因為后面將把英文資源StateDemo.rc從項目中移走,并把它拷貝到英文資源的項目中,而不是剛建立的StateDemo.EXE文件項目,執(zhí)行體exe文件會引用這個資源,而字串就在資源DLL中。選擇StateDemo項目資源中的String Table,在StringTable中單擊右鍵選擇New String,添加如下代碼,然后選擇菜單中File | Save All選項即完成。 ID:IDS_MINE=300 //主框架IDS_MINE定義為300,即ID的值為300 Caption(標題):Hi! it's my demo vc5 program of English version. (3)添加CStateDemo類的數(shù)據(jù)成員 本程序要動態(tài)地裝入包含所有資源的DLL,所以必須保存DLL的Handle(句柄),在后面會釋放Handle,并在CStateDemoApp類中添加私有數(shù)據(jù)成員(代碼如下)。 private: HINSTANCE m_hDemoDLL;//資源DLL handle句柄 可以在MS-VC5的DevelopStudio位于左方的Workspace窗口中選擇ClassView標簽,單擊CstateDemoApp類,單擊鼠標右鍵選擇Add Member Variable,然后輸入Type與Declarition,并選擇私有類型。 (4)修改CStateDemoApp::InitInstance函數(shù) 應用程序需裝入包含所有資源的DLL,在本例程序中,英文資源DLL都命名為Resource.dll。把下面的代碼加入初始化函數(shù)InitInstance的頂部。 BOOL CStateDemoApp::InitInstance() { AfxEnableControlContainer(); //Standard initialization //If you are not using these features and wish to reduce the size //of your final executable, you should remove from the following //the specific initialization routines you do not need. //調(diào)入StateDemo資源DLL. m_hDemoDLL=AfxLoadLibrary (_T("Resource.dll")); if(!m_hDemoDLL) //如果Resource.dll文件Handle不存在 { AfxMessageBox(_T("I can't load the resource DLL !")); //沒有找到Resource.dll文件時,彈出消息框發(fā)出警告:I can't load the resource DLL !; //警告消息框如圖2所示 return FALSE; } //告訴應用程序設(shè)置資源句柄m_hDemoDLL; AfxSetResourceHandle(m_hDemoDLL); } (5)使用WizardBar處理CStateDemoApp的ExitInstance函數(shù) 在此需要釋放前面用AfxLoadLibrary裝入的DLL,將下面的代碼添加到函數(shù)ExitInstance中就可達到此目的。選擇菜單View | Class Wizard,在Message Maps的Classname Edit窗口中選擇CstateDemoApp,然后在Messages下找到ExitInstance,選擇Edit Code并加入以下代碼。 int CStateDemoApp::ExitInstance() { //TODO: Add your specialized code here and/or call the base class if(m_hDemoDLL) AfxFreeLibrary(m_hDemoDLL);//釋放DLL資源; retrun CWinApp::ExitInstance(); } (6)修改CStateDemoView::OnDraw 在Multiple-Document類型中顯示不同語種字串和icon等各種資源,在函數(shù)中加入下列代碼。 void CStateDemoView::OnDraw(CDC*pDC) { CStateDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->DrawIcon(10,10,AfxGetApp()->LoadIcon(IDR_MAINFRAME)); //從資源DLL中調(diào)入圖標(ID為IDR_MAINFRAME)并在窗口10,10位置繪制; CString strMessage;//定義strMessage為Cstring字串類型; //從resource DLL中顯示字串; strMessage.LoadString(IDS_DEMO); pDC->TextOut(60,65,strMessage); } (7)從StateDemo Project中移走StateDemo.rc 因需要程序中不含有任何資源,只在Resource.dll中含有資源,所以,要在此項目中移走所有資源,并把它們放進Resource.dll中,但不是刪除,這就是使用MFC的靈活性。具體操作如下:選擇Workspace下的FileView,單擊StateDemo.rc,按鍵盤上Delete鍵刪除,此時所有資源就不在項目中了。 (8)編譯StateDemo項目 開始編譯項目,單擊菜單Build | Execute StateDemo.exe選項,由于此時項目中沒有資源,因此會彈出報錯消息框"I can't load the resource DLL !",如圖2所示,單擊OK,不予理會。 現(xiàn)在,StateDemo項目的執(zhí)行體StateDemo.exe就建成了,它不包含任何資源,而是依靠動態(tài)鏈接庫DLL來提供所有資源。 下面來創(chuàng)建中、英文資源DLL,在這個DLL建立之后,把資源DLL拷回到本項目的Debug或Release目錄中,就可運行該應用程序了。 II. 創(chuàng)建英文資源Resource.dll (1)創(chuàng)建英文新項目區(qū) 在創(chuàng)建類型選擇框New中選擇MFC AppWizard(dll),創(chuàng)建一個英文新項目區(qū),在Location下為工作區(qū)選擇目錄.../StateDemo/即... /StateDemo/English作為該項目區(qū)目錄,單擊OK,在Step1中選擇Regular DLL using MFC DLL,單擊OK即可。 (2)刪除項目中所有文件 剛才建立的DLL已包含了一些資源,但它的各種文件都不需要,所以在Workspace FileView中選中所有文件,按Delete刪除所有文件。 (3)從StateDemo項目中復制英文資源文件 現(xiàn)在要用剛才從StateDemo中移出的英文資源,前面曾把一個資源字串加入到StateDemo.rc文件中,在此,資源字串就起作用了。將... /StateDemo目錄下的StateDemo.rc和Resource.h拷貝到.../Statedemo/English目錄下。目的是把... /StateDemo/res下的所有資源轉(zhuǎn)移到.../StateDemo/English/res目錄下。下面列出需從項目StateDemo中拷貝到項目英文中的所有文件及其注釋。 需要拷貝的文件 注釋 StateDemo.rc 資源文件 resource.h 資源頭文件 res/StateDemo.ico 主程序的圖標 res/StateDemo.rc2 用戶資源描述文件 res/StateDoc.ico 文擋圖標 res/Toolbar.bmp 工具條位圖 (4)將資源文件添加到英文項目中去,使圖標變?yōu)橛⑽馁Y源式樣 把StateDemo.rc加入到英文項目中去,你可以在VC5 Develop Studio的Workspace窗口的File View選項卡中選擇"English"。單擊右鍵選擇Add project to workspace選項,把文件加入項目中。在此,你可以從Resource View選項卡中看到,在最開始的StateDemo項目中加入的字串IDS_DEMO("It's my demo...")現(xiàn)在已被移到了英文項目中,并將成為Resource.dll的一員。 既然這個英文項目是英文資源DLL,并命名為Resource.dll(與后面建立的中文Resource.dll同名,這樣才能使EXE執(zhí)行程序存取雙語或多語種DLL),所以要修改圖標來演示StateDemo.exe被調(diào)入時是英文版的。把IDR_MAINFRAME圖標修改為英文文化特征的,或在Resource View選項卡的圖標一欄單擊右鍵選擇Import來導入你想要的圖標,它可以是16*16,也可以是32*32,本演示程序是使用英國國旗作為IDR_MAINFRAME,以示是英文版的。你可以按自己的需要和風格任意修改在Resource View中的其他資源。 (5)修改鏈接目標程序中的設(shè)置 建立英文資源DLL的任務已經(jīng)基本完成,還需修改DLL程序在Link 前的設(shè)置。選擇Workspace選項卡,選擇Project | Settings選項,在窗口中選擇Link標簽,改變一些Link設(shè)置,將輸出的文件名改為Resource.dll,也就是中英文資源同名的那個英文資源DLL,在鏈接命令Project Options中加入/NOENTRY,它的功能是告訴鏈接器這是一個含有唯一資源的DLL,不包括入口點。圖3顯示了修改過的Link選項卡對話框,注意必須把/NOENTRY選項加進公用項編譯控件中。 至此,英文資源DLL就創(chuàng)建成功了。運行它時,按熱鍵F7鏈接(此時有窗口彈出,讓用戶選擇所要相關(guān)的exe文件,可省去),Resource.DLL就在.../StateDemo/English/Debug目錄下了。如需運行英文版演示程序,則把它拷貝到StateDemo/Debug目錄下,然后運行StateDemo.exe文件,現(xiàn)在就是英文資源起作用了,它顯示英文和英國國旗(如圖4所示)。 III. 創(chuàng)建中文資源Resource.dll (1)創(chuàng)建中文新項目區(qū)并刪除中文項目中所有文件 在創(chuàng)建類型選擇框New中選擇MFC AppWizard(dll),創(chuàng)建一個中文新項目區(qū),在Location下為工作區(qū)選擇目錄.../StateDemo/即... /StateDemo/Chinese作為該項目區(qū)目錄,單擊OK。其他選項如上面創(chuàng)建英文項目區(qū)所述。 剛建立的DLL已包含了一些資源,但它的各種文件在此都不需要。所以,在Workspace FileView中選中所有文件,按Delete刪除所有文件。 (2)拷貝資源文件 仍然使用前面從StateDemo中移出的英文資源,同樣將目錄...StateDemo/下StateDemo.rc和Resource.h拷貝到剛建立的中文資源項目目錄Chinese下,將.../StateDemo目錄下的StateDemo.rc和Resource.h拷貝到... /Statedemo/Chinese目錄下。目的是把.../StateDemo/res下的所有資源轉(zhuǎn)移到... /StateDemo/Chinese/res目錄下,需從項目StateDemo拷貝到項目Chinese的所有文件和注釋也如上述表1所示。 (3)把資源文件添加到中文項目中使圖標變?yōu)橹形馁Y源式樣 把StateDemo.rc 加入到Chinese項目中去,你可以在VC5 Develop Studio的Workspace窗口的File View選項卡中選擇"Chinese",單擊右鍵選擇Add project to workspace選項把文件加入到項目中。在此,StateDemo項目中的字串IDS_DEMO("it's my demo...")已經(jīng)移到中文項目中,并將成為中文Resource.dll的一員?,F(xiàn)在的Resource.dll是中文資源DLL(與前面建立的英文Resource.dll同名),把IDS_DEMO改為中文字串,代碼如下: IDS_DEMO=300, Caption(標題):"你好!這是MS VC5中文演示程序!" 字串修改完成后,需要對菜單進行地域化處理,即把菜單項改為中文。打開Resource View標簽,雙擊Menu項,在右邊工作區(qū)所顯示的MFC標準菜單中把英文翻譯成中文;也可以添加菜單項,按軟件所需作完全個性化的設(shè)計。本演示程序使用中國國旗做IDR_MAINFRAME,以表示是中文版。你還可以按自己的需要和風格任意修改Resource View中的其他資源。 (4)修改中文DLL鏈接目標程序和資源組件中的設(shè)置 中文資源DLL也需要修改DLL程序在Link 前的設(shè)置,其方法與英文的相同:依次選擇Workspace選項卡、Project | Settings菜單、Link選項卡,改變一些Link設(shè)置,將輸出的文件名改為Resource.dll,在鏈接命令Project Options中加入/NOENTRY(參見圖3)。修改資源組件中的設(shè)置,在Project | Settings菜單中的Resource選項卡中,將缺省的文字改為中文(如果是中文Windows,則此處就已經(jīng)是中文了),接下來刪除預處理定義 _AFXDLL,最后在Directory中輸入Visual C++ 5.0安裝目錄1.chs的路徑,這個目錄下裝的是中文特定資源。還有其他資源如/1.fra法語、/1.ita意大利語、/1.kor韓文等,都可以在需要時選擇使用。 刪除預處理定義_AFXDLL并輸入資源的路徑的目的是要包含通用的資源,如果沒有這樣做,則應用程序會從系統(tǒng)安裝的MFC中收集通用的資源。應用程序特定資源會被地域化,通用的MFC資源(諸如光標、打印預覽和通用屬性頁)則不需要。所修改的設(shè)置如圖6所示。 (5)鏈接并運行中文資源DLL 按熱鍵F7進行鏈接,中文資源Resource.DLL就在.../StateDemo/Chinese/Debug目錄下了。要看中文,就把它拷貝到 StateDemo/Debug目錄下,然后再運行StateDemo.exe文件,這時顯示的就是中文版了。所有資源都中文化了,如中國國旗、中文菜單等,起作用的就是剛建立的中文資源Resource.dll,運行結(jié)果如圖7所示。要注意的是,由于中文資源DLL包含了所有通用的MFC資源,所以它比英文要大一些。 至此,兩種資源的DLL都建立好了。在本演示程序中,資源全部被從可執(zhí)行文件中移走并被放入一個DLL中。在MFC類引用任何資源時(比如CString::LoadString),都可以使用當前的資源句柄。通常情況下,當前資源句柄和應用程序的資源句柄是一樣的,但本演示程序通過AfxSetResourceHandle改變了這種情況,該函數(shù)通過傳給AfxSetResourceHandle的句柄使MFC提取所有的資源。當英文的DLL被中文的DLL所取代時,資源ID就訪問定位在中文DLL的資源。由于DLL是從初始的DLL拷貝翻譯過來的,所以,所有的資源應是完整的,只不過是被翻譯成中文罷了。Windows應用程序的資源一般維系在執(zhí)行程序上,當需要時才被裝入。當你的應用程序需要某種資源時,需要給Windows提供兩件東西:應用程序的實例句柄和資源的標識符。 應用程序的多語種安裝 標準軟件安裝程序制作工具Install Shield 5是在Microsoft Visual C++ 5.0 Enterprise Edition中提供的。在所有制作安裝軟件的工具中,它是最專業(yè)、功能最強大的。用Install Shield 5制作一般的實用安裝程序很簡單,只需在生成圖標等很少幾處加入代碼。這里只討論在安裝軟件前識別Windows版本和語言,并按照所基于的操作系統(tǒng)自動選擇你的雙語種或多語種軟件的語言進行安裝。 在Windows操作系統(tǒng)下,微軟提供的Win32資源有很完善的功能。為了獲取當前操作系統(tǒng)的語言版本,可以調(diào)用Win32函數(shù)GetOEMCP(),它的作用是獲取當前操作系統(tǒng)的OEM(Original Equipment Manufacturer源設(shè)備供應商) 代碼頁,其函數(shù)定義如下: UNIT GetOEMCP(VOID)//GetOEMCP(VOID)不帶任何參數(shù); 如果函數(shù)調(diào)用成功,則返回當前系統(tǒng)OEM代碼頁定義的值;如果當前系統(tǒng)沒有OEM代碼頁,則返回用戶定義的默認值。下面列舉了幾個定義的值所代表的意思。 定義的值 代表的意思 936 Chinese (P.R.C , Singapore) 中華人民共和國,新加坡 950 Chinese (Taiwan,HK) 中國臺灣、香港 437 United States 美國 949 Korean 韓國 932 Japan 日本 855 Russian 俄羅斯 安裝在Windows 95或Windows NT平臺下的軟件之前,先要根據(jù)當前系統(tǒng)的語言版本來選擇與該語言版本所對應的動態(tài)鏈接庫DLL,從而生成符合該操作系統(tǒng)版本的軟件。例如,你可以用下面的代碼來判斷當前是否是簡體中文: if(GetOEMCP()==936) { ..... } 注 此外,還有一種方法就是采用AutoRun技術(shù)。如果應用軟件是以光盤為載體,則可以在文件AutoRun上下功夫。AutoRun是一個放在光盤目錄下的文件,當光盤放入光驅(qū)的時候,Windows 95會自動運行它。根據(jù)不同語言版本軟件所需的不同資源DLL文件,用Install Sheld 5制作兩套安裝程序,分別放在各自的目錄下,而且安裝時的SPLASH版權(quán)封面圖片setup.bmp也可以根據(jù)地域的不同而不同,例如把中文大陸國標碼安裝程序放在/GBSetup目錄下,中文BIG5碼安裝程序放在/BIG5Setup目錄下。你可以像上面一樣,在AutoRun.exe中加入如下代碼。 if(GetOEMCP()==936) { ::WinExec(_T("GBSetup/setup.exe"),SW_SHOW); //調(diào)用SDK函數(shù)WinExec執(zhí)行命令行程序setup.exe } if(GetOEMCP()==950) { ::WinExec(_T("BIG5Setup/setup.exe"),SW_SHOW); } 現(xiàn)在就可以自動識別Windows操作系統(tǒng)語言版本而安裝各自相應語言版本的軟件了。在某種情況下,用戶需要更大的自由度,你可以在安裝前彈出窗口,詢問要安裝哪種語言版本。在AutoRun.exe可執(zhí)行文件中,根據(jù)用戶的選擇來調(diào)用各自目錄下的安裝文件進行安裝。 至此,你就可以用本文所講述的內(nèi)容編制自己的雙語或多語種軟件了。在軟件測試完畢并且完成了幫助文件等必需的工作后,再制作一個具有個性的安裝文件,這樣,你的雙語或多語種軟件就誕生了。[喝小酒的網(wǎng)摘]http://blog./a/1475.htm |
|
|