当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>如安在程序中操纵C++支持多国语言</b>[VC/C++编程]

赞助商链接



  本文“<b>如安在程序中操纵C++支持多国语言</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本文以emule为例,探究一下多国语言支持的实现.挑选emule,因为它的多国语言支持实现的相当好,可以支持动态切换.并且最关键,它是开源的,可以直接通过源码来研究它的实现技术.

emule是操纵动态加载资源DLL来实现多语言切换的,每一个资源DLL中包含了一份对应某一语言的字符串表.在源码的srchybridlang 途径上可以发现一个lang办理筹划,此中包含了差不多40个项目,每个项目编译出来都是一个单独的DLL.这些DLL在程序安装时拷贝到指定的目录中.每个DLL里面都是一个大的string table.emule为每一个用到的字符串(大约为1400多个)都指定了一个固定ID,在差别的DLL中这个ID对应了这个字符串的差别语言的翻译版本.这样每当需求这个字串时就通过ID去获得,在当时程序加载的某一特定语言的DLL,便可以取到呼应语言的字串.

英文版本的string table编译在主EXE文件中,这样当某一语言不支持,或DLL文件加载失利时还可以利用英语版本.

下面我们就看看具体的实现.

主要实现代码在I18n.cpp文件中.进口函数是 void CPreferences::SetLanguage() ,这个函数在在 void CPreferences::LoadPreferences() 函数中被调用,即载入了程序的各种选项后.当程序第一次运行时,在选项文件(即 preferences.ini)中没有内容,SetLanguage函数会按照系统的本地语言设置来加载对应的语言DLL资源,所以我们第一次安装后就是中文,无需设置.这一点我们背面会说到.

别的在 BOOL CPPgGeneral::OnApply() 中也调用了该函数,即用户在“选项”窗口中改变了语言挑选后.

在 void CPreferences::SetLanguage() 函数中,首先调用了 static void InitLanguages(const CString& rstrLangDir, bool bReInit = false) 函数.这个函数主如果通过遍历“语言”目录(即我们前面说地的,专门用于存放各种语言版本DLL的目录),来初始化静态“语言表” (_aLanguages),这是个静态数组,此中的每一项对应一种支持的语言.凡能找到呼应DLL文件的,就在表中标志该语言为支持.

然后调用 static bool LoadLangLib(const CString& rstrLangDir, LANGID lid) 来载入呼应的语言DLL.这个函数对比简单,通过查“语言表”(_aLanguages),假如要载入的语言是支持的,就加载呼应的DLL文件,并将DLL模块句柄存到_hLangDLL中,这也是一个静态变量.我们可以看到假如是英语,是不需求加载的,直接用EXE模块中的资源字符串表.

假如调用LoadLangLib文件加载指定的语言失利,程序会尝试判断本地系统的语言集,并加载对应的语言,假如加载也失利就利用英语.

语言文件加载成功后,程序会尝试从中加载一个字串,假如失利,阐明大概DLL文件破坏,则再重设语言为英语.英语字串是内置在EXE文件中的,所以是最坚固的.

至此,加载成功,句柄保存在_hLangDLL静态变量中.

最后在需求字符串的地方程序通过 CString GetResString(UINT uStringID, WORD wLanguageID) 或 CString GetResString(UINT uStringID) 函数加载呼应的字符串.这个函数的功效很简单,就是从_hLangDLL指定的模块中加载字符串资源.假如_hLangDLL为 NULL就是从当前模块加载,我们前面已经看到了,假如利用英语这个变量的值就是NULL.

在emule的源码中,几近每个对话框都实现了一个Localize(void)函数,这个函数就是通过调用GetResString来设置对话框上全部控件的文字.在  BOOL CPPgGeneral::OnApply() 函数中我们可以看到,在调用CPreferences::SetLanguage函数切换了语言后,会顺次调用对话框和窗口的Localize(void)函数,重新设置UI的文字内容.

最后注意一点,假如你想让利用支持多语言,在计划对话框时要把对话框的Language属性设为“非特定语言”.在“资源”视图中选中呼应的对话框节点,再切换到“属性”视图便可以看到这个选项了.假如不设置会呈现乱码.


  以上是“<b>如安在程序中操纵C++支持多国语言</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .