




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
KY JL A 02 JS PR 03 第 2 页 共 10 页 软软件件 国国际际化化 VC 教教程程 第 2 页 共 10 页 1 软件国际化概述 随着计算机应用的普及 应用软件跨国使用越来越频繁 如何实现应用软件的国际化 成为许多程序员关心的问题 这种国际化问题相对使用某一种语言的用户来说 就是本地化问题 本地化的含义比 仅仅翻译菜单栏和对话框的文本内容要广泛得多 如特定文化背景的位图和图标对不同的 人来说 可能会有不同的含义 在 Windows 系统中 应用程序开发者可以通过利用 VC 动 态链接库 只用一套源代码就能简洁地支持多种文字 本文介绍用 VC 的资源动态链接库 解决国际化问题的具体方法和步骤 实现技术 实现技术 利用 VC 编程 可以将所有的可见资源封装在一个资源动态链接库中 以简化本地化 工作 一般情况下 资源包含在应用程序中 但也可以将资源与应用程序 即源代码 分离 的方式以确定根据语言需求加载不同语言版本的资源动态链接库 DLL 当调用 MFC 函数 比如 CString LoadString 或其它 LoadIcon 时 MFC 应用程序框架首先跟踪搜索 EXE 文 件的资源 然后才是 DLL 和 MFC 的资源 因此在使用纯资源 DLL 时候 必须先人为改变 资源的搜索顺序 调用 AfxSetResourceHandle 函数完成资源的引用 HINSTANCE m hLangDLL LoadLibrary AppLanguage dll AfxSetResourceHandle m hLangDLL 下面主要从两个典型的 Demo 实例简要说明软件国际化 以中英文为例 的实现 1 Demo1 项目名 MultiLangDemo1 根据调用 GetSystemDefaultLangID 函数判断系统默认语种 以载入相应语言的资源动态链接库实现界面与系统的自动适应 2 Demo2 项目名 MultiLangDemo2 根据界面菜单手动选择语种实现动态更改语言资源 包括 图标 菜单 状态栏 以及显示不同区域的数据格式 2 实现步骤 DEMO1 一 创建主工程 1 运行 VC6 0 File New Project 选择 MFC AppWizard exe 在右边 Project Name 下 输入项目名 MultiLangDemo1 完成 这里以 Single Document 为例 其他类似 2 从项目中移出所有的资源文件 将 FileView 面板中的 MultiLangDemo1 rc Resource h 以及 Resource Files 下的所有文件移出 不是从实际文件 目录中删除 注 项目中移出资源文件后 主工程必须要加载外部的语言资源 DLL 如果没有找到或加载失败的 话 程序将无法运行 所以这里也可以选择不移出 保留程序默认的资源 Demo1 中已移出 Demo2 中 没有移出 二 创建中 英文语言版 或其他语言 的资源 DLL 注 为统一起见 语言资源 DLL 名以 主工程名 Res 的格式 不同语言资源以文件夹区分 如本 例中中文资源 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 删除该工程下的资源文件 将 FileView 面板中的 MultiLangDemo1Res rc Resource h 以及 Resource Files 下的所有文件移出 然后也将实 第 3 页 共 10 页 际目录中的文件删除掉 3 复制相关资源文件 将 MultiLangDemo1 目录下的 MultiLangDemo1 rc Resource h 文件复制到 MultiLangDemo1Res 工程文件目录下 将 MultiLangDemo1 res 下的所有文件 复制到 MultiLangDemo1 res 目录下 当然也可以根据需要 选择复制的文件 4 将第 3 步复制的所有文件添加到项目中去 5 如果是创建英文资源 dll 应将相关资源改为英文 将支持的语言改为 英语 美国 在 Project 菜单 Setting 对话框中 Resource 标签的缺省文字改为 英语 美国 同时删除在 Resource 标签下预处理定义中的 AFXDLL 这样用户的链接库包含通用的 MFC 资源 第 4 页 共 10 页 如果是创建中文资源 dll 应将相关资源改为中文 将支持的语言改为 中文 中国 在 Project 菜单 Setting 对话框中 Link 标签 Project Options 的最后添加 NOENTRY 6 最后编译生成中英文版的动态链接库 并将 DLL 放置于主工程可执行文件的同级目 录 形式为 CHS MultiLangDemo1Res dll 和 ENG MultiLangDemo1Res dll OK 三 修改主工程 1 在 CMultiLangDemo1App 类中添加如下成员变量 private HINSTANCE m hLangDLL 构造函数中初始化 第 5 页 共 10 页 CMultiLangDemo1App CMultiLangDemo1App m hLangDLL NULL 在 InitInstance 函数修改资源加载顺序 BOOL CMultiLangDemo1App InitInstance AfxEnableControlContainer CString strTitle T 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 MultiLangDemo1Res dll strTitle T 无标题 MultiLangDemo1 break if m hLangDLL AfxMessageBox T 无法装载资源链接库 return FALSE AfxSetResourceHandle m hLangDLL 更改标题栏 dll 资源中没有该项 只有手动更改 m pMainWnd SetWindowText strTitle 别忘了 ExitInstance 函数释放掉加载的 dll 资源 int CMultilanguageApp ExitInstance if m hLangDLL AfxFreeLibrary m hLangDLL return CWinApp ExitInstance 最后编译运行 如下图为中英文版本的实现界面 第 6 页 共 10 页 DEMO2 Demo2 项目创建的前两步 即主工程与中 英文语言版资源 DLL 的创建 与 Demo1 一样 只是主工程的资源文件未移出 项目名为 MultiLangDemo2 在第 三步修改主工程方面有些差异 修改主工程 1 首先在中文 dll 和英文 dll 中分别增加菜单项 语言 Language 下拉菜 单中文 Chinese 和英文 English 下拉菜单 ID 分别为 ID LANGUAGE CHINESE ID LANGUAGE ENGLISH 确保同一 ID Value 值一样 如下图所示 第 7 页 共 10 页 并分别添加各自的菜单响应函数 OnLanguageEnglish 和 OnLanguageChinese void CMainFrame OnLanguageChinese TODO Add your command handler code here SetLanguage Chinese void CMainFrame OnLanguageEnglish TODO Add your command handler code here SetLanguage English 2 在类 CMainFrame 头文件中定义如下 private CMenu m pMenuNew enum LANGUAGES Chinese English HINSTANCE m hInstChinese m hInstEnglish LANGUAGES m nLanguage public void GetDate CString private void SetLanguage LANGUAGES nLanguage 第 8 页 共 10 页 实现文件中 SetLanguage 函数完成资源库的加载 void CMainFrame SetLanguage LANGUAGES nLanguage CString 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 无标题 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 else AfxMessageBox 加载语言库失败 设置菜单 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 就绪 ready m wndStatusBar SetPaneText 0 strBuffer m wndStatusBar SetIndicators indicators sizeof indicators sizeof UINT m hAccelTable NULL if LoadAccelTable MAKEINTRESOURCE IDR MAINFRAME 第 9 页 共 10 页 AfxMessageBox LoadAccelTable MAKEINTRESOURCE IDR MAI NFRAME failure 设置位图 HICON m hIcon AfxGetApp LoadIcon IDR MAINFRAME SetIcon m hIcon TRUE Invalidate 3 SetLanguage 函数后 将引发重绘 void CMultiLangDemo2View OnPaint CPaintDC dc this device context for painting CMainFrame 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 Get todays date pFrame GetDate strBuffer dc TextOut 10 30 strBuffer 其中函数 GetData 函数是根据语种类别获取不同的 today date 的数据格 式 其实现详见代码 MultiLangDemo2 下面如图为 Demo2 的界面实现 第 10 页 共 10 页 3 小结 在实验中发现 实现上述步骤之后 想在资源 dll 中添加其他资源 如在中 英文资源 dll 中添加了 IDS STRINGTEST 但编译器首先
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论