介紹一種多國語言的實現辦法,這也是微軟推薦的方式,打開windows mobile下的windows目錄可以看到有很多以MUI為後綴名的文件,例如shellres.dll.0804.mui、 shell.dll.0804.mui。。。。。。我們可以用eXeScope.exe或者resources hacker這樣的文件查看器查看一下這些文件究竟是怎麼一回事,不難發現文件裡面都是一些資源ID和相對應的字符串。也許你就疑惑這是為什麼呢?這些文件有什麼作用呢?下面分解。
MUI是Multilingual User Interface的縮寫,意為多語言用戶界面,主要是用來實現軟件的國際化,也就是軟件的多國語言版本的實現。其實一個mui文件也是一個DLL來的,但是這個dll有點特殊,不像我們以往的帶來了那樣包含了很多的函數體供dll外或者本身調用,而是只包含字符串資源,所以可以在vs下新建一個dll項目,不需要其他代碼,只需要dll的入口點如下:
#include "windows.h"
/////////////////////////////////////////////////////////////////////////////
// DLL Entry Point
extern "C"
BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
除此以外,剛才也提到了,dll裡只包含字符串資源,所以必須添加一個資源配置文件如***.rc,在裡面添加相應的字符串資源信息,如下:
IDR_HELLO_MENUBAR MENU DISCARDABLE
BEGIN
MENUITEM "Exit", PSP_DLGINDIRECT
POPUP "Menu"
BEGIN
MENUITEM "Exit", PSP_DLGINDIRECT
MENUITEM "Test", ID_MENU_TEST
END
END
在這裡要特別注意了,因為每一個mui也就是說每一個dll就代表一種語言,所以在資源配置文件裡就是通過對每個字符串資源進行相應語言的更改達到多國語言的效果,例如你要做成簡體中文版本,你就必須在重新建一個dll,同樣建立一個資源配置文件,但是得把剛才上面的這段資源配置腳本代碼改成如下:
IDR_HELLO_MENUBAR MENU DISCARDABLE
BEGIN
MENUITEM "退出", PSP_DLGINDIRECT
POPUP "菜單"
BEGIN
MENUITEM "退出", PSP_DLGINDIRECT
MENUITEM "測試", ID_MENU_TEST
END
END
然後可以通過把定義資源ID的resources.h這個文件共享出來,讓多個mui文件和應用程序用同一個資源ID。
同時你還需要在dll項目添加一個導出文件如***.def,其實不需要導出函數名如下就可以:
LIBRARY "hello.exe.0804.mui"
EXPORTS
也許你還會問,那應用程序怎麼去通過匹配相應的mui文件來進行語言的定位?請看。
剛才說到windows目錄下有shellres.dll.0804.mui,其實mui文件的命名有一定的規則可循,可不是亂來的,首先 shellres.dll表明這個mui文件是專門用於shellres.dll多國語言版本,再例如hello.exe.0804.mui這個表示是專用於hello.exe。然後0804這又是表示什麼意思呢,這是微軟定義的語言ID是一個十六進制數,例如簡體中文的ID就是0x0804,而美國英語 ID則是0409。其他國家的語言ID可以查看sdk中的Language Identifiers and Locales。
那系統怎麼去實現識別應用使用哪一個mui文件呢?在系統注冊表中HKEY_CURRENT_USERControlPanel DesktopMultiUILanguageId記錄了系統的默認語言ID,所以系統會根據這個默認ID進行自動配置,而不需程序員再使用代碼控制。但是有一點要注意的是mui文件和應用程序要放在同一個目錄下。在使用vs生成mui文件時,可以通過對項目屬性進行設置,讓vs直接生成mui文件,在dll項目中”項目屬性”----“鏈接器”----“常規”中的”輸出文件” $(OutDir)/your_mui_name,只需要修改your_mui_name為你相應的mui文件名就可以。
使用mui來實現多國語言版本的實現,不需要更改應用程序的代碼,只需要直接添加或刪除獨立的mui文件,mui文件和應用程序是高分離的,方便管理。