Monday, February 9, 2009

C/C++ i18n 国际化 多语言 解决方案 (Windows API)

这次先当回标题党.
i18n 程序员都是大懒蛋,我也不例外. i18n就是internationalization,国际化.
说白了就是能让一个程序显示不同的语言. 类是的还有l10n,本地化,一般是两种语言,其中一种是英语.

理论上讲,如果想要实现i18n,使用Unicode方案是必须,好在微软的NT平台是基于UTF-16的.
所有的ANSI程序都是通过内部转化为UTF-16实现,所以在NT下编写ANSI程序是不明智的.

扯远了,那C/C++做的Windows API程序怎么实现i81n呢.
有没有像.NET,STRUTS提供的那样的专用函数呢? 如果你只是想知道答案,那就是没有.真的没有.
我们只能使用程序控制的手段实现i18n.

那有哪些实现方法呢?

纯资源dll
ini语言文件
xml语言文件
自定义的语言数据文件
大多数的程序选择前3者.其中纯资源dll还有两种实现方案.

资源文件里面包含菜单,对话框,String表.
只包含String表
其中后者的本质是和方案2,3是一样的.这个是个程序员后能明白.

如果想追求效率,使用方案1的1方案,但是要修改就麻烦了.
最求绿色简单,String表,或者ini语言文件
最求全面,必然是选择xml

其他:
使用微软为使用XML提供了多套方案.如MSXML,XmlLite.但是小程序建议不要使用.因为他的依赖性比较高.
ini的话Windows API提供的几个函数,都是GetPrivateProfile和SetPrivateProfile开头的.不过微软表示这几个函数都是为了兼容16位Windows而存在.只支持ANSI字符集.相对不过通用.微软建议使用注册表存东西.(难道要我用注册表存多语言...)
使用DLL作为资源只要合理使用LoadLibrary和LoadString函数.

PS:今天不知道谁把bin32贴在cb上... 这下可好... 一个连内测水平都没到的软件半成品被几百个人下载去... 唉...

No comments:

Post a Comment