软件资源国际化 VC教程_第1页
软件资源国际化 VC教程_第2页
软件资源国际化 VC教程_第3页
软件资源国际化 VC教程_第4页
软件资源国际化 VC教程_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件国际化VC+教程1 软件国际化概述随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的国际化,成为许多程序员关心的问题。这种国际化问题相对使用某一种语言的用户来说,就是本地化问题。本地化的含义比仅仅翻译菜单栏和对话框的文本内容要广泛得多,如特定文化背景的位图和图标对不同的人来说,可能会有不同的含义。在Windows系统中,应用程序开发者可以通过利用VC动态链接库,只用一套源代码就能简洁地支持多种文字。本文介绍用VC的资源动态链接库解决国际化问题的具体方法和步骤。实现技术:利用VC编程,可以将所有的可见资源封装在一个资源动态链接库中,以简化本地化工作。一般情况下,资源包含在应

2、用程序中,但也可以将资源与应用程序(即源代码)分离的方式以确定根据语言需求加载不同语言版本的资源动态链接库DLL。当调用MFC函数比如 CString:LoadString 或其它 LoadIcon 时,MFC应用程序框架首先跟踪搜索EXE文件的资源,然后才是DLL和MFC的资源,因此在使用纯资源DLL时候,必须先人为改变资源的搜索顺序,调用AfxSetResourceHandle函数完成资源的引用。HINSTANCE m_hLangDLL=:LoadLibrary("AppLanguage.dll");AfxSetResourceHandle(m_hLangDLL);下面

3、主要从两个典型的Demo实例简要说明软件国际化(以中英文为例)的实现:1. Demo1项目名:MultiLangDemo1,根据调用GetSystemDefaultLangID函数判断系统默认语种,以载入相应语言的资源动态链接库实现界面与系统的自动适应。2. Demo2项目名:MultiLangDemo2,根据界面菜单手动选择语种实现动态更改语言资源,包括图标、菜单、状态栏,以及显示不同区域的数据格式。2 实现步骤DEMO1一、创建主工程:1. 运行VC6.0->File->New->Project;选择MFC AppWizard(exe),在右边Project Name下输

4、入项目名MultiLangDemo1,完成(这里以Single Document为例,其他类似)。2. 从项目中移出所有的资源文件,将FileView面板中的MultiLangDemo1.rc,Resource.h,以及Resource Files下的所有文件移出(不是从实际文件目录中删除)。注:项目中移出资源文件后,主工程必须要加载外部的语言资源DLL,如果没有找到或加载失败的话,程序将无法运行,所以这里也可以选择不移出,保留程序默认的资源(Demo1中已移出,Demo2中没有移出)。二、创建中、英文语言版(或其他语言)的资源DLL注: 为统一起见,语言资源DLL名以“主工程名+Res”的格

5、式,不同语言资源以文件夹区分,如本例中中文资源DLL工程(MultiLangDemo1Res)可以创建在主工程MultiLangDemo1下的CHS文件夹中,英文资源DLL工程(MultiLangDemo1Res)可创建在主工程MultiLangDemo1下的ENG文件夹中。1.运行VC6.0->File->New->Project;选择MFC AppWizard(dll),在右边Project Name下输入项目名MultiLangDemo1Res,下一步选择 Regular Dll Using share MFC DLL,单击Finish完成创建。2.删除该工程下的资源文

6、件:将FileView面板中的MultiLangDemo1Res.rc,Resource.h,以及Resource Files下的所有文件移出,然后也将实际目录中的文件删除掉。3.复制相关资源文件:将MultiLangDemo1目录下的MultiLangDemo1.rc,Resource.h文件复制到MultiLangDemo1Res工程文件目录下,将 MultiLangDemo1/res 下的所有文件复制到MultiLangDemo1/res目录下(当然也可以根据需要,选择复制的文件)。4.将第3步复制的所有文件添加到项目中去。5如果是创建英文资源dll,应将相关资源改为英文,将支持的语言改

7、为“英语(美国).",在Project菜单 Setting对话框中 Resource 标签的缺省文字改为"英语(美国).”,同时删除在Resource标签下预处理定义中的"_AFXDLL"。这样用户的链接库包含通用的MFC资源; 如果是创建中文资源dll,应将相关资源改为中文,将支持的语言改为“中文(中国)",在Project菜单 Setting对话框中Link标签Project Options的最后添加”/NOENTRY”。6.最后编译生成中英文版的动态链接库,并将DLL放置于主工程可执行文件的同级目录,形式为CHS/MultiLangDem

8、o1Res.dll 和ENG/MultiLangDemo1Res.dll, OK!三、修改主工程:1. 在CMultiLangDemo1App类中添加如下成员变量:private:HINSTANCE m_hLangDLL;构造函数中初始化:CMultiLangDemo1App:CMultiLangDemo1App()m_hLangDLL = NULL;在InitInstance()函数修改资源加载顺序: BOOL CMultiLangDemo1App:InitInstance()AfxEnableControlContainer();CString strTitle =_T("&qu

9、ot;);WORD wLangPID=PRIMARYLANGID(:GetSystemDefaultLangID();switch(wLangPID)/这里是中文环境选择了英文的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()函数释放掉加载的dll资源 int CMultilanguageApp:ExitI

11、nstance()if(m_hLangDLL)AfxFreeLibrary(m_hLangDLL);return CWinApp:ExitInstance();最后编译运行!如下图为中英文版本的实现界面:DEMO2Demo2项目创建的前两步(即主工程与中、英文语言版资源DLL的创建)与Demo1一样(只是主工程的资源文件未移出),项目名为MultiLangDemo2,在第三步修改主工程方面有些差异:修改主工程:1首先在中文dll和英文dll中分别增加菜单项:语言(Language),下拉菜单中文(Chinese)和英文(English),下拉菜单ID分别为:ID_LANGUAGE_CHINES

12、E、ID_LANGUAGE_ENGLISH(确保同一ID,Value值一样)。如下图所示:并分别添加各自的菜单响应函数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);实现文件中,SetLanguage函数完成资源库的加载: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");/根据语种设置窗口标题(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("加载语言库失败");/设置菜单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);/设置状态栏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");/设置位图HICON m_hIcon = AfxGetApp

18、()->LoadIcon(IDR_MAINFRAME);SetIcon(m_hIcon,TRUE);Invalidate();3. SetLanguage函数后,将引发重绘。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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论