windows mobile多國語言實現[轉]

介紹一種多國語言的實現辦法,這也是微軟推薦的方式,打開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_USER\Control\Panel\Desktop\MultiUILanguageId記錄了系統的默認語言ID,所以系統會根據這個默認ID進行自動配置,而不需程序員再使用代碼控制。但是有一點要注意的是mui文件和應用程序要放在同一個目錄下。在使用vs生成mui文件時,可以通過對項目屬性進行設置,讓vs直接生成mui文件,在dll項目中”項目屬性”----“鏈接器”----“常規”中的”輸出文件” $(OutDir)/your_mui_name,只需要修改your_mui_name為你相應的mui文件名就可以。

使用mui來實現多國語言版本的實現,不需要更改應用程序的代碼,只需要直接添加或刪除獨立的mui文件,mui文件和應用程序是高分離的,方便管理。

轉載于:https://www.cnblogs.com/EricSu/archive/2010/11/17/1880107.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RTSP協議基本分析

目錄一、介紹二、RTSP與HTTP三、RTSP推流基本過程1、OPTION 查詢服務器端可用方法1.1、Client 請求1.2、Server 回復2、ANNOUNCE 發送媒體描述信息2.1、Client 請求2.2、Server 回復3、SETUP建立RTSP會話3.1、Client 請求(視頻流)3.2、Server 回復&#…

找取照片上的25個特征點,并保存結果

找取照片上的25個特征點,并保存結果 import numpy as np import cv2 from matplotlib import pyplot as plt img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/water1.png,1)#第一個參數為選擇照片的路徑,注意照片路徑最后一個為正斜杠其他都為反斜杠…

nutsdb與mysql_分享下 nutsdb 單機 1 億、10 億數據實測

大家好, 想給大家分享下我最近為 nutsdb 做的數據測試。測試項目起因事情起因是這個 issue ,簡單說就是內存高了,不夠用了。可能很多人不知道 NutsDB。簡單介紹下,NutsDB 是我幾個月以前開源的一個 Go 語言編寫的內嵌型 KV 數據庫…

java 方法 示例_帶有示例的Java EnumSetSupplementOf()方法

java 方法 示例EnumSet類complementOf()方法 (EnumSet Class complementOf() method) complementOf() method is available in java.util package. clipartOf()方法在java.util包中可用。 complementOf() method is used to contain all the elements of this EnumSet that are…

在需要時開啟Perl新特性

從5.10開始,新特性必須開啟才能使用。Perl默認不啟用新特性保持向后兼容。 如果想啟用新特性,可以使用新的-E開關。打開所有的新特性。 % perl5.10.1 -E say.pl #開啟5.10.1 版本的所有新特性 在源代碼中使用 use 指令之后指定perl版本號就可以了。 use …

P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介

目錄1. IPv4協議和NAT的由來2. NAT的工作模型和特點2.1、NAT的概念模型2.2、一對一的NAT2.3、一對多的NAT2.4、按照NAT端口映射方式分類2.4.1全錐形NAT2.4.2限制錐形NAT2.4.3端口限制錐形NAT2.4.4對稱型NAT3. NAT的限制與解決方案3.1、IP端到端服務模型3.2、NAT的弊端3.3、NAT穿…

決定孩子命運的八大關鍵問題

你可以不是天才,但你可以是天才的父母!樹立做父母正確的家庭教育觀念,為孩子建造一個良好的人生平臺,讓孩子有很好的人格修養,懂得做人,懂得成功的真正含義。簡單方便,容易操作,適合…

java calendar_Java Calendar internalGet()方法與示例

java calendar日歷類internalGet()方法 (Calendar Class internalGet() method) internalGet() method is available in java.util package. internalGet()方法在java.util包中可用。 internalGet() method is used to get the value of the given field(fi) of this Calendar …

顯示照片的二維直方圖

顯示照片的二維直方圖 import cv2 from matplotlib import pyplot as plt img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/water1.png,1)#第一個參數為選擇照片的路徑,注意照片路徑最后一個為正斜杠其他都為反斜杠;第二個參數,其中1表示…

周五怎么表示 mysql_完美起航-MySQL找每個月最后一個星期五--函數定義與使用

數據庫作業有一道題是這樣子的:有一張名叫emp的表記錄員工信息,其中有如下字段 HIREDATE 表示員工被雇用的日期:然后問題是這樣的:q7.Show details of employee hiredates and the date of their first payday.(Paydays occur on…

要想能安心,必須先死心。

其實,不論是感情,還是學習、工作還是生活,不都是如此?曾經年少懷抱一個名校夢,如果高考不成功,那么你一定會選擇考研讓自己死一次心;小時候特別喜歡 某個職業,長大了你拋棄所有機會追…

silverlight學習總結【完】

以下內容是個人理解,不保證正確性。且假設使用C#,并且有一定的相關知識和XML基礎。 silverlight是什么,能做什么 silverlight用XAML來做前端界面,用.NET或者JS作為程序腳本支持,在瀏覽器內外運行的應用。可以認為和FLA…

P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解

目錄1、內容概述2、反向鏈接技術:一種特殊的P2P場景(通信雙方中只有一方位于NAT設備之后)3、基于UDP協議的P2P打洞技術詳解3.1、原理概述3.2、典型P2P情景1: 兩客戶端位于同一NAT設備后面(即相同內網中)3.3…

Java Byte類的compareTo()方法和示例

簡短的類compareTo()方法 (Short class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for this Byte object against the given Byte objec…

顯示照片的RGB直方圖

顯示照片的RGB直方圖 import numpy as np import cv2 as cv from matplotlib import pyplot as plt img cv.imread(E:\Python-workspace\OpenCV\OpenCV/BEYOND.png,1)#第一個參數為選擇照片的路徑,注意照片路徑最后一個為正斜杠其他都為反斜杠;第二個參…

OUT還開通博客!

現在哪有人還在玩博客哦,哎試試,記錄一下自己開發網站的點滴吧!轉載于:https://www.cnblogs.com/17say/archive/2013/02/18/2915125.html

網站V5的一些想法(轉)

V5即將到來,面對“全新”的V5,前端這塊自然也要借這次改版的機會,將我們前端的一些想法實踐到V5中去,實現一次跨越。 1 嘗試模塊化的代碼書寫(html、css等) 模塊化的目的是為了提高代碼的重用性、擴展性、可維護性 2 文件引用使用…

mysql慢查詢開啟語句分析_mysql慢查詢語句分析總結

我們經常會接觸到MySQL,也經常會遇到一些MySQL的性能問題。我們可以借助慢查詢日志和explain命令初步分析出SQL語句存在的性能問題通過SHOW FULL PROCESSLIST查看問題SHOW FULL PROCESSLIST相當于select * from information_schema.processlist可以列出正在運行的連…

P2P技術詳解(三):P2P中的NAT穿越(打洞)方案詳解(進階分析篇)

目錄1、NAT和NAPT2、NAT帶來的問題3、P2P通信穿越NAT的技術、方法4、NAT穿越技術1:應用層網關4.1、原理4.2、限制5、NAT穿越技術2:中間件技術5.1、原理5.2、限制6、NAT穿越技術3:打洞技術(Hole Punching)6.1、原理6.2、方法6.2.1NAT行為類型與…

Java BufferedReader reset()方法及示例

BufferedReader類的reset()方法 (BufferedReader Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset the stream to the most recent mark of this stream. reset()方法用于將流重置為該…