在一套英文软件上增加多语言功能,但是要能动态增加,要求是:我提供数据库给用户自己修改,当用户增加一种语言例如:chinese,然后用户将数据库中的英文翻译成中文并存在数据库中,软件上就相应增加一种语言功能,上次 伤心郁闷中 给我以下方案,但是好象不态适合,不过这套方案让我学到好多dd(毕竟我刚学delphi^O^),谢谢 伤心郁闷中 了。谁有更好的方案,能发一份给我吗,先谢谢了。Email:[email protected]
伤心郁闷中 的方案:
1.定义一个全系统的基类Form(如果有的话,就在你的基类form中写)
2.将需要读取的标题信息都防到ini中(每一种语言一种ini)
3.procedure TfBase.pdReadCaptions(Sender:TControl;Const aHeader:String);
var
lnComp,i:Integer;
Inifile:Tinifile;
begin
try
Inifile:=Tinifile.Create(g_StrFileName);
if Sender=Self then
begin
Caption:=Inifile.ReadString(aHeader,'Caption',Caption);
Font.Size:=s_nFontSize;
Font.Name:=s_StrFontName;
ParentFont:=True;
end; //
with TControl(Sender) do
for lnComp:=0 to ComponentCount-1 do
begin
if (Components[lnComp] is TCommonDialog) then
Continue; //Panel
if (Components[lnComp] is TPanel) then
begin
TPanel(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TPanel(Components[lnComp]).Name,'');
TPanel(Components[lnComp]).Font.Size:=s_nFontSize;
TPanel(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //DbCheckBox
if (Components[lnComp] is TDbCheckBox) then
begin
TDbCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TDbCheckBox(Components[lnComp]).Name,'');
TDbCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
TDbCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //Button
if (Components[lnComp] is TButton) then
begin
TButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TButton(Components[lnComp]).Font.Size:=s_nFontSize;
TButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//CheckBox
if (Components[lnComp] is TCheckBox) then
begin
TCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
TCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//GroupBox
if (Components[lnComp] is TGroupBox) then
begin
TGroupBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TGroupBox(Components[lnComp]).Font.Size:=s_nFontSize;
TGroupBox(Components[lnComp]).Font.Name:=s_StrFontName;
continue;
end;
//RadioButton
if (Components[lnComp] is TRadioGroup) then
begin
TRadioGroup(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//SpeedButton
if (Components[lnComp] is TSpeedButton) then
begin
TSpeedButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TSpeedButton(Components[lnComp]).Font.Size:=s_nFontSize;
TSpeedButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//StaticText
if (Components[lnComp] is TStaticText) then
begin
TStaticText(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TStaticText(Components[lnComp]).Font.Size:=s_nFontSize;
TStaticText(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//LabeledEdit
if (Components[lnComp] is TLabeledEdit ) then
begin
TLabeledEdit(Components[lnComp]).EditLabel.Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//MenuItem
if (Components[lnComp] is TMenuItem) then
begin
TMenuItem(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//Label
if (Components[lnComp] is TLabel ) then
begin
TLabel(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TLabel(Components[lnComp]).Font.Size:=s_nFontSize;
TLabel(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//TabSheet
if (Components[lnComp] is TTabSheet) then
begin
TTabSheet(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TTabSheet(Components[lnComp]).Font.Size:=s_nFontSize;
TTabSheet(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//RadioButton
if (Components[lnComp] is TRadioButton) then
begin
TRadioButton(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TRadioButton(Components[lnComp]).Font.Size:=s_nFontSize;
TRadioButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //Frame 框架里的东西
if (Components[lnComp]) is TFrame then
for i:=0 to TFrame(Components[lnComp]).ComponentCount-1 do
pdReadCaptions(TFrame(Components[lnComp]),Copy(TFrame(Components[lnComp]).ClassName,2,length(TFrame(Components[lnComp]).ClassName)));
//
end;
finally
Inifile.Free;
end;
end;
伤心郁闷中 的方案:
1.定义一个全系统的基类Form(如果有的话,就在你的基类form中写)
2.将需要读取的标题信息都防到ini中(每一种语言一种ini)
3.procedure TfBase.pdReadCaptions(Sender:TControl;Const aHeader:String);
var
lnComp,i:Integer;
Inifile:Tinifile;
begin
try
Inifile:=Tinifile.Create(g_StrFileName);
if Sender=Self then
begin
Caption:=Inifile.ReadString(aHeader,'Caption',Caption);
Font.Size:=s_nFontSize;
Font.Name:=s_StrFontName;
ParentFont:=True;
end; //
with TControl(Sender) do
for lnComp:=0 to ComponentCount-1 do
begin
if (Components[lnComp] is TCommonDialog) then
Continue; //Panel
if (Components[lnComp] is TPanel) then
begin
TPanel(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TPanel(Components[lnComp]).Name,'');
TPanel(Components[lnComp]).Font.Size:=s_nFontSize;
TPanel(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //DbCheckBox
if (Components[lnComp] is TDbCheckBox) then
begin
TDbCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TDbCheckBox(Components[lnComp]).Name,'');
TDbCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
TDbCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //Button
if (Components[lnComp] is TButton) then
begin
TButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TButton(Components[lnComp]).Font.Size:=s_nFontSize;
TButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//CheckBox
if (Components[lnComp] is TCheckBox) then
begin
TCheckBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TCheckBox(Components[lnComp]).Font.Size:=s_nFontSize;
TCheckBox(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//GroupBox
if (Components[lnComp] is TGroupBox) then
begin
TGroupBox(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TGroupBox(Components[lnComp]).Font.Size:=s_nFontSize;
TGroupBox(Components[lnComp]).Font.Name:=s_StrFontName;
continue;
end;
//RadioButton
if (Components[lnComp] is TRadioGroup) then
begin
TRadioGroup(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//SpeedButton
if (Components[lnComp] is TSpeedButton) then
begin
TSpeedButton(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TSpeedButton(Components[lnComp]).Font.Size:=s_nFontSize;
TSpeedButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//StaticText
if (Components[lnComp] is TStaticText) then
begin
TStaticText(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TStaticText(Components[lnComp]).Font.Size:=s_nFontSize;
TStaticText(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//LabeledEdit
if (Components[lnComp] is TLabeledEdit ) then
begin
TLabeledEdit(Components[lnComp]).EditLabel.Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//MenuItem
if (Components[lnComp] is TMenuItem) then
begin
TMenuItem(Components[lnComp]).Caption:=Inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
Continue;
end;
//Label
if (Components[lnComp] is TLabel ) then
begin
TLabel(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TLabel(Components[lnComp]).Font.Size:=s_nFontSize;
TLabel(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//TabSheet
if (Components[lnComp] is TTabSheet) then
begin
TTabSheet(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TTabSheet(Components[lnComp]).Font.Size:=s_nFontSize;
TTabSheet(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end;
//RadioButton
if (Components[lnComp] is TRadioButton) then
begin
TRadioButton(Components[lnComp]).Caption:=inifile.ReadString(aHeader,TControl(Components[lnComp]).Name,'');
TRadioButton(Components[lnComp]).Font.Size:=s_nFontSize;
TRadioButton(Components[lnComp]).Font.Name:=s_StrFontName;
Continue;
end; //Frame 框架里的东西
if (Components[lnComp]) is TFrame then
for i:=0 to TFrame(Components[lnComp]).ComponentCount-1 do
pdReadCaptions(TFrame(Components[lnComp]),Copy(TFrame(Components[lnComp]).ClassName,2,length(TFrame(Components[lnComp]).ClassName)));
//
end;
finally
Inifile.Free;
end;
end;
解决方案 »
- 这个代码可以修改其他程序的listview的节点值,于是乎我想能不能修改一个dbgrid。用 Spy++ 抓了个dbgrid的句柄 测试,未果! 大家伙别忙看看
- QRBand1BeforePrint 的奇怪问题,期待解决
- 表内字段根据字段不同做同一个字段的相减
- 关于timer的问题
- 动态数组的创建呀急呀
- application.MessageBox (str(ftrs.Count),'',0);
- delphi里将123.45数值转换为one hundred twenty three zero forty five 的函数!!!急急急!!1
- 使用TWebBrowser时,怎样设置打印选项
- sqlserver的时间问题
- 各位大虾,我是个delphi初学者,在编数据报表时碰到以下问题
- 关于程序用dxgettext实现本地化的问题(多语言)。
- 关于取数据的一个问题(不好意思,真的是没分给啦,帮个忙啦)
你好
你的意思是说每一个语种都动态产生吗?
我做这个方案的时候有用到数据字典(自己创建的保存数据库中每一个字段信息的表),软件读标题时实际上是从数据字典中。
我的MSN:[email protected]
有什么问题你可以问我
提示你一下:
调用方式(Uses的单元你自己查帮助):
procedure SetStrProPerty(SpecCom: TComponent; PropertyName: String; StrValue: String);
var
ProPertyInfo: PpropInfo;
begin
ProPertyInfo:=GetPropInfo(SpecCom.ClassInfo,PropertyName);
if (ProPertyInfo <> nil) and
((ProPertyInfo.PropType^.Kind = tkWString) or
(ProPertyInfo.PropType^.Kind = tkLString) or
(ProPertyInfo.PropType^.Kind = tkString))
then
SetStrProp(SpecCom, ProPertyInfo, StrValue);
end;
http://blog.csdn.net/tonylk/archive/2004/10/09/129955.aspx
www.acroprise.com.tw
把元件放到主画面,不用修改你别的form的代码,就可以增加任意语言支持了。
对任意第3方元件都可以扩展搞定。
www.acroprise.com.tw
把元件放到主画面,不用修改你别的form的代码,就可以增加任意语言支持了。
对任意第3方元件都可以扩展搞定。