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

2008-04-09 04:25:04来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:中国农历算法(delphi)

下一篇:Tchart分析报告