軟件資源國際化 VC教程_第1頁
軟件資源國際化 VC教程_第2頁
軟件資源國際化 VC教程_第3頁
軟件資源國際化 VC教程_第4頁
軟件資源國際化 VC教程_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、軟件國際化VC+教程1 軟件國際化概述隨著計算機應(yīng)用的普及,應(yīng)用軟件跨國使用越來越頻繁,如何實現(xiàn)應(yīng)用軟件的國際化,成為許多程序員關(guān)心的問題。這種國際化問題相對使用某一種語言的用戶來說,就是本地化問題。本地化的含義比僅僅翻譯菜單欄和對話框的文本內(nèi)容要廣泛得多,如特定文化背景的位圖和圖標對不同的人來說,可能會有不同的含義。在Windows系統(tǒng)中,應(yīng)用程序開發(fā)者可以通過利用VC動態(tài)鏈接庫,只用一套源代碼就能簡潔地支持多種文字。本文介紹用VC的資源動態(tài)鏈接庫解決國際化問題的具體方法和步驟。實現(xiàn)技術(shù):利用VC編程,可以將所有的可見資源封裝在一個資源動態(tài)鏈接庫中,以簡化本地化工作。一般情況下,資源包含在應(yīng)

2、用程序中,但也可以將資源與應(yīng)用程序(即源代碼)分離的方式以確定根據(jù)語言需求加載不同語言版本的資源動態(tài)鏈接庫DLL。當調(diào)用MFC函數(shù)比如 CString:LoadString 或其它 LoadIcon 時,MFC應(yīng)用程序框架首先跟蹤搜索EXE文件的資源,然后才是DLL和MFC的資源,因此在使用純資源DLL時候,必須先人為改變資源的搜索順序,調(diào)用AfxSetResourceHandle函數(shù)完成資源的引用。HINSTANCE m_hLangDLL=:LoadLibrary("AppLanguage.dll");AfxSetResourceHandle(m_hLangDLL);下面

3、主要從兩個典型的Demo實例簡要說明軟件國際化(以中英文為例)的實現(xiàn):1. Demo1項目名:MultiLangDemo1,根據(jù)調(diào)用GetSystemDefaultLangID函數(shù)判斷系統(tǒng)默認語種,以載入相應(yīng)語言的資源動態(tài)鏈接庫實現(xiàn)界面與系統(tǒng)的自動適應(yīng)。2. Demo2項目名:MultiLangDemo2,根據(jù)界面菜單手動選擇語種實現(xiàn)動態(tài)更改語言資源,包括圖標、菜單、狀態(tài)欄,以及顯示不同區(qū)域的數(shù)據(jù)格式。2 實現(xiàn)步驟DEMO1一、創(chuàng)建主工程:1. 運行VC6.0->File->New->Project;選擇MFC AppWizard(exe),在右邊Project Name下輸

4、入項目名MultiLangDemo1,完成(這里以Single Document為例,其他類似)。2. 從項目中移出所有的資源文件,將FileView面板中的MultiLangDemo1.rc,Resource.h,以及Resource Files下的所有文件移出(不是從實際文件目錄中刪除)。注:項目中移出資源文件后,主工程必須要加載外部的語言資源DLL,如果沒有找到或加載失敗的話,程序?qū)o法運行,所以這里也可以選擇不移出,保留程序默認的資源(Demo1中已移出,Demo2中沒有移出)。二、創(chuàng)建中、英文語言版(或其他語言)的資源DLL注: 為統(tǒng)一起見,語言資源DLL名以“主工程名+Res”的格

5、式,不同語言資源以文件夾區(qū)分,如本例中中文資源DLL工程(MultiLangDemo1Res)可以創(chuàng)建在主工程MultiLangDemo1下的CHS文件夾中,英文資源DLL工程(MultiLangDemo1Res)可創(chuàng)建在主工程MultiLangDemo1下的ENG文件夾中。1.運行VC6.0->File->New->Project;選擇MFC AppWizard(dll),在右邊Project Name下輸入項目名MultiLangDemo1Res,下一步選擇 Regular Dll Using share MFC DLL,單擊Finish完成創(chuàng)建。2.刪除該工程下的資源文

6、件:將FileView面板中的MultiLangDemo1Res.rc,Resource.h,以及Resource Files下的所有文件移出,然后也將實際目錄中的文件刪除掉。3.復(fù)制相關(guān)資源文件:將MultiLangDemo1目錄下的MultiLangDemo1.rc,Resource.h文件復(fù)制到MultiLangDemo1Res工程文件目錄下,將 MultiLangDemo1/res 下的所有文件復(fù)制到MultiLangDemo1/res目錄下(當然也可以根據(jù)需要,選擇復(fù)制的文件)。4.將第3步復(fù)制的所有文件添加到項目中去。5如果是創(chuàng)建英文資源dll,應(yīng)將相關(guān)資源改為英文,將支持的語言改

7、為“英語(美國).",在Project菜單 Setting對話框中 Resource 標簽的缺省文字改為"英語(美國).”,同時刪除在Resource標簽下預(yù)處理定義中的"_AFXDLL"。這樣用戶的鏈接庫包含通用的MFC資源; 如果是創(chuàng)建中文資源dll,應(yīng)將相關(guān)資源改為中文,將支持的語言改為“中文(中國)",在Project菜單 Setting對話框中Link標簽Project Options的最后添加”/NOENTRY”。6.最后編譯生成中英文版的動態(tài)鏈接庫,并將DLL放置于主工程可執(zhí)行文件的同級目錄,形式為CHS/MultiLangDem

8、o1Res.dll 和ENG/MultiLangDemo1Res.dll, OK!三、修改主工程:1. 在CMultiLangDemo1App類中添加如下成員變量:private:HINSTANCE m_hLangDLL;構(gòu)造函數(shù)中初始化:CMultiLangDemo1App:CMultiLangDemo1App()m_hLangDLL = NULL;在InitInstance()函數(shù)修改資源加載順序: BOOL CMultiLangDemo1App:InitInstance()AfxEnableControlContainer();CString strTitle =_T("&qu

9、ot;);WORD wLangPID=PRIMARYLANGID(:GetSystemDefaultLangID();switch(wLangPID)/這里是中文環(huán)境選擇了英文的dll庫,只是為了突出效果case LANG_CHINESE:m_hLangDLL=:LoadLibrary("ENG/MultiLangDemo1Res.dll");strTitle=_T("Untitled - MultiLangDemo1");break;case LANG_ENGLISH:m_hLangDLL=:LoadLibrary("CHS/MultiLan

10、gDemo1Res.dll");strTitle=_T("無標題 - MultiLangDemo1");break;if(!m_hLangDLL)AfxMessageBox(_T("無法裝載資源鏈接庫!") ;return FALSE ;AfxSetResourceHandle(m_hLangDLL); /更改標題欄,dll資源中沒有該項,只有手動更改 m_pMainWnd->SetWindowText(strTitle);別忘了ExitInstance()函數(shù)釋放掉加載的dll資源 int CMultilanguageApp:ExitI

11、nstance()if(m_hLangDLL)AfxFreeLibrary(m_hLangDLL);return CWinApp:ExitInstance();最后編譯運行!如下圖為中英文版本的實現(xiàn)界面:DEMO2Demo2項目創(chuàng)建的前兩步(即主工程與中、英文語言版資源DLL的創(chuàng)建)與Demo1一樣(只是主工程的資源文件未移出),項目名為MultiLangDemo2,在第三步修改主工程方面有些差異:修改主工程:1首先在中文dll和英文dll中分別增加菜單項:語言(Language),下拉菜單中文(Chinese)和英文(English),下拉菜單ID分別為:ID_LANGUAGE_CHINES

12、E、ID_LANGUAGE_ENGLISH(確保同一ID,Value值一樣)。如下圖所示:并分別添加各自的菜單響應(yīng)函數(shù)OnLanguageEnglish和OnLanguageChinese,void CMainFrame:OnLanguageChinese() / TODO: Add your command handler code hereSetLanguage(Chinese);void CMainFrame:OnLanguageEnglish() / TODO: Add your command handler code hereSetLanguage(English);2.在類CMa

13、inFrame頭文件中定義如下:private:CMenu *m_pMenuNew;enum LANGUAGESChinese,English;HINSTANCE m_hInstChinese, m_hInstEnglish;LANGUAGES m_nLanguage;public:void GetDate(CString& strDate);private:void SetLanguage(LANGUAGES nLanguage);實現(xiàn)文件中,SetLanguage函數(shù)完成資源庫的加載:void CMainFrame:SetLanguage(LANGUAGES nLanguage)C

14、String strBuffer = _T("");HINSTANCE hInst = NULL;LCID lcid = NULL;m_nLanguage = nLanguage;switch(nLanguage)case Chinese:if(!m_hInstChinese)/加載CHS文件夾下的語言資源庫m_hInstChinese = LoadLibrary(_T("CHS/MultiLangDemo2Res.dll");/根據(jù)語種設(shè)置窗口標題(CMultiLangDemo2Doc*)GetActiveDocument()->SetTitle

15、("無標題");hInst = m_hInstChinese;break;case English:if(!m_hInstEnglish)m_hInstEnglish = LoadLibrary(_T("ENG/MultiLangDemo2Res.dll");(CMultiLangDemo2Doc*)GetActiveDocument()->SetTitle("Untitled");hInst = m_hInstEnglish;break;if(hInst)AfxSetResourceHandle(hInst);elseAfxM

16、essageBox("加載語言庫失敗");/設(shè)置菜單CMenu *pMenuCurrent = GetMenu();m_pMenuNew = new CMenu;if (pMenuCurrent->m_hMenu != m_hMenuDefault)pMenuCurrent->DestroyMenu();delete pMenuCurrent;m_pMenuNew->LoadMenu(IDR_MAINFRAME);SetMenu(m_pMenuNew);/設(shè)置狀態(tài)欄strBuffer.LoadString(AFX_IDS_IDLEMESSAGE);/就緒

17、| readym_wndStatusBar.SetPaneText(0,strBuffer);m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT);m_hAccelTable = NULL;if(!LoadAccelTable(MAKEINTRESOURCE(IDR_MAINFRAME)AfxMessageBox("LoadAccelTable(MAKEINTRESOURCE(IDR_MAINFRAME) failure");/設(shè)置位圖HICON m_hIcon = AfxGetApp

18、()->LoadIcon(IDR_MAINFRAME);SetIcon(m_hIcon,TRUE);Invalidate();3. SetLanguage函數(shù)后,將引發(fā)重繪。void CMultiLangDemo2View:OnPaint() CPaintDC dc(this); / device context for paintingCMainFrame* pFrame = (CMainFrame *) AfxGetApp()->m_pMainWnd;CStringstrBuffer= _T("");/IDS_LANG_STRING為dll資源中的字符串,注意不同dll的IDS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論