View Issue Details

IDProjectCategoryView StatusLast Update
0034045LazarusLazUtilspublic2018-08-02 23:17
ReporterwpAssigned ToMaxim Ganetsky 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version1.9 (SVN)Product Build 
Target VersionFixed in Version1.10 
Summary0034045: Translation of keyboard shortcuts does not change when language is switched
DescriptionKeyboard shortcuts can be assigned to the items of a menu and are displayed at the right side of the menu caption, e.g. "Ctrl+O".

When i18n is used and the language of an application changes the modifier names are never translated although translations are contained within the lclstrconsts file.

The problem is that the combined menu item text, consisting of item caption and shortcut name, uses the function "ShortcutToText, and this initializes the list of key names only once in the procedure "InitializeMenuKeyCaps" (in unit "LCLProc"). There is a variable "MenuKeyCapsInited" which is set to true once this procedure has been executed and cannot be changed back because the variable is declared within the implementation part of the unit.

I would propose to declare "MenuKeyCapsInited" in the interface part of the unit and to reset it in the "LCLTranslator" unit whenever the language changes (-> see patch "accelerator-keys")
Steps To ReproduceRun attached demo which contains English and German translation files along with the corresponding copy of the lclstrconsts po files.

The main menu has several short-cuts which are shown when the "File" menu is opened.

The demo opens with English translation, the accelerator keys are displayed as "Ctrl" and "Shift"

When the language is switched to German, the accelerator keys are still "Ctrl" and "Shift" - they should be "Strg" and "Umsch".

On the other hand, when the appliation starts with German (by replacing the const "DEFAULT_LANG = 'en'" with "DEFAULT_LANG = 'de'") the accelerator keys are in German but do not change back to English any more when the language is switched to English.

The provided patch fixes the issue.
TagsNo tags attached.
Fixed in Revision58661
LazTarget-
Widgetset
Attached Files
  • translated_keymodifiers.zip (23,522 bytes)
  • accelerator-keys.patch (1,055 bytes)
    Index: lcl/lclproc.pas
    ===================================================================
    --- lcl/lclproc.pas	(revision 58612)
    +++ lcl/lclproc.pas	(working copy)
    @@ -76,6 +76,8 @@
     function CompareDebugLCLItemInfos(Data1, Data2: Pointer): integer;
     function CompareItemWithDebugLCLItemInfo(Item, DebugItemInfo: Pointer): integer;
     
    +var
    +  MenuKeyCapsInited: boolean = false;
     
     type
       TStringsSortCompare = function(const Item1, Item2: string): Integer;
    @@ -389,7 +391,6 @@
     
     var
       MenuKeyCaps: array[TMenuKeyCap] of string;
    -  MenuKeyCapsInited: boolean = false;
     
     const
       // MS documentation:
    Index: lcl/lcltranslator.pas
    ===================================================================
    --- lcl/lcltranslator.pas	(revision 58612)
    +++ lcl/lcltranslator.pas	(working copy)
    @@ -85,6 +85,8 @@
     
     implementation
     
    +uses
    +  LCLProc;
     
     type
       TPersistentAccess = class(TPersistent);
    @@ -515,6 +517,7 @@
       i: integer;
     
     begin
    +  MenuKeyCapsInited := false;
       LocalTranslator := nil;
       // search first po translation resources
       try
    
    accelerator-keys.patch (1,055 bytes)
  • accelerator-keys-v2.patch (1,201 bytes)
    Index: lcl/lclproc.pas
    ===================================================================
    --- lcl/lclproc.pas	(revision 58648)
    +++ lcl/lclproc.pas	(working copy)
    @@ -91,6 +91,7 @@
     function KeyStringIsIrregular(const s: string): boolean;
     function ShortCutToText(ShortCut: TShortCut): string;// untranslated
     function TextToShortCut(const ShortCutText: string): TShortCut;// untranslated
    +procedure ResetMenuKeyCapsInitialized;
     
     function GetCompleteText(const sText: string; iSelStart: Integer;
       bCaseSensitive, bSearchAscending: Boolean; slTextList: TStrings): string;
    @@ -657,6 +658,10 @@
         '' // 0xff
       );
     
    +procedure ResetMenuKeyCapsInitialized;
    +begin
    +  MenuKeyCapsInited := false;
    +end;
     
     procedure InitializeMenuKeyCaps;
     begin
    Index: lcl/lcltranslator.pas
    ===================================================================
    --- lcl/lcltranslator.pas	(revision 58648)
    +++ lcl/lcltranslator.pas	(working copy)
    @@ -85,6 +85,8 @@
     
     implementation
     
    +uses
    +  LCLProc;
     
     type
       TPersistentAccess = class(TPersistent);
    @@ -515,6 +517,7 @@
       i: integer;
     
     begin
    +  ResetMenuKeyCapsInitialized;
       LocalTranslator := nil;
       // search first po translation resources
       try
    
  • shortcuts.pas.patch (4,956 bytes)
    Index: lcl/lclproc.pas
    ===================================================================
    --- lcl/lclproc.pas	(revision 58660)
    +++ lcl/lclproc.pas	(working copy)
    @@ -387,10 +387,6 @@
         mkcPgDn, mkcEnd, mkcHome, mkcLeft, mkcUp, mkcRight, mkcDown, mkcIns,
         mkcDel, mkcShift, mkcCtrl, mkcAlt, mkcMeta);
     
    -var
    -  MenuKeyCaps: array[TMenuKeyCap] of string;
    -  MenuKeyCapsInited: boolean = false;
    -
     const
       // MS documentation:
       // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
    @@ -658,54 +654,6 @@
       );
     
     
    -procedure InitializeMenuKeyCaps;
    -begin
    -  if not MenuKeyCapsInited then
    -  begin
    -    MenuKeyCapsInited:=true;
    -
    -    MenuKeyCaps[mkcBkSp]:=SmkcBkSp;
    -    MenuKeyCaps[mkcTab]:=SmkcTab;
    -    MenuKeyCaps[mkcEsc]:=SmkcEsc;
    -    MenuKeyCaps[mkcEnter]:=SmkcEnter;
    -    MenuKeyCaps[mkcSpace]:=SmkcSpace;
    -    MenuKeyCaps[mkcPgUp]:=SmkcPgUp;
    -    MenuKeyCaps[mkcPgDn]:=SmkcPgDn;
    -    MenuKeyCaps[mkcEnd]:=SmkcEnd;
    -    MenuKeyCaps[mkcHome]:=SmkcHome;
    -    MenuKeyCaps[mkcLeft]:=SmkcLeft;
    -    MenuKeyCaps[mkcUp]:=SmkcUp;
    -    MenuKeyCaps[mkcRight]:=SmkcRight;
    -    MenuKeyCaps[mkcDown]:=SmkcDown;
    -    MenuKeyCaps[mkcIns]:=SmkcIns;
    -    MenuKeyCaps[mkcDel]:=SmkcDel;
    -    MenuKeyCaps[mkcShift]:=SmkcShift;
    -    MenuKeyCaps[mkcCtrl]:=SmkcCtrl;
    -    MenuKeyCaps[mkcAlt]:=SmkcAlt;
    -    MenuKeyCaps[mkcMeta]:=SmkcMeta;
    -
    -    KeyCodeStrings[VK_BACK]:=SmkcBkSp;
    -    KeyCodeStrings[VK_TAB]:=SmkcTab;
    -    KeyCodeStrings[VK_ESCAPE]:=SmkcEsc;
    -    KeyCodeStrings[VK_RETURN]:=SmkcEnter;
    -    KeyCodeStrings[VK_SPACE]:=SmkcSpace;
    -    KeyCodeStrings[VK_PRIOR]:=SmkcPgUp;
    -    KeyCodeStrings[VK_NEXT]:=SmkcPgDn;
    -    KeyCodeStrings[VK_END]:=SmkcEnd;
    -    KeyCodeStrings[VK_HOME]:=SmkcHome;
    -    KeyCodeStrings[VK_LEFT]:=SmkcLeft;
    -    KeyCodeStrings[VK_UP]:=SmkcUp;
    -    KeyCodeStrings[VK_RIGHT]:=SmkcRight;
    -    KeyCodeStrings[VK_DOWN]:=SmkcDown;
    -    KeyCodeStrings[VK_INSERT]:=SmkcIns;
    -    KeyCodeStrings[VK_DELETE]:=SmkcDel;
    -    // must ignore single Shift, Alt, Ctrl in KeyCodeStrings
    -    //KeyCodeStrings[VK_SHIFT]:=SmkcShift;
    -    //KeyCodeStrings[VK_CONTROL]:=SmkcCtrl;
    -    //KeyCodeStrings[VK_MENU]:=SmkcAlt;
    -  end;
    -end;
    -
     function CompareDebugLCLItemInfos(Data1, Data2: Pointer): integer;
     begin
       Result:=ComparePointers(TDebugLCLItemInfo(Data1).Item,
    @@ -728,7 +676,31 @@
     function KeyCodeToKeyString(Key: integer): string;
     begin
       if (Key >= Low(KeyCodeStrings)) and (Key <= High(KeyCodeStrings)) then
    -    Result := KeyCodeStrings[Key]
    +  begin
    +    case Key of
    +       VK_BACK: Result:=SmkcBkSp;
    +       VK_TAB: Result:=SmkcTab;
    +       VK_ESCAPE: Result:=SmkcEsc;
    +       VK_RETURN: Result:=SmkcEnter;
    +       VK_SPACE: Result:=SmkcSpace;
    +       VK_PRIOR: Result:=SmkcPgUp;
    +       VK_NEXT: Result:=SmkcPgDn;
    +       VK_END: Result:=SmkcEnd;
    +       VK_HOME: Result:=SmkcHome;
    +       VK_LEFT: Result:=SmkcLeft;
    +       VK_UP: Result:=SmkcUp;
    +       VK_RIGHT: Result:=SmkcRight;
    +       VK_DOWN: Result:=SmkcDown;
    +       VK_INSERT: Result:=SmkcIns;
    +       VK_DELETE: Result:=SmkcDel;
    +       // must ignore single Shift, Alt, Ctrl in KeyCodeStrings
    +       //VK_SHIFT: Result:=SmkcShift;
    +       //VK_CONTROL: Result:=SmkcCtrl;
    +       //VK_MENU: Result:=SmkcAlt;
    +    otherwise
    +      Result := KeyCodeStrings[Key];
    +    end;
    +  end
       else
         Result := '';
     end;
    @@ -776,14 +748,13 @@
       Name: string;
     begin
       Result := '';
    -  InitializeMenuKeyCaps;
       Name := KeyCodeToKeyString(ShortCut and $FF);
       if Name <> '' then
       begin
    -    if ShortCut and scShift <> 0 then Result := Result + MenuKeyCaps[mkcShift];
    -    if ShortCut and scCtrl <> 0 then Result := Result + MenuKeyCaps[mkcCtrl];
    -    if ShortCut and scMeta <> 0 then Result := Result + MenuKeyCaps[mkcMeta];
    -    if ShortCut and scAlt <> 0 then Result := Result + MenuKeyCaps[mkcAlt];
    +    if ShortCut and scShift <> 0 then Result := Result + SmkcShift;
    +    if ShortCut and scCtrl <> 0 then Result := Result + SmkcCtrl;
    +    if ShortCut and scMeta <> 0 then Result := Result + SmkcMeta;
    +    if ShortCut and scAlt <> 0 then Result := Result + SmkcAlt;
         Result := Result + Name;
       end;
     end;
    @@ -811,18 +782,17 @@
       if ShortCutText = '' then Exit;
       Shift := 0;
       StartPos := 1;
    -  InitializeMenuKeyCaps;
       while True do
       begin
    -    if CompareFront(StartPos, MenuKeyCaps[mkcShift]) then
    +    if CompareFront(StartPos, SmkcShift) then
           Shift := Shift or scShift
         else if CompareFront(StartPos, '^') then
           Shift := Shift or scCtrl
    -    else if CompareFront(StartPos, MenuKeyCaps[mkcCtrl]) then
    +    else if CompareFront(StartPos, SmkcCtrl) then
           Shift := Shift or scCtrl
    -    else if CompareFront(StartPos, MenuKeyCaps[mkcAlt]) then
    +    else if CompareFront(StartPos, SmkcAlt) then
           Shift := Shift or scAlt
    -    else if CompareFront(StartPos, MenuKeyCaps[mkcMeta]) then
    +    else if CompareFront(StartPos, SmkcMeta) then
           Shift := Shift or scMeta
         else
           Break;
    
    shortcuts.pas.patch (4,956 bytes)

Relationships

related to 0030992 resolvedMichl Patches ShortcutToText faster, with array 
related to 0023082 closedMaxim Ganetsky Lazarus Shortcuts and i18n 

Activities

wp

2018-07-28 20:06

developer  

translated_keymodifiers.zip (23,522 bytes)

wp

2018-07-28 20:07

developer  

accelerator-keys.patch (1,055 bytes)
Index: lcl/lclproc.pas
===================================================================
--- lcl/lclproc.pas	(revision 58612)
+++ lcl/lclproc.pas	(working copy)
@@ -76,6 +76,8 @@
 function CompareDebugLCLItemInfos(Data1, Data2: Pointer): integer;
 function CompareItemWithDebugLCLItemInfo(Item, DebugItemInfo: Pointer): integer;
 
+var
+  MenuKeyCapsInited: boolean = false;
 
 type
   TStringsSortCompare = function(const Item1, Item2: string): Integer;
@@ -389,7 +391,6 @@
 
 var
   MenuKeyCaps: array[TMenuKeyCap] of string;
-  MenuKeyCapsInited: boolean = false;
 
 const
   // MS documentation:
Index: lcl/lcltranslator.pas
===================================================================
--- lcl/lcltranslator.pas	(revision 58612)
+++ lcl/lcltranslator.pas	(working copy)
@@ -85,6 +85,8 @@
 
 implementation
 
+uses
+  LCLProc;
 
 type
   TPersistentAccess = class(TPersistent);
@@ -515,6 +517,7 @@
   i: integer;
 
 begin
+  MenuKeyCapsInited := false;
   LocalTranslator := nil;
   // search first po translation resources
   try
accelerator-keys.patch (1,055 bytes)

wp

2018-07-29 11:47

developer   ~0109729

Last edited: 2018-07-29 11:49

View 2 revisions

> I would propose to declare "MenuKeyCapsInited" in the interface part of
> the unit and to reset it in the "LCLTranslator" unit whenever the language
> changes (-> see patch "accelerator-keys")

Maybe better (to avoid making this variable available globally): introduce a public procedure in LCLProc which resets the MenuKeyCapsInited - see patch "accelerator-keys-v2.patch"

wp

2018-07-29 11:48

developer  

accelerator-keys-v2.patch (1,201 bytes)
Index: lcl/lclproc.pas
===================================================================
--- lcl/lclproc.pas	(revision 58648)
+++ lcl/lclproc.pas	(working copy)
@@ -91,6 +91,7 @@
 function KeyStringIsIrregular(const s: string): boolean;
 function ShortCutToText(ShortCut: TShortCut): string;// untranslated
 function TextToShortCut(const ShortCutText: string): TShortCut;// untranslated
+procedure ResetMenuKeyCapsInitialized;
 
 function GetCompleteText(const sText: string; iSelStart: Integer;
   bCaseSensitive, bSearchAscending: Boolean; slTextList: TStrings): string;
@@ -657,6 +658,10 @@
     '' // 0xff
   );
 
+procedure ResetMenuKeyCapsInitialized;
+begin
+  MenuKeyCapsInited := false;
+end;
 
 procedure InitializeMenuKeyCaps;
 begin
Index: lcl/lcltranslator.pas
===================================================================
--- lcl/lcltranslator.pas	(revision 58648)
+++ lcl/lcltranslator.pas	(working copy)
@@ -85,6 +85,8 @@
 
 implementation
 
+uses
+  LCLProc;
 
 type
   TPersistentAccess = class(TPersistent);
@@ -515,6 +517,7 @@
   i: integer;
 
 begin
+  ResetMenuKeyCapsInitialized;
   LocalTranslator := nil;
   // search first po translation resources
   try

Alexey Tor.

2018-07-30 14:30

reporter   ~0109759

In all Rus programs users are used to En hotkey names: Ctrl+O, Alt+Home...
So translation of these hotkey names will be bad for Ru users.

wp

2018-07-30 15:06

developer   ~0109760

Last edited: 2018-07-30 16:13

View 3 revisions

This is a matter of the translation file. If the Russian po file does not contain the translations for "Ctrl+", "Shift+" etc or duplicates the English words then the key names will remain in English.

Maxim Ganetsky

2018-08-01 01:31

developer  

shortcuts.pas.patch (4,956 bytes)
Index: lcl/lclproc.pas
===================================================================
--- lcl/lclproc.pas	(revision 58660)
+++ lcl/lclproc.pas	(working copy)
@@ -387,10 +387,6 @@
     mkcPgDn, mkcEnd, mkcHome, mkcLeft, mkcUp, mkcRight, mkcDown, mkcIns,
     mkcDel, mkcShift, mkcCtrl, mkcAlt, mkcMeta);
 
-var
-  MenuKeyCaps: array[TMenuKeyCap] of string;
-  MenuKeyCapsInited: boolean = false;
-
 const
   // MS documentation:
   // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
@@ -658,54 +654,6 @@
   );
 
 
-procedure InitializeMenuKeyCaps;
-begin
-  if not MenuKeyCapsInited then
-  begin
-    MenuKeyCapsInited:=true;
-
-    MenuKeyCaps[mkcBkSp]:=SmkcBkSp;
-    MenuKeyCaps[mkcTab]:=SmkcTab;
-    MenuKeyCaps[mkcEsc]:=SmkcEsc;
-    MenuKeyCaps[mkcEnter]:=SmkcEnter;
-    MenuKeyCaps[mkcSpace]:=SmkcSpace;
-    MenuKeyCaps[mkcPgUp]:=SmkcPgUp;
-    MenuKeyCaps[mkcPgDn]:=SmkcPgDn;
-    MenuKeyCaps[mkcEnd]:=SmkcEnd;
-    MenuKeyCaps[mkcHome]:=SmkcHome;
-    MenuKeyCaps[mkcLeft]:=SmkcLeft;
-    MenuKeyCaps[mkcUp]:=SmkcUp;
-    MenuKeyCaps[mkcRight]:=SmkcRight;
-    MenuKeyCaps[mkcDown]:=SmkcDown;
-    MenuKeyCaps[mkcIns]:=SmkcIns;
-    MenuKeyCaps[mkcDel]:=SmkcDel;
-    MenuKeyCaps[mkcShift]:=SmkcShift;
-    MenuKeyCaps[mkcCtrl]:=SmkcCtrl;
-    MenuKeyCaps[mkcAlt]:=SmkcAlt;
-    MenuKeyCaps[mkcMeta]:=SmkcMeta;
-
-    KeyCodeStrings[VK_BACK]:=SmkcBkSp;
-    KeyCodeStrings[VK_TAB]:=SmkcTab;
-    KeyCodeStrings[VK_ESCAPE]:=SmkcEsc;
-    KeyCodeStrings[VK_RETURN]:=SmkcEnter;
-    KeyCodeStrings[VK_SPACE]:=SmkcSpace;
-    KeyCodeStrings[VK_PRIOR]:=SmkcPgUp;
-    KeyCodeStrings[VK_NEXT]:=SmkcPgDn;
-    KeyCodeStrings[VK_END]:=SmkcEnd;
-    KeyCodeStrings[VK_HOME]:=SmkcHome;
-    KeyCodeStrings[VK_LEFT]:=SmkcLeft;
-    KeyCodeStrings[VK_UP]:=SmkcUp;
-    KeyCodeStrings[VK_RIGHT]:=SmkcRight;
-    KeyCodeStrings[VK_DOWN]:=SmkcDown;
-    KeyCodeStrings[VK_INSERT]:=SmkcIns;
-    KeyCodeStrings[VK_DELETE]:=SmkcDel;
-    // must ignore single Shift, Alt, Ctrl in KeyCodeStrings
-    //KeyCodeStrings[VK_SHIFT]:=SmkcShift;
-    //KeyCodeStrings[VK_CONTROL]:=SmkcCtrl;
-    //KeyCodeStrings[VK_MENU]:=SmkcAlt;
-  end;
-end;
-
 function CompareDebugLCLItemInfos(Data1, Data2: Pointer): integer;
 begin
   Result:=ComparePointers(TDebugLCLItemInfo(Data1).Item,
@@ -728,7 +676,31 @@
 function KeyCodeToKeyString(Key: integer): string;
 begin
   if (Key >= Low(KeyCodeStrings)) and (Key <= High(KeyCodeStrings)) then
-    Result := KeyCodeStrings[Key]
+  begin
+    case Key of
+       VK_BACK: Result:=SmkcBkSp;
+       VK_TAB: Result:=SmkcTab;
+       VK_ESCAPE: Result:=SmkcEsc;
+       VK_RETURN: Result:=SmkcEnter;
+       VK_SPACE: Result:=SmkcSpace;
+       VK_PRIOR: Result:=SmkcPgUp;
+       VK_NEXT: Result:=SmkcPgDn;
+       VK_END: Result:=SmkcEnd;
+       VK_HOME: Result:=SmkcHome;
+       VK_LEFT: Result:=SmkcLeft;
+       VK_UP: Result:=SmkcUp;
+       VK_RIGHT: Result:=SmkcRight;
+       VK_DOWN: Result:=SmkcDown;
+       VK_INSERT: Result:=SmkcIns;
+       VK_DELETE: Result:=SmkcDel;
+       // must ignore single Shift, Alt, Ctrl in KeyCodeStrings
+       //VK_SHIFT: Result:=SmkcShift;
+       //VK_CONTROL: Result:=SmkcCtrl;
+       //VK_MENU: Result:=SmkcAlt;
+    otherwise
+      Result := KeyCodeStrings[Key];
+    end;
+  end
   else
     Result := '';
 end;
@@ -776,14 +748,13 @@
   Name: string;
 begin
   Result := '';
-  InitializeMenuKeyCaps;
   Name := KeyCodeToKeyString(ShortCut and $FF);
   if Name <> '' then
   begin
-    if ShortCut and scShift <> 0 then Result := Result + MenuKeyCaps[mkcShift];
-    if ShortCut and scCtrl <> 0 then Result := Result + MenuKeyCaps[mkcCtrl];
-    if ShortCut and scMeta <> 0 then Result := Result + MenuKeyCaps[mkcMeta];
-    if ShortCut and scAlt <> 0 then Result := Result + MenuKeyCaps[mkcAlt];
+    if ShortCut and scShift <> 0 then Result := Result + SmkcShift;
+    if ShortCut and scCtrl <> 0 then Result := Result + SmkcCtrl;
+    if ShortCut and scMeta <> 0 then Result := Result + SmkcMeta;
+    if ShortCut and scAlt <> 0 then Result := Result + SmkcAlt;
     Result := Result + Name;
   end;
 end;
@@ -811,18 +782,17 @@
   if ShortCutText = '' then Exit;
   Shift := 0;
   StartPos := 1;
-  InitializeMenuKeyCaps;
   while True do
   begin
-    if CompareFront(StartPos, MenuKeyCaps[mkcShift]) then
+    if CompareFront(StartPos, SmkcShift) then
       Shift := Shift or scShift
     else if CompareFront(StartPos, '^') then
       Shift := Shift or scCtrl
-    else if CompareFront(StartPos, MenuKeyCaps[mkcCtrl]) then
+    else if CompareFront(StartPos, SmkcCtrl) then
       Shift := Shift or scCtrl
-    else if CompareFront(StartPos, MenuKeyCaps[mkcAlt]) then
+    else if CompareFront(StartPos, SmkcAlt) then
       Shift := Shift or scAlt
-    else if CompareFront(StartPos, MenuKeyCaps[mkcMeta]) then
+    else if CompareFront(StartPos, SmkcMeta) then
       Shift := Shift or scMeta
     else
       Break;
shortcuts.pas.patch (4,956 bytes)

Maxim Ganetsky

2018-08-01 01:34

developer   ~0109804

Last edited: 2018-08-01 01:41

View 2 revisions

Please test attached shortcuts.pas.patch and report. Make sure to compile clean.

wp

2018-08-01 07:10

developer   ~0109807

Works fine. Thank you.

Maxim Ganetsky

2018-08-02 00:37

developer   ~0109822

Committed with some further cleanups.

wp

2018-08-02 23:17

developer   ~0109848

Thanks.

Issue History

Date Modified Username Field Change
2018-07-28 20:06 wp New Issue
2018-07-28 20:06 wp File Added: translated_keymodifiers.zip
2018-07-28 20:07 wp File Added: accelerator-keys.patch
2018-07-28 20:07 wp Description Updated View Revisions
2018-07-28 20:07 wp Assigned To => Maxim Ganetsky
2018-07-28 20:07 wp Status new => assigned
2018-07-28 21:56 Michl Relationship added related to 0030992
2018-07-28 22:18 wp Relationship added related to 0023082
2018-07-29 11:47 wp Note Added: 0109729
2018-07-29 11:48 wp File Added: accelerator-keys-v2.patch
2018-07-29 11:48 wp Description Updated View Revisions
2018-07-29 11:49 wp Note Edited: 0109729 View Revisions
2018-07-30 14:30 Alexey Tor. Note Added: 0109759
2018-07-30 15:06 wp Note Added: 0109760
2018-07-30 16:12 wp Note Edited: 0109760 View Revisions
2018-07-30 16:13 wp Note Edited: 0109760 View Revisions
2018-08-01 01:30 Maxim Ganetsky File Added: shortcuts.pas
2018-08-01 01:31 Maxim Ganetsky File Deleted: shortcuts.pas
2018-08-01 01:31 Maxim Ganetsky File Added: shortcuts.pas.patch
2018-08-01 01:34 Maxim Ganetsky Note Added: 0109804
2018-08-01 01:34 Maxim Ganetsky Status assigned => feedback
2018-08-01 01:41 Maxim Ganetsky Note Edited: 0109804 View Revisions
2018-08-01 07:10 wp Note Added: 0109807
2018-08-01 07:10 wp Status feedback => assigned
2018-08-02 00:37 Maxim Ganetsky Fixed in Revision => 58661
2018-08-02 00:37 Maxim Ganetsky Note Added: 0109822
2018-08-02 00:37 Maxim Ganetsky Status assigned => resolved
2018-08-02 00:37 Maxim Ganetsky Fixed in Version => 1.10
2018-08-02 00:37 Maxim Ganetsky Resolution open => fixed
2018-08-02 23:17 wp Note Added: 0109848
2018-08-02 23:17 wp Status resolved => closed