LazEdit: changed TagMenuItemsAndActions to tag LanguageMenu items at runtime. Implemented LanguageIds for lazedit_translations.pp

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2470 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
lazarus-bart
2012-07-02 20:40:02 +00:00
parent e503d1b77f
commit 4a89dd32e2
4 changed files with 64 additions and 22 deletions

View File

@ -40,8 +40,8 @@ unit lazedit_config;
interface interface
uses uses
SysUtils, Classes, EditorPageControl, lazedit_constants, Forms,{FCL_Misc,} IniFiles, SysUtils, Classes, EditorPageControl, lazedit_constants, lazedit_translations,
LCLProc; Forms, IniFiles, LCLProc;
type type
//globale type for all configurable options //globale type for all configurable options
@ -73,7 +73,7 @@ type
FileTypeMaskList: TFileTypeMaskList; FileTypeMaskList: TFileTypeMaskList;
TemplateMaskList: String; TemplateMaskList: String;
RecentFiles: Array[0..MruEntries - 1] of String; RecentFiles: Array[0..MruEntries - 1] of String;
Translation: Integer; Translation: TLanguageIds;
end; end;
function LoadOptions(var Options: TLazEditOptions; FileName: String): Boolean; function LoadOptions(var Options: TLazEditOptions; FileName: String): Boolean;
@ -114,6 +114,7 @@ var
ftIndex: TEditorFileType; ftIndex: TEditorFileType;
S: String; S: String;
i: Integer; i: Integer;
Lang: LongInt;
begin begin
Result := False; Result := False;
try try
@ -167,7 +168,11 @@ begin
end; end;
// Translation and other general // Translation and other general
Options.Translation := Ini.ReadInteger(scGeneral, idTranslation, 0); Lang := Ini.ReadInteger(scGeneral, idTranslation, 0);
if (Lang >= Ord(Low(TLanguageIds))) and (Lang <= Ord(High(TLanguageIds))) then
Options.Translation := TLanguageIds(Lang)
else
Options.Translation := lidEnglish;
finally finally
Ini.Free; Ini.Free;
@ -240,7 +245,7 @@ begin
end; end;
// Translation and other general // Translation and other general
Ini.WriteInteger(scGeneral, idTranslation, Options.Translation); Ini.WriteInteger(scGeneral, idTranslation, Ord(Options.Translation));
try try
Ini.UpdateFile; Ini.UpdateFile;

View File

@ -46,9 +46,16 @@ type
{ TTranslations } { TTranslations }
TLanguageIds = (lidEnglish, lidDutch, lidPortuguese);
const
MenuLangNameSuffixes: Array[TLanguageIds] of string = ('English','Dutch','Portuguese');
type
TTranslations = class(TObject) TTranslations = class(TObject)
private private
FLanguageId: Integer; FLanguageId: TLanguageIds;
public public
{ Main form } { Main form }
{ mnuEditPasteTableContentTab: TMenuItem; { mnuEditPasteTableContentTab: TMenuItem;
@ -213,8 +220,8 @@ type
procedure TranslateToEnglish; procedure TranslateToEnglish;
procedure TranslateToDutch; procedure TranslateToDutch;
procedure TranslateToPortuguese; procedure TranslateToPortuguese;
procedure TranslateToLanguageID(AID: Integer); procedure TranslateToLanguageID(ALangId: TLanguageIds);
function GetCurrentLanguageID: Integer; function GetCurrentLanguageID: TLanguageIds;
end; end;
var var
@ -642,18 +649,18 @@ begin
mnuViewFontsize := 'Tamanho da &fonte'; mnuViewFontsize := 'Tamanho da &fonte';
end; end;
procedure TTranslations.TranslateToLanguageID(AID: Integer); procedure TTranslations.TranslateToLanguageID(ALangId: TLanguageIds);
begin begin
FLanguageID := AID; FLanguageID := ALangId;
case AID of case ALangId of
1: TranslateToDutch; lidDutch: TranslateToDutch;
2: TranslateToPortuguese; lidPortuguese: TranslateToPortuguese;
else else
TranslateToEnglish; TranslateToEnglish;
end; end;
end; end;
function TTranslations.GetCurrentLanguageID: Integer; function TTranslations.GetCurrentLanguageID: TLanguageIds;
begin begin
Result := FLanguageID; Result := FLanguageID;
end; end;

View File

@ -1757,16 +1757,16 @@ object LazEditMainForm: TLazEditMainForm
Caption = 'mnuTools' Caption = 'mnuTools'
object mnuToolsLanguage: TMenuItem object mnuToolsLanguage: TMenuItem
Caption = 'mnuToolsLanguage' Caption = 'mnuToolsLanguage'
object mnuEnglish: TMenuItem object mnuLanguageEnglish: TMenuItem
Caption = 'English' Caption = 'English'
OnClick = mnuLanguageChangeClick OnClick = mnuLanguageChangeClick
end end
object mnuDutch: TMenuItem object mnuLanguageDutch: TMenuItem
Tag = -1 Tag = -1
Caption = 'Dutch' Caption = 'Dutch'
OnClick = mnuLanguageChangeClick OnClick = mnuLanguageChangeClick
end end
object mnuPortuguese: TMenuItem object mnuLanguagePortuguese: TMenuItem
Tag = -2 Tag = -2
Caption = 'Português' Caption = 'Português'
OnClick = mnuLanguageChangeClick OnClick = mnuLanguageChangeClick

View File

@ -112,9 +112,9 @@ type
mnuToolbarsMain: TMenuItem; mnuToolbarsMain: TMenuItem;
mnuInsertSep2: TMenuItem; mnuInsertSep2: TMenuItem;
mnuToolsLanguage: TMenuItem; mnuToolsLanguage: TMenuItem;
mnuEnglish: TMenuItem; mnuLanguageEnglish: TMenuItem;
mnuDutch: TMenuItem; mnuLanguageDutch: TMenuItem;
mnuPortuguese: TMenuItem; mnuLanguagePortuguese: TMenuItem;
mnuTools: TMenuItem; mnuTools: TMenuItem;
mnuAbout: TMenuItem; mnuAbout: TMenuItem;
mnuViewFont: TMenuItem; mnuViewFont: TMenuItem;
@ -455,6 +455,7 @@ type
procedure UpdateMenuItems; procedure UpdateMenuItems;
procedure CreateMruMenuItemsArray; procedure CreateMruMenuItemsArray;
function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean; function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean;
function TryLangMenuTagToLangId(ATag: PtrInt; out ALangId: TLanguageIds): Boolean;
function FileTypeToFilterIndex(const Index: TEditorFileType): Integer; function FileTypeToFilterIndex(const Index: TEditorFileType): Integer;
procedure ConstructOpenDialogFileFilters; procedure ConstructOpenDialogFileFilters;
@ -629,9 +630,15 @@ begin
end; end;
procedure TLazEditMainForm.mnuLanguageChangeClick(Sender: TObject); procedure TLazEditMainForm.mnuLanguageChangeClick(Sender: TObject);
var
ALangId: TLanguageIds;
begin begin
vTranslations.TranslateToLanguageID(Abs(TMenuItem(Sender).Tag)); if TryLangMenuTagToLangId((Sender as TMenuItem).Tag, ALangId) then
DoTranslateAll(); begin
vTranslations.TranslateToLanguageID(ALangId);
DoTranslateAll();
end
else debugln(Format('Error: Invalid tag for MenuItem %s: %x',[(Sender as TMenuItem).Name,(Sender as TMenuItem).Tag]));;
end; end;
@ -1447,6 +1454,7 @@ begin
end; end;
// Translation // Translation
vTranslations.TranslateToLanguageID(Options.Translation); vTranslations.TranslateToLanguageID(Options.Translation);
// Toolbars // Toolbars
@ -1665,6 +1673,15 @@ begin
if Result then AFileType := TEditorFileType(ATag); if Result then AFileType := TEditorFileType(ATag);
end; end;
function TLazEditMainForm.TryLangMenuTagToLangId(ATag: PtrInt; out
ALangId: TLanguageIds): Boolean;
begin
ATag := ATag and $FF0000;
ATag := ATag shr 16;
Result := (ATag >= Ord(Low(TLanguageIds))) and (ATag <= Ord(High(TLanguageIds)));
if Result then ALangId := TLanguageIds(ATag);
end;
function TLazEditMainForm.FileTypeToFilterIndex(const Index: TEditorFileType function TLazEditMainForm.FileTypeToFilterIndex(const Index: TEditorFileType
): Integer; ): Integer;
const const
@ -1685,6 +1702,7 @@ var
//NE: Boolean; //NE: Boolean;
//NS: Boolean; //NS: Boolean;
Index: TEditorFileType; Index: TEditorFileType;
LangId: TLanguageIds;
begin begin
for i := 0 to self.ComponentCount - 1 do for i := 0 to self.ComponentCount - 1 do
begin begin
@ -1692,6 +1710,7 @@ begin
N := C.Name; N := C.Name;
if (C is TAction) or (C is TMenuItem) then if (C is TAction) or (C is TMenuItem) then
begin begin
C.Tag := 0; //initialize all Tags to 0
//Things that need an open editor //Things that need an open editor
if Pos('LAYOUT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor; if Pos('LAYOUT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
if Pos('EDIT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor; if Pos('EDIT',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsEditor;
@ -1714,6 +1733,16 @@ begin
end; end;
end; end;
end; end;
if Pos('MNULANGUAGE', Uppercase(N)) > 0 then
begin
for LangId := Low(TLanguageIds) to High(TLanguageIds) do
begin
if ('MNULANGUAGE' + Uppercase(MenuLangNameSuffixes[LangId])= Uppercase(N)) then
begin
C.Tag := C.Tag or (Ord(LangId) shl 16);
end;
end;
end;
//Things that need text on the clipboard //Things that need text on the clipboard
if Pos('PASTE',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsClipPaste; if Pos('PASTE',UpperCase(N)) > 0 then C.Tag := C.Tag or tgNeedsClipPaste;
//Things that need a selection in the editor //Things that need a selection in the editor
@ -1738,6 +1767,7 @@ begin
{ {
if (C is TMenuItem) or (C is TAction) then if (C is TMenuItem) or (C is TAction) then
//if (C = mnuLanguageEnglish) or (C = mnuLanguageDutch) or (C = mnuLanguagePortuguese) then
begin begin
NE := (C.Tag and tgNeedsEditor) > 0; NE := (C.Tag and tgNeedsEditor) > 0;
NS := (C.Tag and tgNeedsSelection) > 0; NS := (C.Tag and tgNeedsSelection) > 0;