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.mzph.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()方法用于将流重置为该…