实现多语言资源

时间:2021-08-01 15:53:23

      在软件国际化的今天,资源从代码中独立出来,使在不同语言操作系统下能运行不同语言版本的程序,是很有意义的事. MFC 7.0 及更高版本提供对附属 DLL 的增强支持,该功能有助于创建针对多种语言进行本地化的应用程序。附属 DLL 是一个纯资源 DLL,它包含应用程序的针对特定语言进行本地化的资源。当应用程序开始执行时,MFC 自动加载最适合于环境的本地化资源。

     使用Vs2005可以很方便的创建包含资源的dll.下面简要介绍其步骤:

  (1)新建一个与代码文件夹平级的文件夹,文件夹的名字为:代码程序的工程名字+Res。

   (2)将所有的资源文件( *.rc),位图,图标文件和resource.h拷贝到资源文件夹下。

   (3)打开VS2005选择File—>New—>Project From Existing code,选择工程的种类为VC++,将工程文件的位置选定为资源文件夹,工程名称为资源文件夹的名称,Next后选择工程类型为DLL工程,然后一路Next下去直到完成。

 (4)在建立好资源工程后,打开该工程,为每一种语言建立一个工程配置项,在配置项中配置好输出路径。在Link—>Advance选项卡中选择Yes/NOENTRY,否则编译会有问题。每一种语言的配置项中只包含本语言的RC文件,其他语言的RC从Build中去除,去除的方法是在工作空间中右键单击该文件,选择属性,会弹出该文件的属性对话框,选择GeneralàExcluded From Buildà为Yes

实现多语言资源

(5)  在应用程序的APP类中声明一个资源实例句柄,例如HINSTANCE m_hResourceDLL,然后InitInstance函数中使用LoadLibraryAfxSetResourceHandle进行加载,例如:

         m_hResourceDLL = (HINSTANCE)::LoadLibrary(strResFilePath);
       if( !m_hResourceDLL )
       {
              return FALSE;
       }
       AfxSetResourceHandle( m_hResourceDLL );
 
最后在 ExitInstance 函数中使用 FreeLibrary 函数进行卸载,例如
if( m_hResourceDLL )
{
       FreeLibrary( m_hResourceDLL );
}
(6)可用GetUserDefaultUILanguage,GetUserDefaultLangID等检测操作系统语言
以下是一些注意事项:
(1)在获取资源路径时,LoadLibrary最好使用绝对路径,使用相对路径在某些语言操作系统就会失败。
(2)代码中如果有的地方使用了PlantForm SDK中的函数(例如LoadIconLoadBitmap)来加载资源文件中资源(非标准资源),这些函数需要指定实例句柄,请使用AfxGetResourceHandle函数来替换APP的实例句柄。
(3)   并非使用Unicode资源,文字就可以在所有语言操作系统上正确显示,没有设置正确的字体也不行,特别是对繁体,韩文。“Microsoft Sans Serif”是相对包含各种语言最多的字体,韩文和繁体显示也是正常的,但该字体2000操作系统不支持。
(4)代码中使用Textout,DrawText的地方如果没有设置,默认是System字体,该字体支持语言范围相对较小,推荐在使用上述函数前设置字体。
(5)ATL生成的代码,rgs虽然在资源里,但那是注册时使用的脚本,不要也提到资源里。
(6)    提出的资源文件(文本方式打开)里可以删掉
3 TEXTINCLUDE
BEGIN
    "1 TYPELIB ""AlarmWinConfig.tlb""/r/n"
    "/0"
END
纯资源文件不会有类型库。
(7)编译选项里可以去掉生成调试信息,导入库.因为对纯资源文件没什么意义.
(8)  代码里的 字符串资源注意提到资源里,如一些报错的字符串,即硬编码.
(9)   rc资源文件(文本方式打开)里:
3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES/r/n"
    "#define _AFX_NO_OLE_RESOURCES/r/n"
    "#define _AFX_NO_TRACKER_RESOURCES/r/n"
    "#define _AFX_NO_PROPERTY_RESOURCES/r/n"
    "/r/n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)/r/n"
    "#ifdef _WIN32/r/n"
    "LANGUAGE 4, 2/r/n"
    "#pragma code_page(936)/r/n"
    "#endif //_WIN32/r/n"
    "#include ""l.chs//afxres.rc""          // Standard components/r/n"
    "#endif/r/n"
    "/0"
END
其中 "#include ""l.chs//afxres.rc"" 为标准资源,不同语言其路径不一样,如果不添加标准资源,程序里需处理所有非法情况
(10)最好程序和资源都采用静态连接编译.