📄 ulanguage.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 + -