www.Walzer.cn - Tech & Management Blog

Focus on mobile dev
本博客文章,未在标题中写明转载的, 均为原创.
所谓高手,也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

编译环境中的多国语言

Posted on 2006-02-05 12:59  Walzer  阅读(1050)  评论(0编辑  收藏  举报

作者:Walzer
日期:2005.8.31

今天遇到个郁闷事,我修改了IE的.rc文件,改过一些界面,这时候在PlatformBuilder里对IE进行Build and Sysgen Current Project,然后make run-time image,整个操作过程中platform settings里面始终设置default language为Simplified Chinese. 但build and sysgen current project出来后的结果系统为中文的,但是IE仍然为英文界面,不过修改处也体现出来了。

后来发现如果直接对整个platform sysgen,则生成的IE为中文的,但修改没有体现出来。因此初始的思路是MS提供了另外一个中文的.rc文件,或者在sysgen的时候根据某个表格去翻译语言。但我在遍历wince下所有.rc文件后并没有发现中文界面的资源文件,另外如果是根据表格翻译那么我删除的按钮不应该会再跑出来。

解决结果是:编译时.rc文件生成为.res文件,但MS只提供了英文的.rc文件,所以如果我build and sysgen current project的时候就把英文的.rc编译为英文的.res,然后包含到系统里去。所以界面为英文,修改处体现。而在整个系统sysgen的时候,会根据default language的id来选择.res文件。比如中文简体的ID是0804,平台为x86 emulator的debug版本,那么编译时将会拿ie\oak\lib\x86\debug\0804\下的.res来做界面。那么我们可以通过修改这些.res文件以在中文界面里体现修改。

最重要的一点是,虽然.res文件为.rc编译生成的二进制文件,用UltraEditor打开是看不出什么的,但仍然可以用eVC或Platform Builder打开修改,这让我很惊讶。打开后可以看到每个控件对应的ID不像.rc里面是个字符串,而是个数字。那么这个数字在resource.h里面和字符串用define关联起来,从而在程序里可以用字符串来代表相应控件。

在弄上面这些东西的时候,也发现了些有趣好玩的东西。

最开始想到的用一个表来替换界面上不同语言的短语词组,这个思路也被WINCE用了,只不过它不用来替换界面,而是替换注册表里的键值。打开WINCE500\PUBLIC\COMMON\OAK\FILES\INTLTRNS\0804\common.str文件,可以看到把一些LOC_XXXX define为中文字符串, 而这些LOC_XXXX就是在common.reg文件里用到的. 在INTLTRNS目录下可以根据language id来选择这个common.reg文件. 打开PBWorkspaces\porject\RelDir\Emulator_x86_Debug\也可以看到同样的做法, 该目录下那些数字名称的文件夹都是根据language id归类的.res文件,而intlfile和intltrns目录下则是根据language id归类的字符串替换表.

另外,在wince500\public\common\oak\files\目录下,有些数字名字的.txt文件,以前不知道这些是干什么的。实际上呢,是codepage, 也就是各种语言的ANSI和UNICODE转换表. codepage的编号和language id是不同的,但肯定就在哪个文件里相关联起来了。比如简体中文的language id是0804,codepages 936. 那么我们打开936.txt 里面就是中文简体汉字GBK码和UNICODE对应关系表。是否那有工夫我们可以做个编辑的宏,把里面的GB码全转成“哇”和“哈”,那么估计IE打开GB码的网页或者邮件看起来整个文件全是“哇哈哇哈哈哈哇哇哈”,用户没有笑死在地上的话, 那肯定是被气死的……