在一套英文软件上增加多语言功能,但是要能动态增加,要求是:我提供数据库给用户自己修改,当用户增加一种语言例如: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.   

    altans (龙纹剑) :
      你好
      你的意思是说每一个语种都动态产生吗?
      我做这个方案的时候有用到数据字典(自己创建的保存数据库中每一个字段信息的表),软件读标题时实际上是从数据字典中。
      我的MSN:[email protected]
      有什么问题你可以问我
      

  2.   

    我有一套,没开发好,舍不得.技术绝对先进.
    提示你一下:
    调用方式(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;
      

  3.   

    请你们注意,微软会是怎么做呢,他是不是有个这样的数据库或是用一个这样的INI呢,有谁知道也请说一声。
      

  4.   

    微软用dll,2025,1033等目录下面的东西
      

  5.   

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

  6.   

    还有:
    http://blog.csdn.net/tonylk/archive/2004/10/09/129955.aspx
      

  7.   

    看看这套元件
    www.acroprise.com.tw
    把元件放到主画面,不用修改你别的form的代码,就可以增加任意语言支持了。
    对任意第3方元件都可以扩展搞定。
      

  8.   

    看看这套元件
    www.acroprise.com.tw
    把元件放到主画面,不用修改你别的form的代码,就可以增加任意语言支持了。
    对任意第3方元件都可以扩展搞定。