unit ULocalization;

interface

uses
  SysUtils, Classes, Forms, IniFiles, Dialogs;

type
  TLanguage = class
    Items: TStringList;
    Name: string;
    constructor Create;
    destructor Destroy;
  end;

  TLocalization = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  public
    ActiveLanguage: Integer;
    Languages: array of TLanguage;
    procedure Add(New: string);
    function Item(NameIndex: string): string;
    procedure Activate(New: Integer);
    procedure LoadLanguages;
  end;

var
  Localization: TLocalization;

implementation

{$R *.dfm}

{ TLokalizace }

procedure TLocalization.Activate(New: Integer);
var
  I: Integer;
begin
  ActiveLanguage := New;
  if (ActiveLanguage < 0) or (ActiveLanguage >= Length(Languages)) then ActiveLanguage := 0;
  with Application do
    for I := 0 to ComponentCount-1 do
      if Components[I] is TForm then
        with (Components[I] as TForm) do
          if Visible then OnShow(Self);
end;

procedure TLocalization.LoadLanguages;
var
  LanguageFile: TSearchRec;
  Path: string;
  I: Integer;
begin
  Path := ExtractFileDir(Application.ExeName)+'\'+'*.lng';
  if FindFirst(Path, $2f, LanguageFile)=0 then begin
    repeat
      Add(ExtractFileName(LanguageFile.Name));
      with Languages[High(Languages)] do
      with TIniFile.Create(ExtractFileDir(Application.ExeName)+'\'+LanguageFile.Name) do
      try
        Name := ReadString('Info', 'Language', 'None');
        ReadSectionValues('Main',Items);
      finally
        Free;
      end;
    until FindNext(LanguageFile)<>0;
    FindClose(LanguageFile);
  end;
  if Length(Languages) = 0 then raise Exception.Create('Nebyl nalezen žádný jazykový soubor!');
end;

function TLocalization.Item(NameIndex: string): string;
var
  Index: Integer;
begin
  if (ActiveLanguage < Length(Languages)) and (ActiveLanguage >= 0)  then begin
  with Languages[ActiveLanguage].Items do begin
    Index := IndexOfName(NameIndex);
    if Index <> -1 then Result := Values[NameIndex] else Result := '#' + NameIndex;
  end;
  end else Result := '#' + NameIndex;
end;

procedure TLocalization.Add(New: string);
begin
  SetLength(Languages, Length(Languages)+1);
  Languages[High(Languages)] := TLanguage.Create;
  Languages[High(Languages)].Name := Name;
end;

procedure TLocalization.DataModuleCreate(Sender: TObject);
begin
  LoadLanguages;
  ActiveLanguage := 0;
end;

procedure TLocalization.DataModuleDestroy(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to High(Languages) do
    Languages[I].Free;    
end;

{ TLanguage }

constructor TLanguage.Create;
begin
  Items := TStringList.Create;
end;

destructor TLanguage.Destroy;
begin
  Items.Free;
end;

end.
