程序的多语言支持


经常会遇到这样的问题,程序要支持多种语言的操作系统。下面就说说VC6下怎样实现。

一、使用字符列表文件
这种方法算是比较好的。说白了就是配置文件,把所有需要显示的字符串都放在一个文件里,每种语言对应一个文件。如Simplified Chinese.ini、Traditional Chinese.ini、English.ini。文件内容示例如下:
// In Simplified Chinese.ini
ID_APP_CAPTION = 我的程序
……

// In English.ini
ID_APP_CAPTION = MyProgram

采用这种方法,程序中通常会创建一个类(如CLanguageManager)用来专门管理这些琐事。需要显示字符串,就通过调用CLanguageManager的方法(如GetAppCaption())来取得。

这方法的好处是你可以在程序运行时改变语言。缺点是需要仔仔细细的撰写这些配置文件。顺便提一下,早期版本的Skype用的就是这方法,不过它的配置文件是xml格式。

二、使用资源DLL

上面是每种语言对应一个配置文件,资源DLL类似,不过是每种语言对应一个资源DLL,类似的就会有Simplified Chinese.DLL、Traditional Chinese.DLL、English.DLL这样的DLL。资源DLL是一种特殊的数据,不能用上面的简单读取文件的方法来初始化内容,而会用到LoadLibrary和AfxSetResourceHandle两个函数。示例代码如下:

BOOL CMultilanguageApp::InitInstance()
{
 AfxEnableControlContainer();

 if (m_bChinese)
 {
  m_hLangDLL=::LoadLibrary("Chinese.dll");
 }
 else
 {
  m_hLangDLL=::LoadLibrary("English.dll");
 }

 AfxSetResourceHandle(m_hLangDLL);
 ……
}

与第一种方法比,资源DLL由于都是在VC6的集成环境中编辑,优点是比较直观,缺点是需要维护多份资源代码,且每次修改资源,都要重新编译和链接。第一种方法则只需要修改配置文件则可。同时,资源DLL的方法也做不到程序运行时切换语言。

三、包含多份资源

这种方法和第二种“使用资源DLL”的方法类似,不同之处是你可以在一个工程中管理多份资源,而不需要创建资源DLL。奥妙在于,资源编辑时,VC6 IDE提供了Insert Copy这个选项。在Insert新Copy时你可以指定与原资源不一样的语言。假设你的资源文件中有语言为“简体中文”和“繁体中文”的两份,那程序运行在简体下时,它便会显示简体中文,在繁体中文下时便会显示繁体中文的界面。在语言选择列表的最上面有个“Neutral”项,如果你创建了这样的资源,那么在每个操作系统中都将显示“Neutral”的资源,就是独立于操作系统代码页的意思。这种方法同样做不到动态切换语言,与第二种方法比,好处是不用管理资源DLL,程序启动时,会自动匹配相同代码页的资源。



你可能感兴趣的:(xml,配置管理,ide)