zoukankan      html  css  js  c++  java
  • 利用INI文件实现界面无闪烁多语言切换

    越来越多的程序使用了多国语言切换,虽然Delphi自带多语言包的添加和配置,

    但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,

    用这种方法,不但简单易行,而且在切换的时候不会出现界面的闪烁。

    我们从一个例子出发,看看怎么实现语言的切换。首先建立一个新工程。放置如下组件:(如图)

      MainMenu1: TMainMenu;

       File1: TMenuItem;

       Exit1: TMenuItem;

       Label1: TLabel;

       Button1: TButton;

       CheckBox1: TCheckBox;

       CheckBox2: TCheckBox;

       Button2: TButton;

       Label2: TLabel;

       ComboBox1: TComboBox;

       Label3: TLabel;

    由于要读取Ini文件,所以在USES中加入声明IniFiles;

    然后将Button1和Button2的ShowHint属性设置为True;

    其中我们用ComboBox1来显示可供选择的语言和用来选择语言。

    我们在程序的目录下编辑如下的Chinese GB.Ini文件:

    ;///////////////////////////////////////////////////////////////////

    ;

    ; 翻译的一些规则:

    ; 翻译前,拷贝 Chinese GB.ini 改名到 yourlanguage.ini

    ; 仅仅翻译符号'='后的文字

    ;

    [Translations]

    ;

    Label1.Caption =文字1

    Label2.Caption =文字2

    Label3.Caption =语言

    Button1.Caption =按钮1

    Button2.Caption =按钮2

    Button1.Hint =按钮1_提示

    Button2.Hint =按钮2_提示

    CheckBox1.Caption =复选框1

    CheckBox2.Caption =复选框2

    File1.Caption =文件

    Exit1.Caption =退出

    ;

    [Messages]

    ;

    M1 =信息框测试

    ;

    ;//////////////////////////////////////////////////////////////////

    同样的方法编辑一个名为English.ini的文件,将“=”左边的文字改为英文。

    例如:Label1.Caption =Label1

    程序运行时,我们查找当前目录下所有的语言配置文件(*.ini),

    为了达到这个目的,

    我编写了如下的函数搜索目录下所有的语言配置文件的文件名,

    然后将文件名去掉ini扩展名保存返回:

    function TForm1.SearchLanguagePack:TStrings;

    var

      ResultStrings:TStrings;

      DosError:integer;

      SearchRec:TsearchRec;

    begin

      ResultStrings:=TStringList.Create;

      DosError:=FindFirst(ExtractFilePath(ParamStr(0))+'*.ini', faAnyFile, SearchRec);

      while DosError=0 do

      begin

       { 返回的文件名并去掉末尾的.ini字符 }

       ResultStrings.Add(ChangeFileExt(SearchRec.Name,''));

       DosError:=FindNext(SearchRec);

      end;

      FindClose(SearchRec);

      Result:=ResultStrings;

    end;

    在Form建立的事件中添加代码,将目录下所有的语言文件名加入选择列表框中。

    procedure TForm1.FormCreate(Sender: TObject);

    begin

      ComboBox1.Items.AddStrings(SearchLanguagePack);

    end;

    程序的重点在如何切换语言,在ComboBox1的OnChange事件中进行切换操作。

    这里我写了SetActiveLanguage过程用于实现这一操作。

    procedure TForm1.ComboBox1Change(Sender: TObject);

    begin

      SetActiveLanguage(ComboBox1.Text);

    end;

    其中SetActiveLanguage代码如下:

    procedure TForm1.SetActiveLanguage(LanguageName:string);

    const

      Translations='Translations';

      Messages='Messages';

    var

      frmComponent:TComponent;

      i:Integer;

    begin

      with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+'.ini') do

      begin

       for i:=0 to ComponentCount-1 do { 遍历Form组件 }

       begin

        frmComponent:=Components[i];

        if frmComponent is TLabel then { 如果组件为TLabel型则当作TLabel处理,以下同 }

        begin

         (frmComponent as TLabel).Caption:=

    ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TLabel).Caption);

        end;

        if frmComponent is TCheckBox then

        begin

         (frmComponent as TCheckBox).Caption:=

    ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TCheckBox).Caption);    

        end;

        if frmComponent is TButton then

        begin

         (frmComponent as TButton).Caption:=

    ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TButton).Caption);

         (frmComponent as TButton).Hint:=

    ReadString(Translations,frmComponent.Name+'.Hint',(frmComponent as TButton).Hint);

        end;

        if frmComponent is TMenuItem then

        begin

         (frmComponent as TMenuItem).Caption:=

    ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TMenuItem).Caption);

        end;

       end;

       M1:=ReadString(Messages,'M1',M1);

      end;

    end;

    在这个过程中,我们遍历了Form中的所有组件,

    根据他们的类别和组件名动态的从ini配置文件中读出应该显示的语言文字。

    用遍历组件的方法比一个一个写出具体的组件维护起来要方便很多,代码的适应性也更强。

    其中M1为一个字符串变量,这样提示消息也能切换,比如在Button1的Click事件中

    procedure TForm1.Button1Click(Sender: TObject);

    begin

      ShowMessage(M1);

    end;

    就可以根据不同的语言给出不同的提示文字

    好了,整个工程就做完了,你可以运行测试一下,是不是切换迅速而且无闪烁。

  • 相关阅读:
    375D.Tree and Queries(树上启发式合并+离线)
    600E.Lomsat gelral (树上启发式合并)
    741D.Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(树上启发式合并+状压)
    Nowcoder13249.黑白树(树形DP)
    Nowcoder51179.选课(树形背包)
    Nowcoder20811.蓝魔法师(树形背包)
    Nowcoder19782.Tree(树形DP+逆元)
    Gym102292M.Monster Hunter(树形背包+滚动数组)
    大数据运维(61)Linux环境安装PostgreSQL-10.1
    大数据运维(60)Hive on Spark配置
  • 原文地址:https://www.cnblogs.com/94YY/p/2043495.html
Copyright © 2011-2022 走看看