分享
 
 
 

如何从现有程序升级到支持多国语言的程序!

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

CSDN上有朋友问起如何从已经完成的项目升级到使用多国语言的程序,相信很多朋友也并非从项目的一开始就使用TLMPack的(也确实没有这个必要),下面我就简单的介绍一下怎么样将已有的项目升级为支持多国语言的项目。

1。在Delphi(或BCB)中安装TLMPack标准版,关于如何安装帮助文件中有比较详细的说明了,这里不在累述了。(当然安装标准版的前提是你使用标准的AnsiVCL控件来开发的程序,如果你使用 TntUnicode控件来开发程序,那么相对应,必须使用Unicode版的TLMPack)。

2。打开你需要升级成多国语言的工程,在每一个Form(以及 QReport,Module等)上放置一个TtlmController控件,这个控件的作用是自动改变其所在Form上所有控件的显示文字,一般情况下只需要将该控件放置在Form上就可以了,不需要作任何设置。

3。Form上的控件现在已经可以自己根据语言设置的变换而自动更新了,那么像MessageBox()这样的函数中显示的文字怎么办呢,答案是使用TtlmController的Translate()函数,这个函数可以自动到当前使用的语言文件中取得文字资源然后作为返回值返回出来,假设已有一段函数是这样的:

代码:

procedure TForm1.Button1Click(Sender:TObject);

begin

MessageBox(Handle, PChar('Say hello to the user!'), 'Message', MB_ICONINFORMATION);

end;

那么你需要将文字的部分使用Translate函数包装起来,包装后就像这样:

代码:

procedure TForm1.Button1Click(Sender:TObject);

begin

MessageBox(Handle, PChar(tlmController1.Translate('SayHello', 'Say hello to the user!')), 'Message', MB_ICONINFORMATION);

end;

前面的‘SayHello’是对文字的标识,通过这个标识程序才能从语言文件中找到正确的资源,后面的文字作用是当语言文件中不存在需要寻找的资源(或者语言文件不存在时),该函数默认所返回的内容。

另外,Translate函数还支持同Format()函数一样的参数显示,如这样:

代码:

procedure TForm1.Button1Click(Sender:TObject);

begin

MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION);

end;

4。以上的MessageBox()函数是出现在Form中的,并且该Form中已经有TtlmController控件了,所以才可以使用TtlmController的Translate()函数进行文字的转换,那么如果你的工程中有一个直接从TObject继承而来的功能类,它也需要显示Message,或者需要记载Log文字等,这时候该怎么办呢,最简单的方法是让这个功能类去调用某个Form中的TtlmController的Translate()函数,但是这样的缺点是程序可能需要为此做较大的改动,另外语言文件中的文字也将变得混乱不堪。那么这个时候最好的解决方案就是使用TtlmObject类,该类同TtlmController类一样,也有 Translate函数可以使用,但是区别是它不会侦测所在Form的所有控件,不会对它们进行自动转换。

以下这个类是个小型的功能类。

代码:

interface

uses

....;

type

TFunctionClass = class(TObject)

public

procedure ShowMessage();

end;

impenmentation

procedure TFunctionClass.ShowMessage();

begin

ShowMessage(nil, 'Say hello to the user!', 'Message‘, MB_ICONINFORMATION);

end;

end.

使用TtlmObject类后,该类被改造为:

代码:

interface

uses

...., TLMObject;

type

TFunctionClass = class(TObject)

private

FtlmObject:TtlmObject;

public

constructor Create();

destructor Destroy();override;

procedure ShowMessage();

end;

impenmentation

constructor TFunctionClass.Create();

begin

inherited Create();

FtlmObject:=TtlmObject.Create(self);

end;

destructor TFunctionClass.Destroy();

begin

FtlmObject.Free;

inherited Destroy();

end;

procedure TFunctionClass.ShowMessage();

begin

MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION);

end;

end.

这样每当使用该功能类中需要文字显示的函数时,真正使用的文字就是语言文件中记载的内容了。

5。TLMPack是从外部语言文件来加载语言文字的,由于完全手工写一个语言文件是一件比较枯燥的事,所以你可以使用向导控件来由程序,如果你打算自己手工来撰写一个语言文件,那么可以忽略该小节。

所谓的向导控件是指:TtlmIniGenerator和TtlmXmlGenerator这两个控件,它们会在程序运行时,将所有原本需要 TtlmController和TtlmObject读取的文字,反向输出到语言文件中,你所要做的就是在程序的主窗体上放置一个 TtlmIniGenerator(这里假设你要输出的是Ini格式的语言文件),然后运行程序,程序运行的过程中会首先出现一个设置对话框,询问生成语言文件的路径,以及字符集格式等,一般使用默认的设置直接OK就可以了,该提示对话框如下图:

以后每当程序中有需要转换文字的代码被调用到,TtlmIniGenerato都会出现一个提示对话框,提示你实际保存到文件中的实际文字内容是什么,一般情况下在这一步都不需要修改任何文字,直接让它输出就可以了。你所要做的就是保证程序的每一个需要文字显示的代码都被走到一遍,不然文字是不会被输出的,该对话框如下图所示:

6。现在,假设你已经通过第4步成功的建立了语言文件,或者你自己手工写了这么一个文件,接着要做的就是将那个语言文件作为模板,将它复制成不同扩展名的多个文件(关于每种语言所对应的扩展名,有严格的要求,请参考帮助文件中的“字符集”一节),然后针对每种语言修改语言文件中的文字,以及记得修改语言文件中的General段中的信息,每种语言的内容都不同,你可以通过帮助文件的“字符集”一节来获知它的具体写法。

7。最后一步,如果刚才主Form上放置过了 TtlmIniGenerator,那么删除它。在主Form上放置一个TtlmIniFilter(如果你使用的是Xml格式的语言文件,那么需要放置 TtlmXmlFilter),并且设置它的文件路径等属性,以让它能够正确找到语言文件,并且书写代码控制 TtlmIniFilter.ActiveLanguage属性,以达到运行时切换语言的效果,好了,运行程序,修改一下语言试试,程序是不是立刻切换了语言了呢,不论是界面还是显示的Message,就好像程序根本就是用这种语言开发的一样。。。是不是很棒?!

TLMPack可以从这里下载:

http://www.tonixsoft.com/index.php?mmenu_id=0003

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有