我们公司目前软件大多数用MFC单文档实现,前段时间为了海外扩展,要求所以软件采用多语言。
因此我给下属下了一个命令,就是归纳多语言实现方式,总结最优实现方式。
一共有四种方法:先介绍常规的前三种。
例子在资源里面“MFC多语言实现方法”。
需要转换语言的地方有:
1、程序界面:菜单,控件标签等。
2、提示字符串等。
一、字符放在DLL资源文件中,切换资源模块(程序默认使用exe模块资源)。
实现要点:
新建一个只包含资源的DLL。通过函数AfxSetResourceHandle设置资源模块。
示意代码为:
AfxSetResourceHandle(LoadLibrary("english.dll"));
Cstring strMsg;
strMsg.LoadString(ID_TITLE);
SetWindowText(strMsg);
见例子MulLanguage_dll.rar
二、字符放在EXE资源文件中,选择对应的语言资源。
实现要点:
新建多个ID相同,语言不同的资源。
通过SetThreadLocale设置当前线程使用语言。
示意代码:
SetThreadLocale(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
CString strMsg;
strMsg.LoadString(ID_TITLE);
SetWindowText(strMsg);
例子:MulLanguage_rc.rar
三、字符放在INI文件中。
实现要点:
同种语言字符放在单独的文本,通过切换文件方式切换语言。
优点:增加一种新语言,只需增加相应的语言的文件。
缺点:DLL模块中的字符转换,字符ID命名。
CString strMsg;
GetPrivateProfileString(…);
SetWindowText(strMsg);
见例子MulLanguage_ini.rar
综合上面三种方法,从原理上看其实是同一种方法,获取相应语言下的字符,再显示字符,不同之处是字符存放位置不同。字符可以存放在DLL资源中,exe资源中,文本文件中。相应地获取字符方式也不同。