WINCE多国语言支持

时间:2021-11-17 17:52:01
 

       WINCE多国语言支持的做法是通过切换按语言生成的资源文件来实现。因为系统本身是用的UNICODE,所以只是在字符串做切换和相应的字库支持就行了。

 

一、生成多国语言支持的系统

1、打开Platform Builder 5的菜单[Platform]-->[Settings]-->[Locale]选项页,加入想要的语言,并且选择一个作为默认语言;在[Custom Build Actions]选项页,“Build Step”下拉框中选“Pre-Make Image”,用“New”按键加入预编译命令“createmui 0409,0804”。

       注,这里以简体中文和美国英语为例,其中:

       0409: English(U.S.)

       0804: Chinese(PRC)

2、添加组件:SYSGEN_MULTIUI、SYSGEN_CORELOC。如果不知道这些组件在哪里,在Catalog中按Ctrl+F查找吧。

3、添加字体:SYSGEN_FONTS_SIMSUN_2_5、SYSGEN_GB18030、SYSGEN_AGFA_FONT等。加入什么语言,就添加相应的字体。

4、编译(Sysgen)。

 

二、让应用程序也支持多国语言

1、资源文件命名:

Createmui工具会生成multiui.bib文件:

MODULES

;  Name            Path                                     Memory Type

;  --------------  ---------------------------------------------  -----------

aygshell.dll.0409.mui  $(_FLATRELEASEDIR)\aygshell.dll.0409.mui  NK  SH

……

查看这个文件可知,各种语言的资源文件命名方式为:

执行程序文件名 + .语言代号 + .mui

假设我们写了一个控制面板程序,名为tcpl.cpl,则美国英语的资源名为tcpl.cpl.0409.mui。

2、创建资源文件:

       把原始程序的资源全部提取出来,编写成一个DLL,这个DLL只有资源,这里的资源要求必须包括原程序中RC文件所涵盖的所有资源,包括图片,图标,窗体,字符表(String table)等所有的资源,一般把资源文件复制过来,并把这些资源翻译成目标语言即可。请参考Source文件:

TARGETNAME=TCpl.cpl.0409

DEFFILE=TCpl.def <--导出函数为空

RELEASETYPE=PLATFORM

TARGETTYPE=DYNLINK

TARGETLIBS= $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib

INCLUDES=$(INCLUDES);

SOURCES=TCpl.rc

       在Platform.bib文件中:

       TCpl.cpl  $(_FLATRELEASEDIR)\TCpl.cpl  NK  SH

       TCpl.cpl.0409.mui  $(_FLATRELEASEDIR)\TCpl.cpl.0409.dll  NK  SH

 

三、多国语言程序切换

#define MAKELANGID(p, s) ((((WORD)(s))<<10)|(WORD)(p))

unsigned short SLANGID;

SLANGID = MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);

SetUserDefaultLCID(SLANGID);

SetSystemDefaultLCID(SLANGID);

SetUserDefaultUILanguage(SLANGID);

PostMessage(HWND_BROADCAST, WM_WININICHANGE,0, INI_INTL);

KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);

 

四、遗留的问题

       在使用中文版为默认语言后,如果把语言切换到英文后,依然可以看见在系统根目录下,有中文字的“控制面板.lnk”等,即是说快捷方式无法多国语言化,这可能是微软遗留下的问题,似乎没有找到什么解决的办法,折中的做法是用英文作为默认语言。