实现软件多语言版本的方案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现软件多语言版本的方案
编写资源DLL
下面以编写英语版的资源DLL(文件名为enres.dll)为例,说明编写的步骤:
(1) 新建一个MFC DLL工程(工程名为EnRes),完成后将该工程关闭,删
除该工程目录下的资源文件(enres.rc)、resource.h文件和res目录;
(2) 将你要实现多语言版本的程序的工程目录下的资源文件(.rc)、
resource.h文件和res目录拷贝到新建工程的目录下,并且将资源文件
更名为enres.rc;
(3) 重新打开工程EnRes,Rebuild All;
(4) 将所有资源的语言改为English,然后再次Build,OK。

可以按照以上步骤编写其他语言的资源DLL。

修改你的程序
资源DLL编写完成后,:
(5) 在VC的“Workspace Window”中将“Source Files”中的资源文件
(.rc)删除,将“Resource Files”下的所有文件都删除,并且将工程
目录中的资源文件(.rc)和res目录删除,Rebuild All;
(6) 将资源DLL拷贝至工程目录下;
(7) 在App类的InitInstance函数的开头中添加以下代码:
//########Load resource according language of the OS########### HINSTANCE hRes;
CString strDllName;
//Get system language
LANGID langId = GetSystemDefaultLangID();
strDllName.Format("%sRes%d.dll",AfxGetAppName(),langId);
//Load resource with same language
hRes = AfxLoadLibrary(strDllName);
if (hRes == NULL)//If the dll not exist,load English(U.S.A) resource hRes = AfxLoadLibrary(_T("FBKSRes.dll"));
if (hRes != NULL)
AfxSetResourceHandle(hRes);
//################################################### DLL文件命名规则
为了实现程序根据操作系统语言自动调用相应的DLL资源文件的功能,需要制作DLL的时候按照以下规则进行命名:
应用程序名Res语言ID.DLL
例如:FBKSRes2052.DLL,其中FBKS是应用程序名,2052是简体中文的语言ID(十进制,可在MSDN中查到16进制的值,转换一下即可)。

另外,程序中要求在调用不到对应语言的DLL文件的时候,会调用英文(美国)DLL文件,因此英文(美国)DLL文件采取这样的命名规则:
应用程序名Res.DLL
修改安装程序
如果希望做一个自适应的安装程序(就是说无论在什么语言的操作系统上安装——只要你做了该语言的DLL,程序都会调用相应语言的DLL资源),需要把所有的DLL资源都做到安装程序中,并且要求安装程序最终将这些DLL拷贝到程序执行文件所在的目录。

如果只针对某一语言(比如中文)的操作系统制作安装程序,中文的资源DLL当然必须要做到安装程序中。

另外特别注意:因为程序在找不到与操作系统语言相同的资源DLL的时候,会默认调用英文资源DLL,所以在制作安装程序的时候,无论以上两种情况的哪一种,一定要把英文(美国英语)DLL资源做到安装程序中。

补充:如果是基于对话框的程序,程序定义有快捷键,则应将应用程序变量m_hInstance和hRes相关联,否则,快捷键将无效。

相关文档
最新文档