flyByHelpSpec -> helpSpec draft
authorClaus Gittinger <cg@exept.de>
Tue, 16 Jan 2018 22:31:20 +0100
changeset 3522 2a319ce12319
parent 3521 fda84ae10fee
child 3523 25fa267c550a
flyByHelpSpec -> helpSpec
Tools__InternationalLanguageTranslationEditor.st
--- a/Tools__InternationalLanguageTranslationEditor.st	Tue Jan 16 22:14:35 2018 +0100
+++ b/Tools__InternationalLanguageTranslationEditor.st	Tue Jan 16 22:31:20 2018 +0100
@@ -96,10 +96,10 @@
 
 !InternationalLanguageTranslationEditor class methodsFor:'help spec'!
 
-flyByHelpSpec
+helpSpec
     <resource: #help>
 
-    ^ super flyByHelpSpec addPairsFrom:#(
+    ^ super helpSpec addPairsFrom:#(
 
 #searchBox
 'Show a search box at the bottom to search for substrings in the string keys'
@@ -110,29 +110,6 @@
 )
 ! !
 
-!InternationalLanguageTranslationEditor class methodsFor:'help specs'!
-
-helpSpec
-    "This resource specification was automatically generated
-     by the UIHelpTool of ST/X."
-
-    "Do not manually edit this!! If it is corrupted,
-     the UIHelpTool may not be able to read the specification."
-
-    "
-     UIHelpTool openOnClass:Tools::InternationalLanguageTranslationEditor    
-    "
-
-    <resource: #help>
-
-    ^ super helpSpec addPairsFrom:#(
-
-#searchBox
-''
-
-)
-! !
-
 !InternationalLanguageTranslationEditor class methodsFor:'image specs'!
 
 closeSearchBarIcon
@@ -337,249 +314,249 @@
 
     <resource: #canvas>
 
-    ^ 
+    ^
     #(FullSpec
        name: windowSpec
-       window: 
+       window:
       (WindowSpec
-         label: 'InternationalLanguageTranslationEditor'
-         name: 'InternationalLanguageTranslationEditor'
-         min: (Point 10 10)
-         bounds: (Rectangle 0 0 774 610)
-         menu: mainMenu
+	 label: 'InternationalLanguageTranslationEditor'
+	 name: 'InternationalLanguageTranslationEditor'
+	 min: (Point 10 10)
+	 bounds: (Rectangle 0 0 774 610)
+	 menu: mainMenu
        )
-       component: 
+       component:
       (SpecCollection
-         collection: (
-          (MenuPanelSpec
-             name: 'ToolBar'
-             layout: (LayoutFrame 0 0 0 0 0 1 30 0)
-             menu: menuToolBar
-             textDefault: true
-           )
-          (VariableVerticalPanelSpec
-             name: 'TranslationsVariableVerticalPanel'
-             layout: (LayoutFrame 0 0 30 0 0 1 -32 1)
-             component: 
-            (SpecCollection
-               collection: (
-                (DataSetSpec
-                   name: 'KeyStringAndLanguageSelectionTable'
-                   model: selectedKeyRow
-                   menu: keyStringAndLanguageSelectionTableMenu
-                   hasHorizontalScrollBar: true
-                   hasVerticalScrollBar: true
-                   dataList: keyStringAndLanguageSelectionTable
-                   columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder
-                   beDependentOfRows: true
-                   columnAdaptor: yourself
-                   postBuildCallback: postBuildDataSet:
-                 )
-                (VariableVerticalPanelSpec
-                   name: 'VariableVerticalPanel1'
-                   component: 
-                  (SpecCollection
-                     collection: (
-                      (ViewSpec
-                         name: 'Box1'
-                         component: 
-                        (SpecCollection
-                           collection: (
-                            (LabelSpec
-                               label: 'Original String (Key):'
-                               name: 'Label2'
-                               layout: (LayoutFrame 0 0 -2 0 0 1 28 0)
-                               translateLabel: true
-                               adjust: left
-                             )
-                            (TextEditorSpec
-                               name: 'OriginalText'
-                               layout: (LayoutFrame 0 0 27 0 0 1 -2 1)
-                               model: originalTextHolder
-                               hasHorizontalScrollBar: true
-                               hasVerticalScrollBar: true
-                               modifiedChannel: originalTextModifiedHolder
-                               acceptCallBack: languageTextAccepted
-                               hasKeyboardFocusInitially: false
-                             )
-                            )
-                          
-                         )
-                       )
-                      (ViewSpec
-                         name: 'Box3'
-                         component: 
-                        (SpecCollection
-                           collection: (
-                            (LabelSpec
-                               label: 'Select Another Language as example:'
-                               name: 'Label3'
-                               layout: (LayoutFrame 0 0 -6 0 0 1 24 0)
-                               translateLabel: true
-                               adjust: left
-                             )
-                            (ComboBoxSpec
-                               name: 'ComboBox1'
-                               layout: (LayoutFrame 281 0 -2 0 406 0 18 0)
-                               model: exampleLanguageSelectionHolder
-                               immediateAccept: false
-                               acceptOnLeave: true
-                               acceptOnLostFocus: true
-                               acceptOnPointerLeave: false
-                               comboList: shownLanguages
-                               useIndex: false
-                             )
-                            (TextEditorSpec
-                               name: 'ExampleLanguageText'
-                               layout: (LayoutFrame 0 0 30 0 0 1 0 1)
-                               model: exampleLanguageTextHolder
-                               hasHorizontalScrollBar: true
-                               hasVerticalScrollBar: true
-                               isReadOnly: true
-                               hasKeyboardFocusInitially: false
-                             )
-                            )
-                          
-                         )
-                       )
-                      (ViewSpec
-                         name: 'Box2'
-                         component: 
-                        (SpecCollection
-                           collection: (
-                            (LabelSpec
-                               label: 'Translated String:'
-                               name: 'Label1'
-                               layout: (LayoutFrame 0 0 0 0 0 1 30 0)
-                               translateLabel: true
-                               adjust: left
-                             )
-                            (TextEditorSpec
-                               name: 'LanguageText'
-                               layout: (LayoutFrame 0 0 30 0 0 1 0 1)
-                               model: languageTextHolder
-                               hasHorizontalScrollBar: true
-                               hasVerticalScrollBar: true
-                               acceptChannel: languageTextAcceptHolder
-                               modifiedChannel: languageTextModifiedHolder
-                               acceptCallBack: languageTextAccepted
-                               hasKeyboardFocusInitially: false
-                               postBuildCallback: languageEditorBuilt:
-                             )
-                            (ActionButtonSpec
-                               label: 'Paste Previous'
-                               name: 'pastePreviousTranslation'
-                               layout: (LayoutOrigin 0 0.83085250338295003 0 0.034482758620689995)
-                               translateLabel: true
-                               model: pastePreviousTranslationInLanguageText
-                               enableChannel: pastePreviousTranslationEnableHolder
-                               disabledLogo: 'Paste Previous'
-                             )
-                            (ActionButtonSpec
-                               label: 'Paste Original'
-                               name: 'Button1'
-                               layout: (LayoutOrigin -95 0.83085250338295003 0 0.034482758620689995)
-                               translateLabel: true
-                               model: pasteOriginalInLanguageText
-                               enableChannel: pasteOriginalEnableHolder
-                               disabledLogo: 'Paste Original'
-                             )
-                            )
-                          
-                         )
-                       )
-                      )
-                    
-                   )
-                   handles: (Any 0.3333333333333301 0.66666666666667018 1.0)
-                 )
-                )
-              
-             )
-             handles: (Any 0.5 1.0)
-             postBuildCallback: postBuildTranslationsPanel:
-           )
-          (ViewSpec
-             name: 'SearchBox'
-             layout: (LayoutFrame 0 0 -32 1 0 1 0 1)
-             level: -1
-             visibilityChannel: searchBoxVisible
-             component: 
-            (SpecCollection
-               collection: (
-                (ActionButtonSpec
-                   label: 'closeSearchBarIcon'
-                   name: 'closeSearchBarButton'
-                   layout: (LayoutFrame 4 0 5 0 25 0 26 0)
-                   hasCharacterOrientedLabel: false
-                   translateLabel: true
-                   model: closeSearchBar
-                 )
-                (LabelSpec
-                   label: 'Search:'
-                   name: 'SearchLabel'
-                   layout: (LayoutFrame 30 0 5 0 100 0 27 0)
-                   translateLabel: true
-                   adjust: right
-                 )
-                (InputFieldSpec
-                   name: 'SearchEntryField'
-                   layout: (LayoutFrame 100 0 5 0 257 0 27 0)
-                   model: searchTextHolder
-                   immediateAccept: true
-                   acceptOnReturn: true
-                   acceptOnTab: true
-                   acceptOnLostFocus: true
-                   modifiedChannel: searchTextModifiedHolder
-                   acceptOnPointerLeave: false
-                   postBuildCallback: postBuildSearchTextView:
-                 )
-                (ActionButtonSpec
-                   label: 'searchNextIcon'
-                   name: 'SearchNextButton'
-                   layout: (LayoutFrame 264 0 5 0 285 0 26 0)
-                   hasCharacterOrientedLabel: false
-                   translateLabel: true
-                   model: searchNextText
-                 )
-                (ActionButtonSpec
-                   label: 'searchPreviousIcon'
-                   name: 'searchPreviousButton'
-                   layout: (LayoutFrame 292 0 5 0 313 0 26 0)
-                   hasCharacterOrientedLabel: false
-                   translateLabel: true
-                   model: searchPreviousText
-                 )
-                (CheckBoxSpec
-                   label: 'Ignore case'
-                   name: 'IgnoreCaseCheckBox'
-                   layout: (LayoutFrame 322 0 5 0 518 0 27 0)
-                   model: ignoreCaseHolder
-                   translateLabel: true
-                 )
-                (LabelSpec
-                   label: 'SearchBarImageInfoLabel'
-                   name: 'SearchBarImageInfoLabel'
-                   layout: (LayoutFrame 524 0 5 0 548 0 27 0)
-                   hasCharacterOrientedLabel: false
-                   translateLabel: true
-                   labelChannel: searchBarImageInfoLabelHolder
-                 )
-                (LabelSpec
-                   label: 'SearchBarInfoLabel'
-                   name: 'SearchBarInfoLabel'
-                   layout: (LayoutFrame 551 0 5 0 829 0 27 0)
-                   translateLabel: true
-                   labelChannel: searchBarInfoLabelHolder
-                   adjust: left
-                 )
-                )
-              
-             )
-             postBuildCallback: postBuildSearchBoxView:
-           )
-          )
-        
+	 collection: (
+	  (MenuPanelSpec
+	     name: 'ToolBar'
+	     layout: (LayoutFrame 0 0 0 0 0 1 30 0)
+	     menu: menuToolBar
+	     textDefault: true
+	   )
+	  (VariableVerticalPanelSpec
+	     name: 'TranslationsVariableVerticalPanel'
+	     layout: (LayoutFrame 0 0 30 0 0 1 -32 1)
+	     component:
+	    (SpecCollection
+	       collection: (
+		(DataSetSpec
+		   name: 'KeyStringAndLanguageSelectionTable'
+		   model: selectedKeyRow
+		   menu: keyStringAndLanguageSelectionTableMenu
+		   hasHorizontalScrollBar: true
+		   hasVerticalScrollBar: true
+		   dataList: keyStringAndLanguageSelectionTable
+		   columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder
+		   beDependentOfRows: true
+		   columnAdaptor: yourself
+		   postBuildCallback: postBuildDataSet:
+		 )
+		(VariableVerticalPanelSpec
+		   name: 'VariableVerticalPanel1'
+		   component:
+		  (SpecCollection
+		     collection: (
+		      (ViewSpec
+			 name: 'Box1'
+			 component:
+			(SpecCollection
+			   collection: (
+			    (LabelSpec
+			       label: 'Original String (Key):'
+			       name: 'Label2'
+			       layout: (LayoutFrame 0 0 -2 0 0 1 28 0)
+			       translateLabel: true
+			       adjust: left
+			     )
+			    (TextEditorSpec
+			       name: 'OriginalText'
+			       layout: (LayoutFrame 0 0 27 0 0 1 -2 1)
+			       model: originalTextHolder
+			       hasHorizontalScrollBar: true
+			       hasVerticalScrollBar: true
+			       modifiedChannel: originalTextModifiedHolder
+			       acceptCallBack: languageTextAccepted
+			       hasKeyboardFocusInitially: false
+			     )
+			    )
+
+			 )
+		       )
+		      (ViewSpec
+			 name: 'Box3'
+			 component:
+			(SpecCollection
+			   collection: (
+			    (LabelSpec
+			       label: 'Select Another Language as example:'
+			       name: 'Label3'
+			       layout: (LayoutFrame 0 0 -6 0 0 1 24 0)
+			       translateLabel: true
+			       adjust: left
+			     )
+			    (ComboBoxSpec
+			       name: 'ComboBox1'
+			       layout: (LayoutFrame 281 0 -2 0 406 0 18 0)
+			       model: exampleLanguageSelectionHolder
+			       immediateAccept: false
+			       acceptOnLeave: true
+			       acceptOnLostFocus: true
+			       acceptOnPointerLeave: false
+			       comboList: shownLanguages
+			       useIndex: false
+			     )
+			    (TextEditorSpec
+			       name: 'ExampleLanguageText'
+			       layout: (LayoutFrame 0 0 30 0 0 1 0 1)
+			       model: exampleLanguageTextHolder
+			       hasHorizontalScrollBar: true
+			       hasVerticalScrollBar: true
+			       isReadOnly: true
+			       hasKeyboardFocusInitially: false
+			     )
+			    )
+
+			 )
+		       )
+		      (ViewSpec
+			 name: 'Box2'
+			 component:
+			(SpecCollection
+			   collection: (
+			    (LabelSpec
+			       label: 'Translated String:'
+			       name: 'Label1'
+			       layout: (LayoutFrame 0 0 0 0 0 1 30 0)
+			       translateLabel: true
+			       adjust: left
+			     )
+			    (TextEditorSpec
+			       name: 'LanguageText'
+			       layout: (LayoutFrame 0 0 30 0 0 1 0 1)
+			       model: languageTextHolder
+			       hasHorizontalScrollBar: true
+			       hasVerticalScrollBar: true
+			       acceptChannel: languageTextAcceptHolder
+			       modifiedChannel: languageTextModifiedHolder
+			       acceptCallBack: languageTextAccepted
+			       hasKeyboardFocusInitially: false
+			       postBuildCallback: languageEditorBuilt:
+			     )
+			    (ActionButtonSpec
+			       label: 'Paste Previous'
+			       name: 'pastePreviousTranslation'
+			       layout: (LayoutOrigin 0 0.83085250338295003 0 0.034482758620689995)
+			       translateLabel: true
+			       model: pastePreviousTranslationInLanguageText
+			       enableChannel: pastePreviousTranslationEnableHolder
+			       disabledLogo: 'Paste Previous'
+			     )
+			    (ActionButtonSpec
+			       label: 'Paste Original'
+			       name: 'Button1'
+			       layout: (LayoutOrigin -95 0.83085250338295003 0 0.034482758620689995)
+			       translateLabel: true
+			       model: pasteOriginalInLanguageText
+			       enableChannel: pasteOriginalEnableHolder
+			       disabledLogo: 'Paste Original'
+			     )
+			    )
+
+			 )
+		       )
+		      )
+
+		   )
+		   handles: (Any 0.3333333333333301 0.66666666666667018 1.0)
+		 )
+		)
+
+	     )
+	     handles: (Any 0.5 1.0)
+	     postBuildCallback: postBuildTranslationsPanel:
+	   )
+	  (ViewSpec
+	     name: 'SearchBox'
+	     layout: (LayoutFrame 0 0 -32 1 0 1 0 1)
+	     level: -1
+	     visibilityChannel: searchBoxVisible
+	     component:
+	    (SpecCollection
+	       collection: (
+		(ActionButtonSpec
+		   label: 'closeSearchBarIcon'
+		   name: 'closeSearchBarButton'
+		   layout: (LayoutFrame 4 0 5 0 25 0 26 0)
+		   hasCharacterOrientedLabel: false
+		   translateLabel: true
+		   model: closeSearchBar
+		 )
+		(LabelSpec
+		   label: 'Search:'
+		   name: 'SearchLabel'
+		   layout: (LayoutFrame 30 0 5 0 100 0 27 0)
+		   translateLabel: true
+		   adjust: right
+		 )
+		(InputFieldSpec
+		   name: 'SearchEntryField'
+		   layout: (LayoutFrame 100 0 5 0 257 0 27 0)
+		   model: searchTextHolder
+		   immediateAccept: true
+		   acceptOnReturn: true
+		   acceptOnTab: true
+		   acceptOnLostFocus: true
+		   modifiedChannel: searchTextModifiedHolder
+		   acceptOnPointerLeave: false
+		   postBuildCallback: postBuildSearchTextView:
+		 )
+		(ActionButtonSpec
+		   label: 'searchNextIcon'
+		   name: 'SearchNextButton'
+		   layout: (LayoutFrame 264 0 5 0 285 0 26 0)
+		   hasCharacterOrientedLabel: false
+		   translateLabel: true
+		   model: searchNextText
+		 )
+		(ActionButtonSpec
+		   label: 'searchPreviousIcon'
+		   name: 'searchPreviousButton'
+		   layout: (LayoutFrame 292 0 5 0 313 0 26 0)
+		   hasCharacterOrientedLabel: false
+		   translateLabel: true
+		   model: searchPreviousText
+		 )
+		(CheckBoxSpec
+		   label: 'Ignore case'
+		   name: 'IgnoreCaseCheckBox'
+		   layout: (LayoutFrame 322 0 5 0 518 0 27 0)
+		   model: ignoreCaseHolder
+		   translateLabel: true
+		 )
+		(LabelSpec
+		   label: 'SearchBarImageInfoLabel'
+		   name: 'SearchBarImageInfoLabel'
+		   layout: (LayoutFrame 524 0 5 0 548 0 27 0)
+		   hasCharacterOrientedLabel: false
+		   translateLabel: true
+		   labelChannel: searchBarImageInfoLabelHolder
+		 )
+		(LabelSpec
+		   label: 'SearchBarInfoLabel'
+		   name: 'SearchBarInfoLabel'
+		   layout: (LayoutFrame 551 0 5 0 829 0 27 0)
+		   translateLabel: true
+		   labelChannel: searchBarInfoLabelHolder
+		   adjust: left
+		 )
+		)
+
+	     )
+	     postBuildCallback: postBuildSearchBoxView:
+	   )
+	  )
+
        )
      )
 ! !
@@ -601,41 +578,41 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
-        (
-         (MenuItem
-            label: 'Browse Methods Containing this String'
-            itemValue: browseReferringMethods
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Set Current NameSpace...'
-            itemValue: changeLastNameSpace
-          )
-         (MenuItem
-            label: 'Search String in Current NameSpace'
-            itemValue: searchStringInLastNameSpace
-          )
-         (MenuItem
-            label: '-'
-            isVisible: false
-          )
-         (MenuItem
-            label: 'Set Current Package...'
-            itemValue: changeLastPackage
-            isVisible: false
-          )
-         (MenuItem
-            label: 'Search String in Current Package'
-            itemValue: searchStringInLastPackage
-            isVisible: false
-          )
-         )
-        nil
-        nil
+	(
+	 (MenuItem
+	    label: 'Browse Methods Containing this String'
+	    itemValue: browseReferringMethods
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    label: 'Set Current NameSpace...'
+	    itemValue: changeLastNameSpace
+	  )
+	 (MenuItem
+	    label: 'Search String in Current NameSpace'
+	    itemValue: searchStringInLastNameSpace
+	  )
+	 (MenuItem
+	    label: '-'
+	    isVisible: false
+	  )
+	 (MenuItem
+	    label: 'Set Current Package...'
+	    itemValue: changeLastPackage
+	    isVisible: false
+	  )
+	 (MenuItem
+	    label: 'Search String in Current Package'
+	    itemValue: searchStringInLastPackage
+	    isVisible: false
+	  )
+	 )
+	nil
+	nil
       )
 !
 
@@ -654,169 +631,169 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
-        (
-         (MenuItem
-            label: 'File'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'New'
-                  itemValue: menuNew
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Open Resources for Package or Project...'
-                  itemValue: menuOpenByPackage
-                )
-               (MenuItem
-                  label: 'Open Resource File...'
-                  itemValue: menuOpen
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Save All Resource Files'
-                  itemValue: menuSaveAll
-                )
-               (MenuItem
-                  label: 'Save Resource File'
-                  itemValue: menuSave
-                )
-               (MenuItem
-                  label: 'Save Resource File As...'
-                  itemValue: menuSaveAs
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Import existing translations from file...'
-                  itemValue: importExistingTranslationsFromFile
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Set Current NameSpace'
-                  itemValue: changeLastNameSpace
-                )
-               (MenuItem
-                  label: 'Set Current Package'
-                  itemValue: changeLastPackage
-                  isVisible: false
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Exit'
-                  itemValue: closeRequest
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'View'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Show Missing Translations Only'
-                  indication: showMissingTranslationsOnly
-                )
-               (MenuItem
-                  label: 'Show Search Box'
-                  indication: searchBoxVisible
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Shown Languages'
-                  submenuChannel: shownLanguagesMenu
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'Languages'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Add Language...'
-                  itemValue: addLanguage
-                )
-               (MenuItem
-                  label: 'Remove Language...'
-                  itemValue: removeLanguage
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'Translations'
-            submenuChannel: translationsMenuSpec
-          )
-         (MenuItem
-            label: 'Preferences'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Auto Accept Changes'
-                  indication: autoAcceptHolder
-                )
-               (MenuItem
-                  label: 'Search For Similar Translations'
-                  indication: searchForSimilarTranslationEnableHolder
-                )
-               (MenuItem
-                  label: 'Always Write UTF8'
-                  indication: alwaysWriteUTF8Holder
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'Help'
-            startGroup: right
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Documentation'
-                  itemValue: openDocumentation
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'About this Application...'
-                  itemValue: openAboutThisApplication
-                )
-               )
-              nil
-              nil
-            )
-          )
-         )
-        nil
-        nil
+	(
+	 (MenuItem
+	    label: 'File'
+	    submenu:
+	   (Menu
+	      (
+	       (MenuItem
+		  label: 'New'
+		  itemValue: menuNew
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Open Resources for Package or Project...'
+		  itemValue: menuOpenByPackage
+		)
+	       (MenuItem
+		  label: 'Open Resource File...'
+		  itemValue: menuOpen
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Save All Resource Files'
+		  itemValue: menuSaveAll
+		)
+	       (MenuItem
+		  label: 'Save Resource File'
+		  itemValue: menuSave
+		)
+	       (MenuItem
+		  label: 'Save Resource File As...'
+		  itemValue: menuSaveAs
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Import existing translations from file...'
+		  itemValue: importExistingTranslationsFromFile
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Set Current NameSpace'
+		  itemValue: changeLastNameSpace
+		)
+	       (MenuItem
+		  label: 'Set Current Package'
+		  itemValue: changeLastPackage
+		  isVisible: false
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Exit'
+		  itemValue: closeRequest
+		)
+	       )
+	      nil
+	      nil
+	    )
+	  )
+	 (MenuItem
+	    label: 'View'
+	    submenu:
+	   (Menu
+	      (
+	       (MenuItem
+		  label: 'Show Missing Translations Only'
+		  indication: showMissingTranslationsOnly
+		)
+	       (MenuItem
+		  label: 'Show Search Box'
+		  indication: searchBoxVisible
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'Shown Languages'
+		  submenuChannel: shownLanguagesMenu
+		)
+	       )
+	      nil
+	      nil
+	    )
+	  )
+	 (MenuItem
+	    label: 'Languages'
+	    submenu:
+	   (Menu
+	      (
+	       (MenuItem
+		  label: 'Add Language...'
+		  itemValue: addLanguage
+		)
+	       (MenuItem
+		  label: 'Remove Language...'
+		  itemValue: removeLanguage
+		)
+	       )
+	      nil
+	      nil
+	    )
+	  )
+	 (MenuItem
+	    label: 'Translations'
+	    submenuChannel: translationsMenuSpec
+	  )
+	 (MenuItem
+	    label: 'Preferences'
+	    submenu:
+	   (Menu
+	      (
+	       (MenuItem
+		  label: 'Auto Accept Changes'
+		  indication: autoAcceptHolder
+		)
+	       (MenuItem
+		  label: 'Search For Similar Translations'
+		  indication: searchForSimilarTranslationEnableHolder
+		)
+	       (MenuItem
+		  label: 'Always Write UTF8'
+		  indication: alwaysWriteUTF8Holder
+		)
+	       )
+	      nil
+	      nil
+	    )
+	  )
+	 (MenuItem
+	    label: 'Help'
+	    startGroup: right
+	    submenu:
+	   (Menu
+	      (
+	       (MenuItem
+		  label: 'Documentation'
+		  itemValue: openDocumentation
+		)
+	       (MenuItem
+		  label: '-'
+		)
+	       (MenuItem
+		  label: 'About this Application...'
+		  itemValue: openAboutThisApplication
+		)
+	       )
+	      nil
+	      nil
+	    )
+	  )
+	 )
+	nil
+	nil
       )
 !
 
@@ -865,62 +842,62 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
-        (
-         (MenuItem
-            label: 'Save'
-            itemValue: menuSave
-            isButton: true
-            labelImage: (ResourceRetriever XPToolbarIconLibrary saveImageIcon)
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Add Translation'
-            itemValue: addTranslation
-            isButton: true
-            labelImage: (ResourceRetriever XPToolbarIconLibrary newRowIcon)
-          )
-         (MenuItem
-            label: 'Remove Translation'
-            itemValue: removeTranslation
-            isButton: true
-            labelImage: (ResourceRetriever XPToolbarIconLibrary removeRowIcon)
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            activeHelpKey: browseReferringMethods
-            label: 'Browse'
-            itemValue: browseReferringMethods
-            labelImage: (ResourceRetriever ToolbarIconLibrary systemBrowserIcon)
-          )
-         (MenuItem
-            label: ''
-          )
-         (MenuItem
-            label: 'Stop Application'
-            itemValue: stopApplication
-            isButton: true
-            isVisible: stopApplicationIconVisibleHolder
-            labelImage: (ResourceRetriever XPToolbarIconLibrary stop16x16Icon)
-          )
-         (MenuItem
-            activeHelpKey: searchBox
-            label: 'Search'
-            isButton: true
-            startGroup: right
-            hideMenuOnActivated: false
-            indication: searchBoxVisible
-            shortcutKey: Ctrlf
-            labelImage: (ResourceRetriever #'Tools::InternationalLanguageTranslationEditor' searchToolBarIcon)
-          )
-         )
-        nil
-        nil
+	(
+	 (MenuItem
+	    label: 'Save'
+	    itemValue: menuSave
+	    isButton: true
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary saveImageIcon)
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    label: 'Add Translation'
+	    itemValue: addTranslation
+	    isButton: true
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary newRowIcon)
+	  )
+	 (MenuItem
+	    label: 'Remove Translation'
+	    itemValue: removeTranslation
+	    isButton: true
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary removeRowIcon)
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    activeHelpKey: browseReferringMethods
+	    label: 'Browse'
+	    itemValue: browseReferringMethods
+	    labelImage: (ResourceRetriever ToolbarIconLibrary systemBrowserIcon)
+	  )
+	 (MenuItem
+	    label: ''
+	  )
+	 (MenuItem
+	    label: 'Stop Application'
+	    itemValue: stopApplication
+	    isButton: true
+	    isVisible: stopApplicationIconVisibleHolder
+	    labelImage: (ResourceRetriever XPToolbarIconLibrary stop16x16Icon)
+	  )
+	 (MenuItem
+	    activeHelpKey: searchBox
+	    label: 'Search'
+	    isButton: true
+	    startGroup: right
+	    hideMenuOnActivated: false
+	    indication: searchBoxVisible
+	    shortcutKey: Ctrlf
+	    labelImage: (ResourceRetriever #'Tools::InternationalLanguageTranslationEditor' searchToolBarIcon)
+	  )
+	 )
+	nil
+	nil
       )
 !
 
@@ -939,54 +916,54 @@
 
     <resource: #menu>
 
-    ^ 
+    ^
      #(Menu
-        (
-         (MenuItem
-            label: 'Add Translation...'
-            itemValue: addTranslation
-          )
-         (MenuItem
-            label: 'Remove Translation...'
-            itemValue: removeTranslation
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Extract from Package...'
-            itemValue: extractTranslationsFromProject
-          )
-         (MenuItem
-            label: 'Extract from Class...'
-            itemValue: extractTranslationsFromClass
-          )
-         (MenuItem
-            label: 'Extract from NameSpace...'
-            itemValue: extractTranslationsFromNameSpace
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Run Application and Collect Translations...'
-            itemValue: runApplicationAndCollectTranslations
-          )
-         (MenuItem
-            label: '-'
-          )
-         (MenuItem
-            label: 'Generate Missing Translations'
-            itemValue: generateMissingTranslations
-          )
-         (MenuItem
-            label: 'Generate Missing Translations Slice'
-            submenuChannel: menuSliceTranslateGenerate
-            isMenuSlice: true
-          )
-         )
-        nil
-        nil
+	(
+	 (MenuItem
+	    label: 'Add Translation...'
+	    itemValue: addTranslation
+	  )
+	 (MenuItem
+	    label: 'Remove Translation...'
+	    itemValue: removeTranslation
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    label: 'Extract from Package...'
+	    itemValue: extractTranslationsFromProject
+	  )
+	 (MenuItem
+	    label: 'Extract from Class...'
+	    itemValue: extractTranslationsFromClass
+	  )
+	 (MenuItem
+	    label: 'Extract from NameSpace...'
+	    itemValue: extractTranslationsFromNameSpace
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    label: 'Run Application and Collect Translations...'
+	    itemValue: runApplicationAndCollectTranslations
+	  )
+	 (MenuItem
+	    label: '-'
+	  )
+	 (MenuItem
+	    label: 'Generate Missing Translations'
+	    itemValue: generateMissingTranslations
+	  )
+	 (MenuItem
+	    label: 'Generate Missing Translations Slice'
+	    submenuChannel: menuSliceTranslateGenerate
+	    isMenuSlice: true
+	  )
+	 )
+	nil
+	nil
       )
 ! !
 
@@ -998,18 +975,18 @@
     fn := aFilename asFilename.
 
     ^ self new
-        allButOpen;
-        readResourceFile:fn asLanguage:fn withoutSuffix baseName;
-        openWindow;
-        yourself.
+	allButOpen;
+	readResourceFile:fn asLanguage:fn withoutSuffix baseName;
+	openWindow;
+	yourself.
 !
 
 openOnPackage:aPackageId
     ^ self new
-        allButOpen;
-        readResourceFileForPackage:aPackageId;
-        openWindow;
-        yourself.
+	allButOpen;
+	readResourceFileForPackage:aPackageId;
+	openWindow;
+	yourself.
 ! !
 
 !InternationalLanguageTranslationEditor class methodsFor:'tableColumns specs'!
@@ -1089,8 +1066,8 @@
 newLanguageText
 "/   languageEditor accept
     ^self languageTextHolder value isEmptyOrNil
-        ifTrue:['']
-        ifFalse:[self languageTextHolder value asCollectionOfLines first.]
+	ifTrue:['']
+	ifFalse:[self languageTextHolder value asCollectionOfLines first.]
 !
 
 objectsList
@@ -1316,14 +1293,14 @@
 searchBoxVisible
 
     searchBoxVisible isNil ifTrue:[
-        searchBoxVisible := false asValue.
-        searchBoxVisible 
-            onChangeEvaluate:[ 
-                self updateToolVisibility.
-                searchBoxVisible value ifTrue:[
-                    searchTextView takeFocus.
-                ].
-            ].
+	searchBoxVisible := false asValue.
+	searchBoxVisible
+	    onChangeEvaluate:[
+		self updateToolVisibility.
+		searchBoxVisible value ifTrue:[
+		    searchTextView takeFocus.
+		].
+	    ].
     ].
     ^ searchBoxVisible.
 
@@ -1462,21 +1439,21 @@
 
     |answer|
 
-        self originalTextModifiedHolder value ifTrue:[
-            answer := OptionBox
-                          request:'Accept changed original text (key) ?'
-                          label:'Original text (key) changed'
-                          image:(WarningBox iconBitmap)
-                          buttonLabels:#('Cancel' 'Accept' 'Accept As New')
-                          values:#(nil #accept #acceptAsNew)
-                          default:#acceptAsNew.
-
-            answer isNil ifTrue:[^ self originalTextModifiedHolder value:false. ].
-            answer == #accept ifTrue:[
+	self originalTextModifiedHolder value ifTrue:[
+	    answer := OptionBox
+			  request:'Accept changed original text (key) ?'
+			  label:'Original text (key) changed'
+			  image:(WarningBox iconBitmap)
+			  buttonLabels:#('Cancel' 'Accept' 'Accept As New')
+			  values:#(nil #accept #acceptAsNew)
+			  default:#acceptAsNew.
+
+	    answer isNil ifTrue:[^ self originalTextModifiedHolder value:false. ].
+	    answer == #accept ifTrue:[
     self shouldImplement.        ].
-            answer == #acceptAsNew ifTrue:[
+	    answer == #acceptAsNew ifTrue:[
     self shouldImplement.        ].
-        ].
+	].
 !
 
 updatePasteOriginalButtonEnabled
@@ -1562,18 +1539,18 @@
 
     allProjects := Smalltalk allPackageIDs.
     projectsWithResources := allProjects
-                                select:[:pID |
-                                    |dir|
-                                    dir := Smalltalk projectDirectoryForPackage:pID.
-                                    dir notNil and:[
-                                    (dir asFilename construct:'resources') exists]
-                                ].
+				select:[:pID |
+				    |dir|
+				    dir := Smalltalk projectDirectoryForPackage:pID.
+				    dir notNil and:[
+				    (dir asFilename construct:'resources') exists]
+				].
 
     package := Dialog
-        requestProject:(resources string:'Name of Package:')
-        from:projectsWithResources
-        initialAnswer:LastProject
-        suggestions:nil.
+	requestProject:(resources string:'Name of Package:')
+	from:projectsWithResources
+	initialAnswer:LastProject
+	suggestions:nil.
 
     package isEmptyOrNil ifTrue:[^ nil ].
     LastProject := package.
@@ -1694,9 +1671,9 @@
 
     methods := methodsUsingKey at:selectedKey ifAbsent:nil.
     methods isEmptyOrNil ifTrue:[
-        Dialog information:(resources stringWithCRs:'oops - no method remembered.\Please rerun the extract from XXX menu operation').
-        ^ self.
-    ].    
+	Dialog information:(resources stringWithCRs:'oops - no method remembered.\Please rerun the extract from XXX menu operation').
+	^ self.
+    ].
     browser := UserPreferences systemBrowserClass browseMethods:methods.
     browser autoSearch:selectedKey ignoreCase:true.
 !
@@ -1763,13 +1740,13 @@
 
     initialAnswer := lastExtractedProject ? LastExtractedProject.
     suggestions := initialAnswer isNil ifTrue:[
-        OrderedCollection new
+	OrderedCollection new
     ] ifFalse:[
-        OrderedCollection with:initialAnswer
+	OrderedCollection with:initialAnswer
     ].
     projectID := Dialog requestProject:(resources string:'Package to extract translations from:') initialAnswer:initialAnswer suggestions:suggestions.
     projectID notNil ifTrue:[
-        projectID := projectID withoutSeparators asSymbol.
+	projectID := projectID withoutSeparators asSymbol.
     ].
     projectID isEmptyOrNil ifTrue:[^ self ].
 
@@ -1777,44 +1754,44 @@
 
     newTranslations := Set new.
     self withWaitCursorDo:[
-        Smalltalk allClassesDo:[:eachClass |
-            eachClass theNonMetaclass instAndClassMethodsDo:[:eachMethod |
-                eachMethod package == projectID ifTrue:[
-                    newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ).
-                ]
-            ].
-        ].
-
-        self addAllTranslations:newTranslations.
+	Smalltalk allClassesDo:[:eachClass |
+	    eachClass theNonMetaclass instAndClassMethodsDo:[:eachMethod |
+		eachMethod package == projectID ifTrue:[
+		    newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ).
+		]
+	    ].
+	].
+
+	self addAllTranslations:newTranslations.
     ].
 
     "Modified: / 19-02-2015 / 11:44:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 16-08-2017 / 12:29:21 / mawalch"
 !
 
-generateMissingTranslations: keys for: languages using: translator    
+generateMissingTranslations: keys for: languages using: translator
     keys do:[:string |
-        languages do:[:lang | 
-            | translation |
-
-            translation := keyStringsToLanguageMappings at:string language:lang.
-            translation isNil ifTrue:[ 
-                translation := translator value: lang value: string.
-                translation notNil ifTrue:[ 
-                    keyStringsToLanguageMappings at: string language: lang put: translation.  
-                ].
-            ].
-        ].
+	languages do:[:lang |
+	    | translation |
+
+	    translation := keyStringsToLanguageMappings at:string language:lang.
+	    translation isNil ifTrue:[
+		translation := translator value: lang value: string.
+		translation notNil ifTrue:[
+		    keyStringsToLanguageMappings at: string language: lang put: translation.
+		].
+	    ].
+	].
     ].
 
     "Created: / 19-02-2015 / 12:31:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 generateMissingTranslationsFor: languages
-    self 
-        generateMissingTranslations: keyStringsToLanguageMappings keys
-                                for: languages
-                              using: [ :lang :string | '**%1** %2' bindWith: lang asUppercase with: string ]
+    self
+	generateMissingTranslations: keyStringsToLanguageMappings keys
+				for: languages
+			      using: [ :lang :string | '**%1** %2' bindWith: lang asUppercase with: string ]
 
     "Created: / 19-02-2015 / 12:39:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -1997,8 +1974,8 @@
     languagesToRemove := Dialog chooseMultiple:'Which language(s) do you want to remove?' fromList:languagesList lines:10.
     languagesToRemove isEmptyOrNil ifTrue:[^ self ].
     (Dialog confirm: 'Are you sure to remove the languages: ', languagesToRemove printString) ifTrue:[
-          self languagesList removeAll:languagesToRemove.
-          self shownLanguages removeAll:languagesToRemove.
+	  self languagesList removeAll:languagesToRemove.
+	  self shownLanguages removeAll:languagesToRemove.
     ].
 !
 
@@ -2020,36 +1997,36 @@
     |applicationClass newTranslations pseudoPack app startSelector|
 
     monitoredApplication notNil ifTrue:[
-        monitoredApplication terminate.
-        [monitoredApplication notNil] whileTrue:[
-            Delay waitForSeconds:0.1
-        ].
+	monitoredApplication terminate.
+	[monitoredApplication notNil] whileTrue:[
+	    Delay waitForSeconds:0.1
+	].
     ].
 
     applicationClass := Dialog
-                requestClass:'Application class to start and collect translations from:'
-                okLabel:'OK'
-                initialAnswer:(lastExtractedApplicationClass ? LastExtractedApplicationClass ).
+		requestClass:'Application class to start and collect translations from:'
+		okLabel:'OK'
+		initialAnswer:(lastExtractedApplicationClass ? LastExtractedApplicationClass ).
     applicationClass isNil ifTrue:[^ self ].
     applicationClass isNameSpace ifTrue:[
-        Dialog warn:'Entered class is a NameSpace'.
-        ^ self.
+	Dialog warn:'Entered class is a NameSpace'.
+	^ self.
     ].
 
     applicationClass isVisualStartable ifTrue:[
-        startSelector := #open
+	startSelector := #open
     ] ifFalse:[
-        startSelector := Dialog
-                    request:'Entered class seems to be no application class. Ok to start using selector:'
-                    initialAnswer:((applicationClass respondsTo:#'start')
-                                        ifTrue:#'start'
-                                        ifFalse:#'new')
-                    okLabel:'START'
-                    title:'Start Application'.
-        startSelector isNil ifTrue:[
-            ^ self
-        ].
-        startSelector := startSelector asSymbol.
+	startSelector := Dialog
+		    request:'Entered class seems to be no application class. Ok to start using selector:'
+		    initialAnswer:((applicationClass respondsTo:#'start')
+					ifTrue:#'start'
+					ifFalse:#'new')
+		    okLabel:'START'
+		    title:'Start Application'.
+	startSelector isNil ifTrue:[
+	    ^ self
+	].
+	startSelector := startSelector asSymbol.
     ].
 
     lastExtractedApplicationClass := LastExtractedApplicationClass := applicationClass.
@@ -2062,21 +2039,21 @@
 
     self stopApplicationIconVisibleHolder value:true.
 
-    monitoredApplication := 
-        [
-            [
-                app := applicationClass new.
-                app resources:pseudoPack.
-                
-                app perform:startSelector.
-                app window waitUntilVisible.
-                app window waitUntilClosed.
-            ] ensure:[
-                app closeRequest.
-                self stopApplicationIconVisibleHolder value:false.
-                monitoredApplication := nil.
-            ].
-        ] fork.
+    monitoredApplication :=
+	[
+	    [
+		app := applicationClass new.
+		app resources:pseudoPack.
+
+		app perform:startSelector.
+		app window waitUntilVisible.
+		app window waitUntilClosed.
+	    ] ensure:[
+		app closeRequest.
+		self stopApplicationIconVisibleHolder value:false.
+		monitoredApplication := nil.
+	    ].
+	] fork.
 !
 
 searchStringInLastNameSpace
@@ -2114,35 +2091,35 @@
 
     browser := NewSystemBrowser new "open".
     browser allButOpen.
-    
+
     lastSearchPatterns := browser lastSearchPatterns.
     (lastSearchPatterns notNil and:[lastSearchPatterns first ~= selectedKey]) ifTrue:[
-        browser lastSearchPatterns addFirst: selectedKey
+	browser lastSearchPatterns addFirst: selectedKey
     ].
     SearchDialog lastStringSearchArea: #currentPackage.
     lastPackage isNil ifTrue:[
-        self changeLastPackage.
+	self changeLastPackage.
     ].
     lastPackage notNil ifTrue:[
 "/        browser navigationState selectedClasses value: lastNameSpace allClasses.
-        browser navigationState packageFilter value: (OrderedCollection with:lastPackage).
-        browser navigationState selectedProjects value: (OrderedCollection with:lastPackage).
+	browser navigationState packageFilter value: (OrderedCollection with:lastPackage).
+	browser navigationState selectedProjects value: (OrderedCollection with:lastPackage).
     ].
     self withWaitCursorDo:[
-        browser 
-            askForMethodAndSpawnSearchTitle:'String to Search for in Sources:'
-            browserLabel:'Methods containing "%1"'
-            searchWith:#( #'findString:in:ignoreCase:match:' #'findString:inMethods:ignoreCase:match:' )
-            searchWhat:#string
-            searchArea:#currentPackage
-            withCaseIgnore:false
-            withTextEntry:false
-            withMatch:true
-            withMethodList:false
-            setSearchPattern:[:brwsr :string :ignoreCase :doMatch|
-                                brwsr autoSearchPattern:string ignoreCase:ignoreCase.
-                             ]
-            initialText:selectedKey "/ does not work: ('''*',selectedKey,'*''') check match!!               
+	browser
+	    askForMethodAndSpawnSearchTitle:'String to Search for in Sources:'
+	    browserLabel:'Methods containing "%1"'
+	    searchWith:#( #'findString:in:ignoreCase:match:' #'findString:inMethods:ignoreCase:match:' )
+	    searchWhat:#string
+	    searchArea:#currentPackage
+	    withCaseIgnore:false
+	    withTextEntry:false
+	    withMatch:true
+	    withMethodList:false
+	    setSearchPattern:[:brwsr :string :ignoreCase :doMatch|
+				brwsr autoSearchPattern:string ignoreCase:ignoreCase.
+			     ]
+	    initialText:selectedKey "/ does not work: ('''*',selectedKey,'*''') check match!!
     ].
 ! !
 
@@ -2172,13 +2149,13 @@
     | menu |
 
     menu := Menu new.
-    keyStringsToLanguageMappings notNil ifTrue:[ 
-        keyStringsToLanguageMappings languages do:[:lang | 
-            menu addItem:   
-                (MenuItem
-                    label: (resources string: 'Generate Missing Translations - %1' with: lang asUppercase)
-                    itemValue: [ self generateMissingTranslationsFor: (Array with: lang) ])
-        ].
+    keyStringsToLanguageMappings notNil ifTrue:[
+	keyStringsToLanguageMappings languages do:[:lang |
+	    menu addItem:
+		(MenuItem
+		    label: (resources string: 'Generate Missing Translations - %1' with: lang asUppercase)
+		    itemValue: [ self generateMissingTranslationsFor: (Array with: lang) ])
+	].
     ].
     ^ menu
 
@@ -2217,49 +2194,49 @@
 
 addAllTranslations:newTranslations
     "merge found xlations into the list of already present xlations"
-    
+
     |newTranslationKeys stringKeys nonStringKeys|
 
     newTranslationKeys := newTranslations select:[:k | k notEmptyOrNil and:[k isString not or:[k isBlank not]]].
     newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not].
     "/ follow the common-xlations algrithm of ResourcePack
     "/ (which knows how to xlate strings with additional special chars.)
-    newTranslationKeys := 
-        newTranslationKeys collect:[:oldKey |
-            |newKey methods|
-            
-            (oldKey endsWith:' ...') ifTrue:[
-                newKey := oldKey copyButLast:4.
-            ] ifFalse:[ (oldKey endsWith:'...') ifTrue:[
-                newKey := oldKey copyButLast:3.
-            ] ifFalse:[ ('\.:?=,!! ' includes:oldKey last) ifTrue:[
-                newKey := oldKey copyButLast:1.
-            ] ifFalse:[ ((oldKey first == $() and:[ oldKey last == $) ]) ifTrue:[
-                newKey := oldKey copyFrom:2 to:oldKey size - 1
-            ] ifFalse:[ ((oldKey first == $[) and:[ oldKey last == $] ]) ifTrue:[
-                newKey := oldKey copyFrom:2 to:oldKey size - 1
-            ] ifFalse:[
-                newKey :=oldKey
-            ]]]]].
-            "/ must attach oldKey-methods to newKey
-            methods := methodsUsingKey at:oldKey ifAbsent:nil.
-            methods notNil ifTrue:[
-                (methodsUsingKey at:newKey ifAbsentPut:[Set new]) addAll:methods
-            ].    
-            newKey
-        ].
-        
+    newTranslationKeys :=
+	newTranslationKeys collect:[:oldKey |
+	    |newKey methods|
+
+	    (oldKey endsWith:' ...') ifTrue:[
+		newKey := oldKey copyButLast:4.
+	    ] ifFalse:[ (oldKey endsWith:'...') ifTrue:[
+		newKey := oldKey copyButLast:3.
+	    ] ifFalse:[ ('\.:?=,!! ' includes:oldKey last) ifTrue:[
+		newKey := oldKey copyButLast:1.
+	    ] ifFalse:[ ((oldKey first == $() and:[ oldKey last == $) ]) ifTrue:[
+		newKey := oldKey copyFrom:2 to:oldKey size - 1
+	    ] ifFalse:[ ((oldKey first == $[) and:[ oldKey last == $] ]) ifTrue:[
+		newKey := oldKey copyFrom:2 to:oldKey size - 1
+	    ] ifFalse:[
+		newKey :=oldKey
+	    ]]]]].
+	    "/ must attach oldKey-methods to newKey
+	    methods := methodsUsingKey at:oldKey ifAbsent:nil.
+	    methods notNil ifTrue:[
+		(methodsUsingKey at:newKey ifAbsentPut:[Set new]) addAll:methods
+	    ].
+	    newKey
+	].
+
     newTranslationKeys := newTranslationKeys asSet.
     newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not].
 
     newTranslationKeys notEmpty ifTrue:[
-        stringKeys := newTranslationKeys select:[:k | k isString].
-        nonStringKeys := newTranslationKeys select:[:k | k isString not].
-
-        stringKeys := stringKeys asSortedCollection.
-        keyStringsToLanguageMappings addKeys:stringKeys.
-        keyStringsToLanguageMappings addKeys:nonStringKeys.
-        modified := true.
+	stringKeys := newTranslationKeys select:[:k | k isString].
+	nonStringKeys := newTranslationKeys select:[:k | k isString not].
+
+	stringKeys := stringKeys asSortedCollection.
+	keyStringsToLanguageMappings addKeys:stringKeys.
+	keyStringsToLanguageMappings addKeys:nonStringKeys.
+	modified := true.
     ].
 !
 
@@ -2269,18 +2246,18 @@
     newTranslations := Set new.
 
     self withWaitCursorDo:[
-        "/ now, the hard part:
-        "/ possible translations are in the specs,
-        "/ and all arguments to (resources string:) messages.
-        aClass instAndClassMethodsDo:[:eachMethod |
-            newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ).
-        ].
+	"/ now, the hard part:
+	"/ possible translations are in the specs,
+	"/ and all arguments to (resources string:) messages.
+	aClass instAndClassMethodsDo:[:eachMethod |
+	    newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ).
+	].
     ].
-    
-    newTranslations := 
-        newTranslations select:[:eachTranslation|
-            (aClass resources at:eachTranslation ifAbsent:nil) isNil
-        ].
+
+    newTranslations :=
+	newTranslations select:[:eachTranslation|
+	    (aClass resources at:eachTranslation ifAbsent:nil) isNil
+	].
     ^ newTranslations
 !
 
@@ -2290,58 +2267,58 @@
     |codeStrings matcher parseTree resourceKeys|
 
     parseTree := RBParser
-            parseMethod:aMethod source
-            onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
-                                  nil].
+	    parseMethod:aMethod source
+	    onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
+				  nil].
     parseTree isNil ifTrue:[^ #() ].
 
     codeStrings  :=
-        #(
-                '`@dict addPairsFrom: `#helpKeysAndStrings'
-                '^ `#lit'
-        ).
+	#(
+		'`@dict addPairsFrom: `#helpKeysAndStrings'
+		'^ `#lit'
+	).
 
     resourceKeys := Set new.
 
     matcher := ParseTreeSearcher new.
     matcher
-        matchesAnyOf: codeStrings
-        do: [:aNode :answer |
-                |sel argNode arg|
-
-                aNode isReturn ifTrue:[
-                    "/ a ^ #(...)
-                    aNode value isLiteralArray ifTrue:[
-                        aNode value value pairWiseDo:[:helpKey :helpString |
-                            self rememberMethod:aMethod usingKey:helpString.
-                            resourceKeys add:helpString.
-                        ].
-                    ].    
-                ] ifFalse:[    
-                    sel := aNode selector.
-                    (sel startsWith:'addPairsFrom:') ifTrue:[
-                        argNode := aNode arguments at:1.
-                        argNode isLiteralArray ifTrue:[
-                            arg := argNode value.
-                            arg doWithIndex:[:el :index |
-                                index even ifTrue:[
-                                    el isString ifTrue:[
-                                        self rememberMethod:aMethod usingKey:el.
-                                        resourceKeys add:el.
-                                    ]
-                                ].
-                            ].
-                        ] ifFalse:[
-                            Transcript halt
-                                showCR:(resources
-                                            string:'Cannot derive resourceKey from non-literal array: %1 in %2'
-                                            with:argNode formattedCode
-                                            with:aMethod selector).
-                        ].
-                    ].
-                ].
-                aNode
-            ].
+	matchesAnyOf: codeStrings
+	do: [:aNode :answer |
+		|sel argNode arg|
+
+		aNode isReturn ifTrue:[
+		    "/ a ^ #(...)
+		    aNode value isLiteralArray ifTrue:[
+			aNode value value pairWiseDo:[:helpKey :helpString |
+			    self rememberMethod:aMethod usingKey:helpString.
+			    resourceKeys add:helpString.
+			].
+		    ].
+		] ifFalse:[
+		    sel := aNode selector.
+		    (sel startsWith:'addPairsFrom:') ifTrue:[
+			argNode := aNode arguments at:1.
+			argNode isLiteralArray ifTrue:[
+			    arg := argNode value.
+			    arg doWithIndex:[:el :index |
+				index even ifTrue:[
+				    el isString ifTrue:[
+					self rememberMethod:aMethod usingKey:el.
+					resourceKeys add:el.
+				    ]
+				].
+			    ].
+			] ifFalse:[
+			    Transcript halt
+				showCR:(resources
+					    string:'Cannot derive resourceKey from non-literal array: %1 in %2'
+					    with:argNode formattedCode
+					    with:aMethod selector).
+			].
+		    ].
+		].
+		aNode
+	    ].
 
     matcher executeTree: parseTree initialAnswer: nil.
     ^ resourceKeys
@@ -2356,42 +2333,42 @@
     menu isNil ifTrue:[ ^ #() ].
 
     (menu isKindOf:Menu) ifFalse:[
-        menu := Menu new fromLiteralArrayEncoding:menu
+	menu := Menu new fromLiteralArrayEncoding:menu
     ].
 
     resourceKeys := Set new.
     menu allItemsDo:[:aMenuItem |
-        aMenuItem translateLabel ifTrue:[
-            (aMenuItem isSeparatorItem or:[aMenuItem isMenuSlice])  ifFalse:[
-                self rememberMethod:aMethod usingKey:aMenuItem label.
-                resourceKeys add:aMenuItem label.
-            ]
-        ]
+	aMenuItem translateLabel ifTrue:[
+	    (aMenuItem isSeparatorItem or:[aMenuItem isMenuSlice])  ifFalse:[
+		self rememberMethod:aMethod usingKey:aMenuItem label.
+		resourceKeys add:aMenuItem label.
+	    ]
+	]
     ].
     ^ resourceKeys
 !
 
 extractTranslationsFromMethod:aMethod
     "return strings which need translation from a method."
-    
+
     |mResources|
 
     mResources := aMethod resources.
     mResources notNil ifTrue:[
-        (mResources includesKey:#menu) ifTrue:[
-             ^ self extractTranslationsFromMenuSpecMethod:aMethod.
-        ].
-        (mResources includesKey:#canvas) ifTrue:[
-             ^ self extractTranslationsFromUISpecMethod:aMethod.
-        ].
-        (mResources includesKey:#help) ifTrue:[
-             ^ self extractTranslationsFromHelpSpecMethod:aMethod.
-        ].
-        (mResources includesKey:#tableColumns) ifTrue:[
-             ^ self extractTranslationsFromTableColumnsSpecMethod:aMethod.
-        ].
-
-        ^ self extractTranslationsFromSpecMethod:aMethod.
+	(mResources includesKey:#menu) ifTrue:[
+	     ^ self extractTranslationsFromMenuSpecMethod:aMethod.
+	].
+	(mResources includesKey:#canvas) ifTrue:[
+	     ^ self extractTranslationsFromUISpecMethod:aMethod.
+	].
+	(mResources includesKey:#help) ifTrue:[
+	     ^ self extractTranslationsFromHelpSpecMethod:aMethod.
+	].
+	(mResources includesKey:#tableColumns) ifTrue:[
+	     ^ self extractTranslationsFromTableColumnsSpecMethod:aMethod.
+	].
+
+	^ self extractTranslationsFromSpecMethod:aMethod.
     ].
     ^ self extractTranslationsFromMethodsCode:aMethod
 !
@@ -2403,45 +2380,45 @@
     |codeStrings matcher parseTree resourceKeys|
 
     parseTree := RBParser
-            parseMethod:aMethod source
-            onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
-                                  nil].
+	    parseMethod:aMethod source
+	    onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
+				  nil].
     parseTree isNil ifTrue:[^ #() ].
 
     codeStrings  :=
-        #(
-                'resources `@msg: `@args'
-                'self resources `@msg: `@args'
-                'self class resources `@msg: `@args'
-                'self class classResources `@msg: `@args'
-                'self classResources `@msg: `@args'
-                '`V classResources `@msg: `@args'
-        ).
+	#(
+		'resources `@msg: `@args'
+		'self resources `@msg: `@args'
+		'self class resources `@msg: `@args'
+		'self class classResources `@msg: `@args'
+		'self classResources `@msg: `@args'
+		'`V classResources `@msg: `@args'
+	).
 
     resourceKeys := Set new.
 
     matcher := ParseTreeSearcher new.
     matcher
-        matchesAnyOf: codeStrings
-        do: [:aNode :answer |
-                |sel keyStringArgNode keyStringArg|
-
-                sel := aNode selector.
-                ((sel startsWith:'string:') or:[(sel startsWith:'at:') or:[sel startsWith:'stringWithCRs:']]) ifTrue:[
-                    keyStringArgNode := aNode arguments at:1.
-                    (keyStringArg := self literalStringOrStringConcatenation:keyStringArgNode) notNil ifTrue:[
-                        self rememberMethod:aMethod usingKey:keyStringArg.
-                        resourceKeys add:keyStringArg.
-                    ] ifFalse:[
-                        Transcript
-                            showCR:(resources
-                                    string:'[LanguageTranslator] warning: Cannot derive resourceKey from non-string: %1 in %2'
-                                    with:keyStringArgNode formattedCode
-                                    with:aMethod whoString).
-                    ].
-                ].
-                aNode
-            ].
+	matchesAnyOf: codeStrings
+	do: [:aNode :answer |
+		|sel keyStringArgNode keyStringArg|
+
+		sel := aNode selector.
+		((sel startsWith:'string:') or:[(sel startsWith:'at:') or:[sel startsWith:'stringWithCRs:']]) ifTrue:[
+		    keyStringArgNode := aNode arguments at:1.
+		    (keyStringArg := self literalStringOrStringConcatenation:keyStringArgNode) notNil ifTrue:[
+			self rememberMethod:aMethod usingKey:keyStringArg.
+			resourceKeys add:keyStringArg.
+		    ] ifFalse:[
+			Transcript
+			    showCR:(resources
+				    string:'[LanguageTranslator] warning: Cannot derive resourceKey from non-string: %1 in %2'
+				    with:keyStringArgNode formattedCode
+				    with:aMethod whoString).
+		    ].
+		].
+		aNode
+	    ].
 
     matcher executeTree: parseTree initialAnswer: nil.
     ^ resourceKeys
@@ -2462,29 +2439,29 @@
     columnDescription isNil ifTrue:[ ^ #() ].
 
     (columnDescription first isKindOf:DataSetColumnSpec) ifFalse:[
-        columnDescription := columnDescription collect:[:el | DataSetColumnSpec new fromLiteralArrayEncoding:el].
+	columnDescription := columnDescription collect:[:el | DataSetColumnSpec new fromLiteralArrayEncoding:el].
     ].
 
     resourceKeys := Set new.
     columnDescription do:[:aColumnSpec |
-        aColumnSpec translateLabel ifTrue:[
-            self rememberMethod:aMethod usingKey:aColumnSpec label.
-            resourceKeys add:aColumnSpec label.
-        ]
+	aColumnSpec translateLabel ifTrue:[
+	    self rememberMethod:aMethod usingKey:aColumnSpec label.
+	    resourceKeys add:aColumnSpec label.
+	]
     ].
     ^ resourceKeys
 !
 
 extractTranslationsFromUISpecMethod:aMethod
     "return strings which need translation from a UI-spec method"
-    
+
     |spec resourceKeys visitor|
 
     spec := aMethod mclass theNonMetaclass perform:aMethod selector.
     spec isNil ifTrue:[ ^ #() ].
 
     (spec isKindOf:UISpecification) ifFalse:[
-        spec := UISpecification from:spec
+	spec := UISpecification from:spec
     ].
 
     resourceKeys := Set new.
@@ -2492,38 +2469,38 @@
     visitor := UISpecVisitor new.
     spec acceptVisitor:visitor.
     visitor translatedLabels do:[:each |
-        self rememberMethod:aMethod usingKey:each.
+	self rememberMethod:aMethod usingKey:each.
     ].
     ^ visitor translatedLabels
 !
 
 literalStringOrStringConcatenation:aParseNode
     "nil if not a literal or a string concatenation"
-    
+
     aParseNode isLiteralString ifTrue:[^ aParseNode value].
     (aParseNode isMessage and:[aParseNode selector == #,]) ifTrue:[
-        |leftString rightString|
-        
-        aParseNode receiver isLiteralString ifTrue:[
-            leftString := aParseNode receiver value
-        ] ifFalse:[
-            leftString := self literalStringOrStringConcatenation:aParseNode receiver.
-        ].
-        aParseNode arguments first isLiteralString ifTrue:[
-            rightString := aParseNode arguments first value
-        ] ifFalse:[
-            rightString := self literalStringOrStringConcatenation:aParseNode arguments first.
-        ].
-        (leftString notNil and:[rightString notNil]) ifTrue:[
-            ^ leftString , rightString
-        ].
+	|leftString rightString|
+
+	aParseNode receiver isLiteralString ifTrue:[
+	    leftString := aParseNode receiver value
+	] ifFalse:[
+	    leftString := self literalStringOrStringConcatenation:aParseNode receiver.
+	].
+	aParseNode arguments first isLiteralString ifTrue:[
+	    rightString := aParseNode arguments first value
+	] ifFalse:[
+	    rightString := self literalStringOrStringConcatenation:aParseNode arguments first.
+	].
+	(leftString notNil and:[rightString notNil]) ifTrue:[
+	    ^ leftString , rightString
+	].
     ].
     ^ nil
 !
 
 recordNewTranslation:aString
     "called from recorder, when the monitored application does a translation"
-    
+
     self addAllTranslations:{ aString }
 !
 
@@ -2625,16 +2602,16 @@
 printEditingWarningOn: aStream
 
     aStream nextPutAll: ';';
-            cr;
-            nextPutAll: '; WARNING:';
-            cr;
-            nextPutAll: '; this file contains national characters.';
-            cr;
-            nextPutAll: '; DO NOT EDIT this file with an old vi!!';
-            cr;
-            nextPutAll: ';';
-            cr;
-            cr.
+	    cr;
+	    nextPutAll: '; WARNING:';
+	    cr;
+	    nextPutAll: '; this file contains national characters.';
+	    cr;
+	    nextPutAll: '; DO NOT EDIT this file with an old vi!!';
+	    cr;
+	    nextPutAll: ';';
+	    cr;
+	    cr.
 !
 
 printEncoderFor: lang on: aStream
@@ -2670,45 +2647,45 @@
     maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang.
 
     orderedAssociations do:[:association |
-        "use #basicStoreString to avoid implicit utf8Encoding for UnicodeStrings"
-        aStream nextPutAll: ((characterEncoder encodeString:association key basicStoreString) paddedTo: maxKeySize) ;
-            tab;
-            nextPutAll: (characterEncoder encodeString: association value basicStoreString);
-            cr.
-        ].
+	"use #basicStoreString to avoid implicit utf8Encoding for UnicodeStrings"
+	aStream nextPutAll: ((characterEncoder encodeString:association key basicStoreString) paddedTo: maxKeySize) ;
+	    tab;
+	    nextPutAll: (characterEncoder encodeString: association value basicStoreString);
+	    cr.
+	].
 !
 
 readResourceFile:aFilename asLanguage:lang
     |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys|
 
     aFilename exists ifFalse:[
-        Dialog information:(resources string:'Language file: "%1" does not exist' with:aFilename baseName).
-        ^ self
+	Dialog information:(resources string:'Language file: "%1" does not exist' with:aFilename baseName).
+	^ self
     ].
 
     resourcePack := ResourcePack new.
 
     inStream := aFilename readStream.
     [inStream atEnd] whileFalse:[
-        lineString := inStream nextLine.
-        (lineString notEmpty
-        and:[ (lineString startsWith:';') not and:[ (lineString startsWith:'"/') not]]) ifTrue:[
-            ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[
-                lineString := (lineString copyFrom:2) withoutSeparators.
-                (lineString startsWith:'encoding ') ifTrue:[
-                    encoding := ResourcePack extractEncodingFromLine:lineString.
-                    decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
-                ].
-            ] ifFalse:[
-                ResourcePack
-                    processResourceLine:lineString
-                    encoding:decoder
-                    file:aFilename pathName
-                    printErrorWith:[:msg | Transcript showCR:msg ]
-                    for:resourcePack
-                    keepUselessTranslations:true.
-            ].
-        ].
+	lineString := inStream nextLine.
+	(lineString notEmpty
+	and:[ (lineString startsWith:';') not and:[ (lineString startsWith:'"/') not]]) ifTrue:[
+	    ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[
+		lineString := (lineString copyFrom:2) withoutSeparators.
+		(lineString startsWith:'encoding ') ifTrue:[
+		    encoding := ResourcePack extractEncodingFromLine:lineString.
+		    decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
+		].
+	    ] ifFalse:[
+		ResourcePack
+		    processResourceLine:lineString
+		    encoding:decoder
+		    file:aFilename pathName
+		    printErrorWith:[:msg | Transcript showCR:msg ]
+		    for:resourcePack
+		    keepUselessTranslations:true.
+	    ].
+	].
     ].
     inStream close.
 
@@ -2719,10 +2696,10 @@
     keyStringsToLanguageMappings atLanguage: lang putEncoder: decoder.
 
     sortedKeys do:[:k |
-        keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
+	keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
     ].
     remainingKeys do:[:k |
-        keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
+	keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
     ].
     keyStringsToLanguageMappings changed.
 !
@@ -3067,7 +3044,7 @@
 
 search
     "make the searchbox visible"
-    
+
     self searchBoxVisible value: true.
     self updateToolVisibility.
     searchTextView takeFocus.
@@ -3121,11 +3098,11 @@
 
 forwardFor:aString
     collectedKeys isNil ifTrue:[
-        collectedKeys := Set new.
+	collectedKeys := Set new.
     ].
     collectedKeys add:aString.
     watchingTranslationEditor notNil ifTrue:[
-        watchingTranslationEditor recordNewTranslation:aString.
+	watchingTranslationEditor recordNewTranslation:aString.
     ].
     ^ realResourcePack perform:(thisContext sender selector) withArguments:(thisContext sender args).
 !
@@ -3240,8 +3217,8 @@
 
 orderedLanguageMappingsAssociationsFor: language
 "Returns a collection of languageMappings associations (alphabetically ordered by keys) "
-    ^(self atLanguage: language) associations 
-            asSortedCollection:[:a :b | a key isArray or:[b key isArray or:[a key < b key]]].
+    ^(self atLanguage: language) associations
+	    asSortedCollection:[:a :b | a key isArray or:[b key isArray or:[a key < b key]]].
 !
 
 perLanguageInfo
@@ -3374,15 +3351,15 @@
 
     similarAssociations:=
     (self mappingAtLanguage: language) associationsSelect:[:each |
-        |eachKey|
-
-        eachKey := eachKey.
-        eachKey isString 
-        and:[(eachKey sameAs: aKey)
-             or:[(aKey asUppercase startsWith: eachKey asUppercase)
-             or:[((eachKey asUppercase levenshteinTo: aKey asUppercase)/ eachKey size) < 0.3
-         ]]]
-         and:[each value notEmptyOrNil]
+	|eachKey|
+
+	eachKey := eachKey.
+	eachKey isString
+	and:[(eachKey sameAs: aKey)
+	     or:[(aKey asUppercase startsWith: eachKey asUppercase)
+	     or:[((eachKey asUppercase levenshteinTo: aKey asUppercase)/ eachKey size) < 0.3
+	 ]]]
+	 and:[each value notEmptyOrNil]
     ].
     ^similarAssociations
 ! !
@@ -3448,4 +3425,3 @@
 version_CVS
     ^ '$Header$'
 ! !
-