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”等,即是说快捷方式无法多国语言化,这可能是微软遗留下的问题,似乎没有找到什么解决的办法,折中的做法是用英文作为默认语言。