<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |