浪曦网-国内顶级IT视频网络编程教育平台Www.LangSin.Com
delphi中国际化的几种方案及比较
该
文档由国内顶级IT视频教育平台浪曦网整理发布
随着全球化程度加深,
软件越来越像蒲公英,到处飘散、扎根。这其中要解决的是不同语言的显示问题。我们当然希望一套程序,可以不修改代码就可以支持不同的语言,不要去维护很多的版本。
首先要谈到的一个问题是乱码问题,因为delphiwin32到11.x版还是不支持unicode,所以一般使用Ansi码,有这样几种情况会显示乱码:
使用的语言文字与系统当前设定的语言不一样;比如简体版QQ在繁体操作系统(或简体操作系统的区域设置中“非Unicode程序的语言”设定为繁体)就是乱码。即使改变
Font.Charset,某些元件仍然会出现乱码,如StatusBar。因此,在越南文版的windows显示越南文,在伊朗文版的windows显示伊朗文,不要在越南文版windows显示伊朗文,在伊朗文版windows显示越南文,这样就能确保没有乱码问题。好在一般这样的错位用法也不多见。
系统没有安装你要显示的语言的语言包;
如果你要保证完全无乱码,必须考虑使用unicode码,使用成套的支持unicode的元件,如tnt,但它在UI变现上比较单一,你不可能不使用别的元件。
言归正传,首先,看看哪些地方的字串需要实现多语言,并来看看各种实现方法的优劣。1、界面上的元件,如TButton的Caption;2、主动弹出的消息,如ShowMessage('Areyousure?'),RaiseException.Create('Error!');3、例外错误举发的
报告信息,如f/0引起的exception;4、第3方元件包内部的上述字串;
实现多语言的方法很多,列举一二:1、delphi自带的Resource生成工具
此工具把专案的dfm文件里的所有字串以及pas中定义为ResourceString的字串列举出来,按不同的语言编译成不同的Resource,专案编译前先选语言,每种语言编译成一个exe。这个工具使用很不方便,不是一个完整的解决方案,跟Borland的Midas的demo一样
(TClientDataSet通过ProviderName连接到RemoteDatamodule的TDataSetProvider,实际开发Erp系统时,谁会放100个TDataSetProvider连接到100个TDataSet?),只是一个原理尚通的示范。
首先,由于dfm本身也是资源文件的一部分,因此每次修改都要“UpdateResource
DLLs...”,如修改Button1为Button2,如果你忘了,运行时就会报“找不到资源Button1的错误”;提供的字典编辑画面中,出了字串,还有Left/Top等资料;字典不能重用,在一个模组翻译了,在第2个模组还要再翻译相同的词。
其次,每种语言一个exe/bpl,如果你的系统是Package切割,bpl也是每种语言一个,还
浪曦网-国内顶级IT视频网络编程教育平台Www.LangSin.Com
浪曦网-国内顶级IT视频网络编程教育平台Www.LangSin.Com
要小心别把不同语言的bpl组合在了一起,到时候一个画面显示中文,一个显示德文(有一个可能是乱码)就惨了。
再次,在作bpl组装的系统时,第3方元件如果没有提供多语言的
方案,你就需要修改第3方元件,但一般我们不这样干,因为第3方元件会随时更新,难道每次人家更新你也再更新人家。
因此,一般都没有人使用Delphi本身提供的这个方案(除了作demo)。2、Resourcedll方式
用单独的ResourceDll,用LoadResString等函数获得翻译字串,但你要到处写这个函数来一一替换,特别是Form上的字串,噢,会累死人。字典可以重用。3、网上讨论很多的ini文件方式
此方法是写个替换的引擎,在运行时从ini文件读取语言字串来替换画面元件的显示文字。这个方法比第一种进步很多,不需要每种语言编译一个exe了,只要提供不同的ini文件就好;画面修改时如果ini没有同步更新也不会出现致命错误,最多就是某个文字没