本文以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() 函数中&#x