Delphi怎样支持多国语言
1.创建一个工程MultiLanguage,在Form上放一个Label和一个Button,分别把Caption赋值为“EnglishLabel”和“EnglishBut...
1.创建一个工程MultiLanguage, 在Form上放一个Label和一个Button, 分
别把Caption赋值为“English Label”和“English Button”。
2.选择菜单Project|Languages|Add ..., Delphi显示Add Languages对话框, 选择Next。
3.从语言列表中选中“英语(美国)”和“中文(中国)”, 选择Next。
4.ITE会根据所选的语言创建子目录,目录名称是语言的缩写,选择Next。
5.第一次增加语言时, Update Mode固定为Create new, 选择Next。
6.选择Finish。
Delphi会自动创建支持不同语言的资源动态库。
Delphi还会自动创建一个工程组, 其中包括原有的MultiLanguages.EXE, 还包括新建
的两个资源动态库 (MultiLanguages.enu, MultiLanguages.chs)。保存工程组。
Delphi启动Translation Manager, ...
选择“中文(中国)”|Forms|Unit1, 填写翻译后的中文。保存并关闭。
打开Project Manager, 编译MultiLanguages.enu和MultiLanguages.chs, Delphi会在
相应的子目录生成资源动态库(我的目录下有三个文件 扩展名分别是 rc rcn res )
问题:
我不明白最后怎么调用,弄了半天也没成,谁给讲讲? 最好能包括
1、静态调用
我把 扩展名为rc rcn res的 三个文件和程序考到一个目录
运行后没有变化啊???到底怎怎么用啊
2、动态调用
比如我现在是中文界面,如何在程序运行时更改为英文界面。 展开
别把Caption赋值为“English Label”和“English Button”。
2.选择菜单Project|Languages|Add ..., Delphi显示Add Languages对话框, 选择Next。
3.从语言列表中选中“英语(美国)”和“中文(中国)”, 选择Next。
4.ITE会根据所选的语言创建子目录,目录名称是语言的缩写,选择Next。
5.第一次增加语言时, Update Mode固定为Create new, 选择Next。
6.选择Finish。
Delphi会自动创建支持不同语言的资源动态库。
Delphi还会自动创建一个工程组, 其中包括原有的MultiLanguages.EXE, 还包括新建
的两个资源动态库 (MultiLanguages.enu, MultiLanguages.chs)。保存工程组。
Delphi启动Translation Manager, ...
选择“中文(中国)”|Forms|Unit1, 填写翻译后的中文。保存并关闭。
打开Project Manager, 编译MultiLanguages.enu和MultiLanguages.chs, Delphi会在
相应的子目录生成资源动态库(我的目录下有三个文件 扩展名分别是 rc rcn res )
问题:
我不明白最后怎么调用,弄了半天也没成,谁给讲讲? 最好能包括
1、静态调用
我把 扩展名为rc rcn res的 三个文件和程序考到一个目录
运行后没有变化啊???到底怎怎么用啊
2、动态调用
比如我现在是中文界面,如何在程序运行时更改为英文界面。 展开
1个回答
展开全部
Delphi的多语言是这么用的,但是添加多语言后编译连接速度很慢,有时候10来分钟。
可以把你的Delphi的窗体文件分给翻译来翻译,如果是Delphi7,需要先用Conver.exe来转换为文本格式。
1、Project-New Application 创建你的中文版软件。
2、Project-Language-Add 添加你的语言,比如美国英语(ENU)。或者File-New-Others-Dll Wizard
3、保存后生成多个文件夹。
4、Project-Build All
5、程序目录下生成和工程文件同名的语言文件:MyExe.ENU;MyExe.CHN,软件发布需要带这些文件。
6、把软件里面所有字符串定义为资源字符串。
resourcestring
C_AppTitle = 'xx管理系统';
C_Error = '错误';
C_Warning = '警告';
7、在软件中用如下代码切换语言:
const
//定义你的多语言:
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;
uses
ReInit;
...
if LoadNewResourceModule(ENGLISH) <> 0 then
begin
ReInitializeForms();
end;
更多请参考Delphi帮助,里面写得更清楚。
其实感觉最好还是用INI文件
把所有语言条目提取出来记录,并且将INI翻译成多份(多种语言),程序启动时从INI文件中加载语言。
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格式的语言文件):
可以把你的Delphi的窗体文件分给翻译来翻译,如果是Delphi7,需要先用Conver.exe来转换为文本格式。
1、Project-New Application 创建你的中文版软件。
2、Project-Language-Add 添加你的语言,比如美国英语(ENU)。或者File-New-Others-Dll Wizard
3、保存后生成多个文件夹。
4、Project-Build All
5、程序目录下生成和工程文件同名的语言文件:MyExe.ENU;MyExe.CHN,软件发布需要带这些文件。
6、把软件里面所有字符串定义为资源字符串。
resourcestring
C_AppTitle = 'xx管理系统';
C_Error = '错误';
C_Warning = '警告';
7、在软件中用如下代码切换语言:
const
//定义你的多语言:
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;
uses
ReInit;
...
if LoadNewResourceModule(ENGLISH) <> 0 then
begin
ReInitializeForms();
end;
更多请参考Delphi帮助,里面写得更清楚。
其实感觉最好还是用INI文件
把所有语言条目提取出来记录,并且将INI翻译成多份(多种语言),程序启动时从INI文件中加载语言。
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格式的语言文件):
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询