怎样在程式中利用C 支持多国语言

2008-02-23 05:32:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

本文以emule为例,探讨一下多国语言支持的实现。选择emule,因为他的多国语言支持实现的相当好,能够支持动态转换。而且最关键,他是开源的,能够直接通过源码来研究他的实现技术。

  emule是利用动态加载资源DLL来实现多语言转换的,每一个资源DLL中包含了一份对应某一语言的字符串表。在源码的srchybrid\lang 路径上能够发现一个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属性设为“非特定语言”。在“资源”视图中选中相应的对话框节点,再转换到“属性”视图就能够看到这个选项了。假如不配置会出现乱码。




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 中对浮点数的格式化显示

下一篇: c 编的学生个人消费管理系统(2)

热门词条
热门标签