zoukankan      html  css  js  c++  java
  • uLanguage.pas

    //author: cxg

    {  For example :
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
      SetActiveLanguage(ComboBox1.Text);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.Items.AddStrings(SearchLanguagePack);
    end;
    }

    unit uLanguage;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Menus, IniFiles, ComCtrls, ExtCtrls,
      cxButtons    
      ;

    var
      g_hash: THashedStringList;

    //搜索ini文件生成语言列表
    function SearchLanguagePack: TStrings;
    //根据当前选择的语言设置指定窗体及其子控件的属性
    procedure SetActiveLanguage(owner: TForm; const LanguageName: string);
    //将指定窗体及其子控件的属性写入INI文件
    procedure Writeproperty(owner: TForm; const LanguageName: string);

    function GetHash: THashedStringList;
    function GetHashStr(const key: string): string;
    procedure SetLanguage(owner: TForm);
    procedure WriteLangIni(owner: tform);

    implementation

    function GetHash: THashedStringList;
    var
      ini: TIniFile;
    begin
      ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'system.ini');
      Result := THashedStringList(THandle(ini.ReadInteger('pointer', 'hash', 0)));
      ini.Free;
    end;

    function GetHashStr(const key: string): string;
    begin
      Result := GetHash.Values[key];
    end;

    function _WriteLangIni: Boolean;
    var
      ini: TIniFile;
    begin
      ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'system.ini');
      Result := ini.ReadBool('language', 'writelangini', false);
      ini.Free;
    end;

    procedure WriteLangIni(owner: tform);
    begin
      if _WriteLangIni then
        uLanguage.Writeproperty(owner, 'chinese(gb)');
    end;

    procedure SetLanguage(owner: TForm);
    var
      ini: TIniFile;
    begin
      ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'system.ini');
      uLanguage.SetActiveLanguage(owner, ini.ReadString('language', 'currentlanguage', 'chinese(gb)'));
      ini.Free;
    end;

    function SearchLanguagePack: TStrings;
    var
      ResultStrings: TStrings;
      DosError: integer;
      SearchRec: TsearchRec;
    begin
      ResultStrings := TStringList.Create;
      DosError := FindFirst(ExtractFilePath(Application.ExeName) + 'language/' + '*.ini', faAnyFile, SearchRec);
      while DosError = 0 do
      begin
        { 返回的文件名并去掉末尾的.ini字符 }
        ResultStrings.Add(ChangeFileExt(SearchRec.Name, ''));
        DosError := FindNext(SearchRec);
      end;
      FindClose(SearchRec);
      Result := ResultStrings;
    end;

    procedure Writeproperty(owner: TForm; const LanguageName: string);
    var
      c: TComponent;
      i: Integer;
    begin
      if owner = nil then exit;
      with TInifile.Create(ExtractFilePath(Application.ExeName) + 'language/' + LanguageName + '.ini') do
      begin
        WriteString(owner.Name, owner.Name + '.Caption', owner.Caption);
        for i := 0 to owner.ComponentCount - 1 do
        begin
          c := owner.Components[i];
          if c is TLabel then
          begin
            writeString(owner.Name, c.Name + '.Caption', (c as TLabel).Caption);
          end else
            if c is TLabeledEdit then
            begin
              writeString(owner.Name, c.Name + '.EditLabel.Caption', (c as TLabeledEdit).EditLabel.Caption);
            end else
              if c is TCheckBox then
              begin
                writeString(owner.Name, c.Name + '.Caption', (c as TCheckBox).Caption);
              end else
                if c is TButton then
                begin
                  writeString(owner.Name, c.Name + '.Caption', (c as TButton).Caption);
                  writeString(owner.Name, c.Name + '.Hint', (c as TButton).Hint);
                end else
                  if c is TcxButton then
                  begin
                    writeString(owner.Name, c.Name + '.Caption', (c as TcxButton).Caption);
                    writeString(owner.Name, c.Name + '.Hint', (c as TcxButton).Hint);
                  end else
                    if c is TMenuItem then
                    begin
                      writeString(owner.Name, c.Name + '.Caption', (c as TMenuItem).Caption);
                    end else
                      if c is TToolButton then
                      begin
                        writeString(owner.Name, c.Name + '.Caption', (c as TToolButton).Caption);
                        writeString(owner.Name, c.Name + '.Hint', (c as TToolButton).Hint);
                      end else
                        if c is TTabSheet then
                        begin
                          writeString(owner.Name, c.Name + '.Caption', (c as TTabSheet).Caption);
                        end; 
        end;
      end;
    end;

    procedure SetActiveLanguage(owner: TForm; const LanguageName: string);
    const
      Messages = 'Messages'; //字符串变量小节
    var
      c: TComponent;
      i: Integer;
      ini: TIniFile;
    begin
      if owner = nil then exit;
      ini := TInifile.Create(ExtractFilePath(Application.ExeName) + 'language/' + LanguageName + '.ini');
      with ini do
      begin
        owner.Caption := readstring(owner.Name, owner.Name + '.Caption', owner.Caption);
        for i := 0 to owner.ComponentCount - 1 do
        begin
          c := owner.Components[i];
          if c is TLabel then
          begin
            (c as TLabel).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TLabel).Caption);
          end else
            if c is TLabeledEdit then
            begin
              (c as TLabeledEdit).EditLabel.Caption := ReadString(owner.Name, c.Name + '.EditLabel.Caption', (c as TLabeledEdit).EditLabel.Caption);
            end else
              if c is TCheckBox then
              begin
                (c as TCheckBox).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TCheckBox).Caption);
              end else
                if c is TButton then
                begin
                  (c as TButton).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TButton).Caption);
                  (c as TButton).Hint := ReadString(owner.Name, c.Name + '.Hint', (c as TButton).Hint);
                end else
                  if c is TcxButton then
                  begin
                    (c as TcxButton).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TcxButton).Caption);
                    (c as TcxButton).Hint := ReadString(owner.Name, c.Name + '.Hint', (c as TcxButton).Hint);
                  end else
                    if c is TMenuItem then
                    begin
                      (c as TMenuItem).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TMenuItem).Caption);
                    end else
                      if c is TToolButton then
                      begin
                        (c as TToolButton).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TToolButton).Caption);
                        (c as TToolButton).Hint := ReadString(owner.Name, c.Name + '.Hint', (c as TToolButton).Hint);
                      end else
                        if c is TTabSheet then
                        begin
                          (c as TTabSheet).Caption := ReadString(owner.Name, c.Name + '.Caption', (c as TTabSheet).Caption);
                        end; 
        end;
        ReadSectionValues('messages', g_hash);
      end;
      ini.Free;
      ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'system.ini');
      ini.WriteInteger('pointer', 'hash', thandle(g_hash));
      ini.Free;
    end;

    initialization
      g_hash := THashedStringList.Create;
    finalization
      FreeAndNil(g_hash);

    end.

  • 相关阅读:
    服务器数据库不用开通远程连接通过工具在本地连接操作的方法
    怎么搜索同类网站
    Java三行代码搞定MD5加密,测试5c短信网关的demo
    iOS检测用户截屏并获取所截图片
    tomcat输出servlet-api.jar
    从svn资源库目录checkout出maven项目方法
    Maven打包pom里面配置exclude 排除掉环境相关的配置文件
    PHP获取毫秒时间戳,利用microtime()函数
    阿里云OneinStack,Linux下tomcat命令
    阿里云OneinStack数据库相关
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940933.html
Copyright © 2011-2022 走看看