home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freelog 11
/
Freelog011.iso
/
BestOf
/
PhoenixMail
/
Source
/
phoenix
/
LangSup.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1999-01-11
|
14KB
|
413 lines
{*****************************************************************************
*
* LangSup.pas - Multi Language Support (23-September-1998)
*
* Copyright (c) 1998-99 Michael Haller
*
* Author: Michael Haller
* E-mail: michael@discountdrive.com
* Homepage: http://www.discountdrive.com/sunrise
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
*----------------------------------------------------------------------------
*
* Revision history:
*
* DATE REV DESCRIPTION
* ----------- --- ----------------------------------------------------------
*
*****************************************************************************}
unit LangSup;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, Buttons, PXStuff, ComCtrls, ExtListView,
ComboBoxEx;
var
LangSupTagList: TStringList;
procedure LoadLanguageFile(Filename: String);
procedure ClearUpLangFile;
procedure AttachLanguageToForm(Form: TForm);
procedure AttachLanguageToMemo(Index: Byte; var Memo: TMemo);
procedure SaveFormStrings(Form: TForm);
procedure SaveMemo(Memo: TMemo);
implementation
uses
Main;
type
TLangFileHeader = record
IDStr: String[30];
Version: Byte;
Author: String[40];
Comment: String[50];
Created: String[10];
NatName: String[20];
EngName: String[20];
LongStrCount: Byte;
end;
TLongStrEntry = record
Len: SmallInt;
end;
TLangEntry = record
ID: SmallInt;
SubID: Byte;
Len: Byte;
end;
const
sLangCopyrightStr: String[30] = 'Phoenix Mail Language File';
var
T: Text;
SL: TStringList;
IDL: TStringList;
LanguageMemoString1, LanguageMemoString2: String;
procedure LoadLanguageFile(Filename: String);
var
LangEntry: TLangEntry;
LangFileHeader: TLangFileHeader;
LongStrEntry: TLongStrEntry;
P: PChar;
F: File;
S: String[255];
LongS: String;
I: Integer;
begin
LanguageMemoString1 := '';
LanguageMemoString2 := '';
AssignFile(F, Filename);
Reset(F, 1);
SL := TStringList.Create;
IDL := TStringList.Create;
//BlockRead(F, S, SizeOf(sLangCopyrightStr));
BlockRead(F, LangFileHeader, SizeOf(LangFileHeader));
if LangFileHeader.IDStr <> sLangCopyrightStr then
raise Exception.Create('Invalid Language File.');
if LangFileHeader.Version <> 1 then
raise Exception.Create('Invalid version of Language File.');
for I := 1 to LangFileHeader.LongStrCount do begin
BlockRead(F, LongStrEntry, SizeOf(TLongStrEntry));
GetMem(P, LongStrEntry.Len+1);
BlockRead(F, P^, LongStrEntry.Len);
P[LongStrEntry.Len] := #0;
LongS := P;
FreeMem(P, LongStrEntry.Len+1);
if I = 1 then LanguageMemoString1 := LongS;
if I = 2 then LanguageMemoString2 := LongS;
end;
//
while not EoF(F) do begin
BlockRead(F, LangEntry, SizeOf(LangEntry));
BlockRead(F, S[1], LangEntry.Len);
SetLength(S, LangEntry.Len);
SL.Add(S);
if LangEntry.SubID = 0 then
IDL.Add(IntToStr(LangEntry.ID))
else
IDL.Add(IntToStr(LangEntry.ID)+'.'+IntToStr(LangEntry.SubID));
end;
CloseFile(F);
end;
procedure ClearUpLangFile;
begin
SL.Free;
IDL.Free;
end;
procedure AttachLanguageToForm(Form: TForm);
var
CL: TList;
I, E, G, K: Integer;
C: TComponent;
procedure LCRecursive(Component: TComponent);
var
I: Integer;
begin
for I := 0 to Component.ComponentCount-1 do begin
if Component.Components[I].Tag <> 0 then
CL.Add(Component.Components[I]);
if Component.Components[I].ComponentCount > 0 then
LCRecursive(Component.Components[I]);
end;
end;
begin
if bLanguageLoaded = False then Exit;
CL := TList.Create;
CL.Add(TComponent(Form));
LCRecursive(TComponent(Form));
for I := 0 to CL.Count-1 do begin
C := TComponent(CL.Items[I]);
G := IDL.IndexOf(IntToStr(C.Tag));
if C is TListBox then begin
for K := 0 to TListBox(CL.Items[I]).Items.Count-1 do begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(K+1));
if (E >= 0) and (SL.Strings[E] <> '') then
TListBox(CL.Items[I]).Items[K] := SL.Strings[E];
end;
end else
if C is TComboBoxEx then begin
for K := 0 to TComboBoxEx(CL.Items[I]).Items.Count-1 do begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(K+1));
if (E >= 0) and (SL.Strings[E] <> '') then
TComboBoxEx(CL.Items[I]).Items[K] := SL.Strings[E];
end;
end else
if C is TOpenDialog then begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(1));
if (E >= 0) and (SL.Strings[E] <> '') then
TOpenDialog(CL.Items[I]).Title := SL.Strings[E];
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(2));
if (E >= 0) and (SL.Strings[E] <> '') then
TOpenDialog(CL.Items[I]).Filter := SL.Strings[E];
end else
if C is TListView then begin
for K := 0 to TListView(CL.Items[I]).Columns.Count-1 do begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(K+1));
if (E >= 0) and (SL.Strings[E] <> '') then
TListView(CL.Items[I]).Columns[K].Caption := SL.Strings[E];
end;
end else
if C is TExtListView then begin
for K := 1 to TExtListView(CL.Items[I]).Columns.Count-1 do begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag))+'.'+IntToStr(K+1));
if (E >= 0) and (SL.Strings[E] <> '') then
TExtListView(CL.Items[I]).Columns[K].Caption := SL.Strings[E];
end;
end else begin
E := IDL.IndexOf(IntToStr(Abs(C.Tag)));
if (E >= 0) and (SL.Strings[E] <> '') then begin
if C is TLabel then TLabel(CL.Items[I]).Caption := SL.Strings[E] else
if C is TMenuItem then TMenuItem(CL.Items[I]).Caption := SL.Strings[E] else
if C is TRadioButton then TRadioButton(CL.Items[I]).Caption := SL.Strings[E] else
if C is TButton then TButton(CL.Items[I]).Caption := SL.Strings[E] else
if C is TSpeedButton then TSpeedButton(CL.Items[I]).Caption := SL.Strings[E] else
if C is TTabSheet then TTabSheet(CL.Items[I]).Caption := SL.Strings[E] else
if C is TCheckBox then TCheckBox(CL.Items[I]).Caption := SL.Strings[E] else
if C is TForm then TForm(CL.Items[I]).Caption := SL.Strings[E];
end;
end;
if (G >= 0) and (C.Tag < 0) and (SL.Strings[G] <> '') then begin
if C is TControl then TControl(CL.Items[I]).Hint := SL.Strings[G];
end;
end;
CL.Free;
end;
procedure AttachLanguageToMemo(Index: Byte; var Memo: TMemo);
var
E: Integer;
S: String;
begin
if Index = 1 then begin
S := LanguageMemoString1;
if S = '' then Exit;
end;
if Index = 2 then begin
S := LanguageMemoString2;
if S = '' then Exit;
end;
Memo.Lines.Clear;
E := Pos('º', S);
while E > 0 do begin
S[E] := #10;
Insert(#13, S, E);
E := Pos('º', S);
end;
Memo.Lines.Add(S);
end;
procedure SaveMemo(Memo: TMemo);
var
I: Integer;
begin
AssignFile(T, sTempLanguageFile);
if FileExists(sTempLanguageFile) then
Append(T)
else
Rewrite(T);
WriteLn(T, IntToStr(Memo.Lines.Count-1));
for I := 1 to Memo.Lines.Count-1 do
WriteLn(T, Memo.Lines[I]);
CloseFile(T);
end;
procedure SaveFormStrings(Form: TForm);
var
CL: TList;
I, K: Integer;
HasCaption: Boolean;
S: String;
procedure LCRecursive(Component: TComponent);
var
I: Integer;
begin
for I := 0 to Component.ComponentCount-1 do begin
CL.Add(Component.Components[I]);
if Component.Components[I].ComponentCount > 0 then
LCRecursive(Component.Components[I]);
end;
end;
begin
CL := TList.Create;
CL.Add(TComponent(Form));
LCRecursive(TComponent(Form));
AssignFile(T, sTempLanguageFile);
if FileExists(sTempLanguageFile) then
Append(T)
else
Rewrite(T);
for I := 0 to CL.Count-1 do begin
if TComponent(CL.Items[I]).Tag <> 0 then begin
if LangSupTagList.IndexOf(IntToStr(TComponent(CL.Items[I]).Tag)) = -1 then begin
LangSupTagList.Add(IntToStr(TComponent(CL.Items[I]).Tag));
HasCaption := False;
if TComponent(CL.Items[I]) is TMenuItem then begin
if TMenuItem(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TMenuItem(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TSpeedButton then begin
if TSpeedButton(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TSpeedButton(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TLabel then begin
if TLabel(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TLabel(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TForm then begin
if TForm(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TForm(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TCheckBox then begin
if TCheckBox(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TCheckBox(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TRadioButton then begin
if TRadioButton(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TRadioButton(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TTabSheet then begin
if TTabSheet(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TTabSheet(CL.Items[I]).Caption);
HasCaption := True;
end;
end else
if TComponent(CL.Items[I]) is TButton then begin
if TButton(CL.Items[I]).Caption <> '' then begin
WriteLn(T, TButton(CL.Items[I]).Caption);
HasCaption := True;
end;
end;
if HasCaption then begin
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag)));
S := TComponent(CL.Items[I]).ClassName;
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+' Caption '+Copy(S, 2, Length(S)-1));
end;
if TComponent(CL.Items[I]) is TListBox then begin
S := TComponent(CL.Items[I]).ClassName;
S := Copy(S, 2, Length(S)-1);
for K := 0 to TListBox(CL.Items[I]).Items.Count-1 do begin
WriteLn(T, TListBox(CL.Items[I]).Items[K]);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag)+'.'+IntToStr(K+1));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(K+1)+' Item '+S);
end;
end;
if TComponent(CL.Items[I]) is TComboBoxEx then begin
S := TComponent(CL.Items[I]).ClassName;
S := Copy(S, 2, Length(S)-1);
for K := 0 to TComboBox(CL.Items[I]).Items.Count-1 do begin
WriteLn(T, TComboBox(CL.Items[I]).Items[K]);
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(K+1));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(K+1)+' Item '+S);
end;
end;
if TComponent(CL.Items[I]) is TOpenDialog then begin
S := TComponent(CL.Items[I]).ClassName;
S := Copy(S, 2, Length(S)-1);
WriteLn(T, TOpenDialog(CL.Items[I]).Title);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag)+'.'+IntToStr(1));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(1)+' Title '+S);
WriteLn(T, TOpenDialog(CL.Items[I]).Filter);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag)+'.'+IntToStr(2));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(2)+' Filter '+S);
end;
if TComponent(CL.Items[I]) is TListView then begin
S := TComponent(CL.Items[I]).ClassName;
S := Copy(S, 2, Length(S)-1);
for K := 0 to TListView(CL.Items[I]).Columns.Count-1 do begin
WriteLn(T, TListView(CL.Items[I]).Columns[K].Caption);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag)+'.'+IntToStr(K+1));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(K+1)+' Column '+S);
end;
end;
if TComponent(CL.Items[I]) is TExtListView then begin
S := TComponent(CL.Items[I]).ClassName;
S := Copy(S, 2, Length(S)-1);
for K := 1 to TExtListView(CL.Items[I]).Columns.Count-1 do begin
WriteLn(T, TExtListView(CL.Items[I]).Columns[K].Caption);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag)+'.'+IntToStr(K+1));
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+'.'+IntToStr(K+1)+' Column '+S);
end;
end;
if TComponent(CL.Items[I]).Tag < 0 then
if TComponent(CL.Items[I]) is TControl then begin
if TControl(CL.Items[I]).Hint <> '' then begin
WriteLn(T, TControl(CL.Items[I]).Hint);
WriteLn(T, IntToStr(TComponent(CL.Items[I]).Tag));
S := TComponent(CL.Items[I]).ClassName;
WriteLn(T, IntToStr(Abs(TComponent(CL.Items[I]).Tag))+' Hint '+Copy(S, 2, Length(S)-1));
end;
end;
end;
end;
end;
CL.Free;
CloseFile(T);
end;
end.