




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 页共10页KYJLA02-JS-PR03第2页共1页0软件国际化VC+教程1软件国际化概述随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的国际化,成为许多程序员关心的问题。这种国际化问题相对使用某一种语言的用户来说,就是本地化问题。本地化的含义比仅仅翻译菜单栏和对话框的文本内容要广泛得多,如特定文化背景的位图和图标对不同的人来说,可能会有不同的含义。在Windows系统中,应用程序开发者可以通过利用VC动态链接库,只用一套源代码就能简洁地支持多种文字。本文介绍用VC的资源动态链接库解决国际化问题的具体方法和步骤。实现技术:利用VC编程,可以将所有的可见资源封装在一个资源
2、动态链接库中,以简化本地化工作。一般情况下,资源包含在应用程序中,但也可以将资源与应用程序(即源代码)分离的方式以确定根据语言需求加载不同语言版本的资源动态链接库DLL。当调用MFC函数比如CString:LoadString或其它Loadicon时,MFC应用程序框架首先跟踪搜索EXE文件的资源,然后才是DLL和MFC的资源,因此在使用纯资源DLL时候,必须先人为改变资源的搜索顺序,调用AfxSetResourceHandle函数完成资源的引用。HINSTANCEm_hLangDLL=:LoadLibrary(AppLanguage.dll);AfxSetResourceHandle(m_h
3、LangDLL);下面主要从两个典型的Demo实例简要说明软件国际化(以中英文为例)的实现:Demo1项目名:MultiLangDemol,根据调用GetSystemDefaultLangID函数判断系统默认语种,以载入相应语言的资源动态链接库实现界面与系统的自动适应。Demo2项目名:MultiLangDemo2,根据界面菜单手动选择语种实现动态更改语言资源,包括图标、菜单、状态栏,以及显示不同区域的数据格式。2实现步骤DEMO1一、创建主工程:运行VC6.0-File-New-Prcject;选择MFCAppWizard(exe),在右边ProjectName下输入项目名MultiLang
4、Demo1,完成(这里以SingleDocument为例,其他类似)。从项目中移出所有的资源文件,将FileView面板中的MultiLangDemo1.rc,Resource.h,以及ResourceFiles下的所有文件移出(不是从实际文件目录中删除)。注:项目中移出资源文件后,主工程必须要加载外部的语言资源DLL,如果没有找到或加载失败的话,程序将无法运行,所以这里也可以选择不移出,保留程序默认的资源(Demo1中已移出,Demo2中没有移出)。二、创建中、英文语言版(或其他语言)的资源DLL注:为统一起见,语言资源DLL名以主工程名+Res的格式,不同语言资源以文件夹区分,如本例中中文
5、资源DLL工程(MultiLangDemo1Res)可以创建在主工程MultiLangDemo1下的CHS文件夹中,英文资源DLL工程(MultiLangDemo1Res)可创建在主工程MultiLangDemo1下的ENG文件夹中。运行VC6.0-File-New-Project;选择MFCAppWizard(dll),在右边ProjectName下输入项目名MultiLangDemo1Res,下一步选择RegularDllUsingshareMFCDLL,单击Finish完成创建。删除该工程下的资源文件:将FileView面板中的MultiLangDemo1Res.rc,Resource.
6、h,以及ResourceFiles下的所有文件移出,然后也将实际目录中的文件删除掉。;Clas閤Resoi骂FileVieVAViiWVAOi4QWorkspaceMultiLangDemolRes:1pro-MultiLangDemolResfiles-_jSourceFiles國MultiLangDemolRes.cpp司MultiLangDemolRes.def烹|因StdAfx.cpp-_jHeaderFiles司MultiLangDemolRes.h司Resource.h-_jResourceFiles弐ReadMe.txtMultiLangDemolRes.rcStdAfx.hMu
7、ltiLangDemolRes.rc2复制相关资源文件:将MultiLangDemol目录下的MultiLangDemol.rc,Resource.h文件复制到MultiLangDemolRes工程文件目录下,将MultiLangDemol/res下的所有文件复制到MultiLangDemo1/res目录下(当然也可以根据需要,选择复制的文件)。将第3步复制的所有文件添加到项目中去。!/兰WorkspaceMultiLangDemolRes1:1pro-MultiLangDemolResfilesMultiLangDemol.rc-_JSourceFiles囲|:总MultiLangDemol
8、Res.cpp司MultiLangDemolRes.def:总StdAfx.cpp-_JHeaderFilesResource.h司MultiLangDemolRes.h骂StdAfx.hMultiLangDemol.icoMultiLangDemol.rc21MultiLangDemolDoc.icoToolbar.bmp降-_JResourceFilesISetWindowText(strTitle);别忘了ExitInstance()函数释放掉加载的dll资源intCMultilanguageApp:ExitInstance()if(m_hLangDLL)AfxFreeLibrary(m
9、_hLangDLL);returnCWinApp:ExitInstance();最后编译运行!如下图为中英文版本的实现界面:MulliLiiL且hnoliei-=;icn1.0建)与在第DEMDDem*iH三步1首先在中文dll和英文dll中分别增加菜单项:语言(Language),下拉菜单中文(Chinese)和英文(English),下拉菜单ID分别为:ID_LANGUAGE_CHINESE、ID_LANGUAGE_ENGLISH(确保同一ID,Value值一样)。如下图所示:并分别添加各自的菜单响应函数OnLanguageEnglish和OnLanguageChinese,voidCMa
10、inFrame:OnLanguageChinese()/TODO:AddyourcommandhandlercodehereSetLanguage(Chinese);voidCMainFrame:OnLanguageEnglish()/TODO:AddyourcommandhandlercodehereSetLanguage(English);2.在类CMainFrame头文件中定义如下:private:CMenu*m_pMenuNew;enumLANGUAGESChinese,English;HINSTANCEm_hInstChinese,m_hInstEnglish;LANGUAGESm_
11、nLanguage;public:voidGetDate(CString&strDate);private:voidSetLanguage(LANGUAGESnLanguage);实现文件中,SetLanguage函数完成资源库的加载:voidCMainFrame:SetLanguage(LANGUAGESnLanguage)CStringstrBuffer=_T();HINSTANCEhInst=NULL;LCIDlcid=NULL;m_nLanguage=nLanguage;switch(nLanguage)caseChinese:if(!m_hInstChinese)加载CHS文件夹下的
12、语言资源库m_hInstChinese=LoadLibrary(_T(CHS/MultiLangDemo2Res.dll);/根据语种设置窗口标题(CMultiLangDemo2Doc*)GetActiveDocument()-SetTitle(无标题);hInst=m_hInstChinese;break;caseEnglish:if(!m_hInstEnglish)m_hInstEnglish=LoadLibrary(_T(ENG/MultiLangDemo2Res.dll);(CMultiLangDemo2Doc*)GetActiveDocument()-SetTitle(Untitle
13、d);hInst=m_hInstEnglish;break;if(hInst)AfxSetResourceHandle(hInst);elseAfxMessageBox(加载语言库失败);/设置菜单CMenu*pMenuCurrent=GetMenu();m_pMenuNew=newCMenu;if(pMenuCurrent-m_hMenu!=m_hMenuDefault)pMenuCurrent-DestroyMenu();deletepMenuCurrent;m_pMenuNew-LoadMenu(IDR_MAINFRAME);SetMenu(m_pMenuNew);/设置状态栏strBu
14、ffer.LoadString(AFX_IDS_IDLEMESSAGE);/就绪IIreadym_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);/设置位图
15、HICONm_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);SetIcon(m_hIcon,TRUE);Invalidate();3.SetLanguage函数后,将引发重绘。voidCMultiLangDemo2View:OnPaint()CPaintDCdc(this);/devicecontextforpaintingCMainFrame*pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStringstrBuffer=_T();/IDS_LANG_STRING为dll资源中的字符串,注意不同dll的IDS_LANG_STRING需保持一致(仅仅字符串内容不同)。strBuffer.LoadString(IDS_LANG_STRING);dc.TextOut(10,10,strBuffer);/GettodaysdatepFrame-GetDate(strBuffer);dc.TextOut(10,30,strBuffer);其中函数GetData函数是根据语种类别获取不同的todaydate的数据格式,其实现详见代码:MultiLangDemo2。下面如图为Demo2的界面实现:英文资源dll中添加了IDS_STRINGTEST,但编译器首先是搜索的主工程下的资源文件,故编译提示没有定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025战略管理与合同关系优化
- 2025商务英语考试:商务合同英译关键注意问题
- 2025租赁合同与销售合同
- 2025标准煤炭购销合同
- 2025《商务楼租赁合同》范本
- 2025合同解除与合同终止的区别
- 2025餐饮连锁店的用工合同范本
- 2025铜产品购销合同范本
- 2025年:透视租赁合同中的当事人权益保障
- 2025有关企业对个人借款合同范文
- 地基基础基桩静荷载试验考试题库
- 珠宝行业中的区块链技术
- 大数据时代下传统会计受到的冲击与应对措施
- 断亲协议书模板
- TD/T 1061-2021 自然资源价格评估通则(正式版)
- 级进模具毕业设计说明书
- MOOC 知识创新与学术规范-南京大学 中国大学慕课答案
- 儿童呼吸机基本使用
- 手术替代治疗方案
- 建筑工程项目管理绩效评价指标体系
- T-CNPPA 3025-2023 药包材质量协议管理指南
评论
0/150
提交评论