⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ulanguage.pas

📁 自己写的一个 RSS 阅读器
💻 PAS
字号:
unit uLanguage;

interface

uses
  SysUtils, Classes,ShellAPI;
const
  SLanguageFileName = 'Language.ini';
  SGeneralSection   = 'General';
  SStringSection    = 'Strings';

type
  TLanguageItem = class(TObject)
  private
    fName:string;
    fPath:string;
  public
    constructor Create(aName,aPath:string);
    property Name:string read fName;
    property Path:string read fPath;
  end;

  TLanguage = class(TObject)
  private
    FLanguageDir:string;
    fItems:TList;
    FCurrentLanguage :TLanguageItem;
    function GetCount:Integer;
    function IsLanguageFile(AFileName:String):Boolean;
    function GetLanguageName(AFileName:String):String;

    procedure AddLanguage(aName:string;aFileName:string);
    procedure LoadLanguages;
    function Get_Item(Index:Integer):TLanguageItem;
  public
    constructor Create(Dir:string); virtual;
    destructor Destroy; override;
    property Count :Integer read GetCount;
    property Item[Index:Integer]:TLanguageItem read Get_Item;
    property CurrentLanguage:TLanguageItem read FCurrentLanguage;
    procedure ChangeToLanguage(LanguageName:String);
    function Translate(SectionName:string;ResID:integer):String;
  end;

implementation

uses IniFiles,FastStrings;

constructor TLanguage.Create(Dir:string);
begin
  inherited Create;
  FLanguageDir:=Dir;
  FItems:=TList.Create;
  LoadLanguages;
end;

destructor Tlanguage.Destroy;
begin
  FItems.Free;
  inherited;
end;

function TLanguage.GetCount:Integer;
begin
  Result:=FItems.Count;
end;

procedure TLanguage.AddLanguage(aName:string;aFileName:string);
var item:TLanguageItem;
begin
  item:=TLanguageItem.Create(aName,aFileName);
  FItems.Add(item);
end;

function TLanguage.Get_Item(Index:Integer):TLanguageItem;
begin
  Result:=TLanguageItem (fItems[Index]);
end;

function TLanguage.IsLanguageFile(AFileName:String):Boolean;
var iniFile:TIniFile;
begin
  Result:=False;
  iniFile:=TIniFile.Create(AFileName);
  Result :=(iniFile.ReadString(SGeneralSection,'Language-Name','')<>'');
  iniFile.Free;
end;

function TLanguage.GetLanguageName(AFileName:String):String;
var iniFile:TIniFile;
begin
  iniFile:=TIniFile.Create(AFileName);
  Result :=iniFile.ReadString(SGeneralSection,'Language-Name','');
  iniFile.Free;
end;

procedure TLanguage.LoadLanguages;
var
  Sr: TSearchRec;
  AFileName, ASearchPath: string;
begin
  ASearchPath := FLanguageDir + '*';
  if FindFirst(ASearchPath, faDirectory, Sr) = 0 then
  begin
    repeat
      if (Sr.Name = '.') or (Sr.Name = '..') or not DirectoryExists(FLanguageDir + Sr.Name) then
        Continue;

      AFileName := FLanguageDir + Sr.Name + '\' + SLanguageFileName;
      if FileExists(AFileName) and IsLanguageFile(AFileName) then
        AddLanguage(GetLanguageName(AFileName),FLanguageDir + Sr.Name+'\');

    until FindNext(Sr) <> 0;
    FindClose(Sr);
  end;
end;

procedure TLanguage.ChangeToLanguage(LanguageName:String);
var i:Integer;
  sName,sPath:string;
begin
  for  i:= 0 to FItems.Count - 1 do    // Iterate
  begin
    sName:=TLanguageItem(fItems[i]).Name;
    sPath:=TLanguageItem(fItems[i]).Path;
    if sName=LanguageName then
    begin
      FCurrentLanguage:=TLanguageItem(fItems[i]);
      Exit;
    end;
  end;
end;

function TLanguage.Translate(SectionName:string;ResID:integer):string;
var inifile:TIniFile;
begin
  if Self.Count=0 then
  begin
    Result :='';
    Exit;
  end;
  try
    inifile:=TIniFile.Create(FCurrentLanguage.Path+SLanguageFileName);
    Result:= inifile.ReadString(SectionName,IntToStr(ResID),'');
    if Result='' then
      inifile.WriteString(SectionName,IntToStr(ResID),LoadStr(ResID));
  finally // wrap up
    inifile.Free;
  end;    // try/finally
end;

constructor TLanguageItem.Create(aName,aPath:string);
begin
  fName := aName;
  fPath := aPath;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -