介紹一種多國語言的實現辦法,這也是微軟推薦的方式,開啟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檔案和應用程式是高分離的,方便管理。