多国语言实现

来源:互联网 发布:统计学 从数据到结论 编辑:程序博客网 时间:2024/04/20 04:49

2009-08-16 13:54 by IamEasy_Man, 87 visits, 网摘, 收藏, 编辑

     介绍一种多国语言的实现办法,这也是微软推荐的方式,打开windows mobile下的windows目录可以看到有很多以MUI为后缀名的文件,例如shellres.dll.0804.mui和shell.dll.0804.mui。。。。。。我们可以用eXeScope.exe或者resources hacker这样的文件查看器查看一下这些文件究竟是怎么一回事,不难发现文件里面都是一些资源ID和相对应的字符串。也许你就疑惑这是为什么呢?这些文件有什么作用呢?下面分解。

     MUIMultilingual User Interface的缩写,意为多语言用户界面,主要是用来实现软件的国际化,也就是软件的多国语言版本的实现。其实一个mui文件也是一个DLL来的,但是这个dll有点特殊,不像我们以往的带来了那样包含了很多的函数体供dll外或者本身调用,而是只包含字符串资源,所以可以在vs下新建一个dll项目,不需要其他代码,只需要dll的入口点如下:

 


 1 #include "windows.h"
 2 
 3 
 4 /////////////////////////////////////////////////////////////////////////////
 5 
 6 // DLL Entry Point
 7 
 8 extern "C"
 9 
10 BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
11 
12 {
13 
14     return TRUE;
15 
16 

 

     除此以外,刚才也提到了,dll里只包含字符串资源,所以必须添加一个资源配置文件如***.rc,在里面添加相应的字符串资源信息,如下:

 


 1 IDR_HELLO_MENUBAR MENU DISCARDABLE
 2 
 3 BEGIN
 4 
 5     MENUITEM "Exit",                          PSP_DLGINDIRECT
 6 
 7     POPUP "Menu"
 8 
 9     BEGIN
10 
11         MENUITEM "Exit",                          PSP_DLGINDIRECT
12 
13         MENUITEM "Test",                        ID_MENU_TEST
14 
15     END
16 
17 

 

     在这里要特别注意了,因为每一个mui也就是说每一个dll就代表一种语言,所以在资源配置文件里就是通过对每个字符串资源进行相应语言的更改达到多国语言的效果,例如你要做成简体中文版本,你就必须在重新建一个dll,同样建立一个资源配置文件,但是得把刚才上面的这段资源配置脚本代码改成如下:

 


 1 IDR_HELLO_MENUBAR MENU DISCARDABLE
 2 
 3 BEGIN
 4 
 5     MENUITEM "退出",                          PSP_DLGINDIRECT
 6 
 7     POPUP "菜单"
 8 
 9     BEGIN
10 
11         MENUITEM "退出",                          PSP_DLGINDIRECT
12 
13         MENUITEM "测试",                        ID_MENU_TEST
14 
15     END
16 
17 

 

     然后可以通过把定义资源IDresources.h这个文件共享出来,让多个mui文件和应用程序用同一个资源ID

     同时你还需要在dll项目添加一个导出文件如***.def,其实不需要导出函数名如下就可以(其实下面的导出函数名可以不需要):

 

1 LIBRARY      "hello.exe.0804.mui"
2 
3 EXPORTS
4 

 

     也许你还会问,那应用程序怎么去通过匹配相应的mui文件来进行语言的定位?请看。

     刚才说到windows目录下有shellres.dll.0804.mui,其实mui文件的命名有一定的规则可循,可不是乱来的,首先shellres.dll表明这个mui文件是专门用于shellres.dll多国语言版本,再例如hello.exe.0804.mui这个表示是专用于hello.exe。然后0804这又是表示什么意思呢,这是微软定义的语言ID是一个十六进制数,例如简体中文的ID0x0804,而美国英语ID则是0409。其他国家的语言ID可以查看sdk中的Language Identifiers and Locales

     那系统怎么去实现识别应用使用哪一个mui文件呢?在系统注册表中HKEY_CURRENT_USER/Control/Panel/Desktop/MultiUILanguageId记录了系统的默认语言ID,所以系统会根据这个默认ID进行自动配置,而不需程序员再使用代码控制。但是有一点要注意的是mui文件和应用程序要放在同一个目录下。在使用vs生成mui文件时,可以通过对项目属性进行设置,让vs直接生成mui文件,在dll项目中项目属性”----“链接器”----“常规中的输出文件” $(OutDir)/your_mui_name,只需要修改your_mui_name为你相应mui文件名就可以。

     使用mui来实现多国语言版本的实现,不需要更改应用程序的代码,只需要直接添加或删除独立的mui文件,mui文件和应用程序是高分离的,方便管理。