




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、軟件國(guó)際化VC+教程1 軟件國(guó)際化概述隨著計(jì)算機(jī)應(yīng)用的普及,應(yīng)用軟件跨國(guó)使用越來(lái)越頻繁,如何實(shí)現(xiàn)應(yīng)用軟件的國(guó)際化,成為許多程序員關(guān)心的問(wèn)題。這種國(guó)際化問(wèn)題相對(duì)使用某一種語(yǔ)言的用戶來(lái)說(shuō),就是本地化問(wèn)題。本地化的含義比僅僅翻譯菜單欄和對(duì)話框的文本內(nèi)容要廣泛得多,如特定文化背景的位圖和圖標(biāo)對(duì)不同的人來(lái)說(shuō),可能會(huì)有不同的含義。在Windows系統(tǒng)中,應(yīng)用程序開(kāi)發(fā)者可以通過(guò)利用VC動(dòng)態(tài)鏈接庫(kù),只用一套源代碼就能簡(jiǎn)潔地支持多種文字。本文介紹用VC的資源動(dòng)態(tài)鏈接庫(kù)解決國(guó)際化問(wèn)題的具體方法和步驟。實(shí)現(xiàn)技術(shù):利用VC編程,可以將所有的可見(jiàn)資源封裝在一個(gè)資源動(dòng)態(tài)鏈接庫(kù)中,以簡(jiǎn)化本地化工作。一般情況下,資源包含在應(yīng)
2、用程序中,但也可以將資源與應(yīng)用程序(即源代碼)分離的方式以確定根據(jù)語(yǔ)言需求加載不同語(yǔ)言版本的資源動(dòng)態(tài)鏈接庫(kù)DLL。當(dāng)調(diào)用MFC函數(shù)比如 CString:LoadString 或其它 LoadIcon 時(shí),MFC應(yīng)用程序框架首先跟蹤搜索EXE文件的資源,然后才是DLL和MFC的資源,因此在使用純資源DLL時(shí)候,必須先人為改變資源的搜索順序,調(diào)用AfxSetResourceHandle函數(shù)完成資源的引用。HINSTANCE m_hLangDLL=:LoadLibrary("AppLanguage.dll");AfxSetResourceHandle(m_hLangDLL);下面
3、主要從兩個(gè)典型的Demo實(shí)例簡(jiǎn)要說(shuō)明軟件國(guó)際化(以中英文為例)的實(shí)現(xiàn):1. Demo1項(xiàng)目名:MultiLangDemo1,根據(jù)調(diào)用GetSystemDefaultLangID函數(shù)判斷系統(tǒng)默認(rèn)語(yǔ)種,以載入相應(yīng)語(yǔ)言的資源動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)界面與系統(tǒng)的自動(dòng)適應(yīng)。2. Demo2項(xiàng)目名:MultiLangDemo2,根據(jù)界面菜單手動(dòng)選擇語(yǔ)種實(shí)現(xiàn)動(dòng)態(tài)更改語(yǔ)言資源,包括圖標(biāo)、菜單、狀態(tài)欄,以及顯示不同區(qū)域的數(shù)據(jù)格式。2 實(shí)現(xiàn)步驟DEMO1一、創(chuàng)建主工程:1. 運(yùn)行VC6.0->File->New->Project;選擇MFC AppWizard(exe),在右邊Project Name下輸
4、入項(xiàng)目名MultiLangDemo1,完成(這里以Single Document為例,其他類似)。2. 從項(xiàng)目中移出所有的資源文件,將FileView面板中的MultiLangDemo1.rc,Resource.h,以及Resource Files下的所有文件移出(不是從實(shí)際文件目錄中刪除)。注:項(xiàng)目中移出資源文件后,主工程必須要加載外部的語(yǔ)言資源DLL,如果沒(méi)有找到或加載失敗的話,程序?qū)o(wú)法運(yùn)行,所以這里也可以選擇不移出,保留程序默認(rèn)的資源(Demo1中已移出,Demo2中沒(méi)有移出)。二、創(chuàng)建中、英文語(yǔ)言版(或其他語(yǔ)言)的資源DLL注: 為統(tǒng)一起見(jiàn),語(yǔ)言資源DLL名以“主工程名+Res”的格
5、式,不同語(yǔ)言資源以文件夾區(qū)分,如本例中中文資源DLL工程(MultiLangDemo1Res)可以創(chuàng)建在主工程MultiLangDemo1下的CHS文件夾中,英文資源DLL工程(MultiLangDemo1Res)可創(chuàng)建在主工程MultiLangDemo1下的ENG文件夾中。1.運(yùn)行VC6.0->File->New->Project;選擇MFC AppWizard(dll),在右邊Project Name下輸入項(xiàng)目名MultiLangDemo1Res,下一步選擇 Regular Dll Using share MFC DLL,單擊Finish完成創(chuàng)建。2.刪除該工程下的資源文
6、件:將FileView面板中的MultiLangDemo1Res.rc,Resource.h,以及Resource Files下的所有文件移出,然后也將實(shí)際目錄中的文件刪除掉。3.復(fù)制相關(guān)資源文件:將MultiLangDemo1目錄下的MultiLangDemo1.rc,Resource.h文件復(fù)制到MultiLangDemo1Res工程文件目錄下,將 MultiLangDemo1/res 下的所有文件復(fù)制到MultiLangDemo1/res目錄下(當(dāng)然也可以根據(jù)需要,選擇復(fù)制的文件)。4.將第3步復(fù)制的所有文件添加到項(xiàng)目中去。5如果是創(chuàng)建英文資源dll,應(yīng)將相關(guān)資源改為英文,將支持的語(yǔ)言改
7、為“英語(yǔ)(美國(guó)).",在Project菜單 Setting對(duì)話框中 Resource 標(biāo)簽的缺省文字改為"英語(yǔ)(美國(guó)).”,同時(shí)刪除在Resource標(biāo)簽下預(yù)處理定義中的"_AFXDLL"。這樣用戶的鏈接庫(kù)包含通用的MFC資源; 如果是創(chuàng)建中文資源dll,應(yīng)將相關(guān)資源改為中文,將支持的語(yǔ)言改為“中文(中國(guó))",在Project菜單 Setting對(duì)話框中Link標(biāo)簽Project Options的最后添加”/NOENTRY”。6.最后編譯生成中英文版的動(dòng)態(tài)鏈接庫(kù),并將DLL放置于主工程可執(zhí)行文件的同級(jí)目錄,形式為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庫(kù),只是為了突出效果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("無(wú)標(biāo)題 - MultiLangDemo1");break;if(!m_hLangDLL)AfxMessageBox(_T("無(wú)法裝載資源鏈接庫(kù)!") ;return FALSE ;AfxSetResourceHandle(m_hLangDLL); /更改標(biāo)題欄,dll資源中沒(méi)有該項(xiàng),只有手動(dòng)更改 m_pMainWnd->SetWindowText(strTitle);別忘了ExitInstance()函數(shù)釋放掉加載的dll資源 int CMultilanguageApp:ExitI
11、nstance()if(m_hLangDLL)AfxFreeLibrary(m_hLangDLL);return CWinApp:ExitInstance();最后編譯運(yùn)行!如下圖為中英文版本的實(shí)現(xiàn)界面:DEMO2Demo2項(xiàng)目創(chuàng)建的前兩步(即主工程與中、英文語(yǔ)言版資源DLL的創(chuàng)建)與Demo1一樣(只是主工程的資源文件未移出),項(xiàng)目名為MultiLangDemo2,在第三步修改主工程方面有些差異:修改主工程:1首先在中文dll和英文dll中分別增加菜單項(xiàng):語(yǔ)言(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);實(shí)現(xiàn)文件中,SetLanguage函數(shù)完成資源庫(kù)的加載: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文件夾下的語(yǔ)言資源庫(kù)m_hInstChinese = LoadLibrary(_T("CHS/MultiLangDemo2Res.dll");/根據(jù)語(yǔ)種設(shè)置窗口標(biāo)題(CMultiLangDemo2Doc*)GetActiveDocument()->SetTitle
15、("無(wú)標(biāo)題");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("加載語(yǔ)言庫(kù)失敗");/設(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古箏教學(xué)展示活動(dòng)方案
- 古詩(shī)文誦讀活動(dòng)方案
- 召開(kāi)會(huì)議開(kāi)展活動(dòng)方案
- 臺(tái)州別墅家具活動(dòng)方案
- 臺(tái)球麻將充值活動(dòng)方案
- 各地慶?;顒?dòng)方案
- 各界人士迎新春活動(dòng)方案
- 合作搭橋活動(dòng)方案
- 吉林公司團(tuán)建甜品定制活動(dòng)方案
- 同伴自助小組活動(dòng)方案
- 2025年軌道車司機(jī)(中級(jí))職業(yè)技能鑒定參考試題庫(kù)(含答案)
- 生物必修1教師用書(shū)
- 2024版壓力容器設(shè)計(jì)審核機(jī)考題庫(kù)-多選3-3
- 慢性阻塞性肺疾病急性加重期合并II型呼吸衰竭個(gè)案護(hù)理
- 路由與交換技術(shù)試題及答案
- (完整版)保安培訓(xùn)課件
- 2025屆上海市(春秋考)高考英語(yǔ)考綱詞匯對(duì)照表清單
- 《外匯交易基礎(chǔ)知識(shí)培訓(xùn)》詳解課件
- 汽油化學(xué)品安全技術(shù)說(shuō)明書(shū)MSDS
- 輸變電專業(yè)知識(shí)培訓(xùn)課件
- 新高考數(shù)學(xué)題型全歸納之排列組合專題18環(huán)排問(wèn)題含答案及解析
評(píng)論
0/150
提交評(píng)論