Support to automatically generate translations (for testing only)
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 19 Feb 2015 14:13:46 +0100
changeset 3189 4f828e688bf5
parent 3188 351c645c0921
child 3190 a52106100195
Support to automatically generate translations (for testing only)
Tools__InternationalLanguageTranslationEditor.st
--- a/Tools__InternationalLanguageTranslationEditor.st	Thu Feb 19 13:23:06 2015 +0100
+++ b/Tools__InternationalLanguageTranslationEditor.st	Thu Feb 19 14:13:46 2015 +0100
@@ -600,6 +600,7 @@
     "Do not manually edit this!! If it is corrupted,
      the MenuEditor may not be able to read the specification."
 
+
     "
      MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#mainMenu
      (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor mainMenu)) startUp
@@ -607,232 +608,165 @@
 
     <resource: #menu>
 
-    ^
+    ^ 
      #(Menu
-	(
-	 (MenuItem
-	    label: 'File'
-	    translateLabel: true
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'New'
-		  itemValue: menuNew
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Open Resources for Package or Project...'
-		  itemValue: menuOpenByPackage
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Open Resource File...'
-		  itemValue: menuOpen
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Save All Resource Files'
-		  itemValue: menuSaveAll
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Save Resource File'
-		  itemValue: menuSave
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Save Resource File As...'
-		  itemValue: menuSaveAs
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Import existing translations from file...'
-		  itemValue: importExistingTranslationsFromFile
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Set Current NameSpace'
-		  itemValue: changeLastNameSpace
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Set Current Package'
-		  itemValue: changeLastPackage
-		  translateLabel: true
-		  isVisible: #false
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Exit'
-		  itemValue: closeRequest
-		  translateLabel: true
-		)
-	       )
-	      nil
-	      nil
-	    )
-	  )
-	 (MenuItem
-	    label: 'View'
-	    translateLabel: true
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'Show Missing Translations Only'
-		  translateLabel: true
-		  indication: showMissingTranslationsOnly
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Shown Languages'
-		  translateLabel: true
-		  submenuChannel: shownLanguagesMenu
-		)
-	       )
-	      nil
-	      nil
-	    )
-	  )
-	 (MenuItem
-	    label: 'Languages'
-	    translateLabel: true
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'Add Language...'
-		  itemValue: addLanguage
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Remove Language...'
-		  itemValue: removeLanguage
-		  translateLabel: true
-		)
-	       )
-	      nil
-	      nil
-	    )
-	  )
-	 (MenuItem
-	    label: 'Translations'
-	    translateLabel: true
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'Add Translation...'
-		  itemValue: addTranslation
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Remove Translation...'
-		  itemValue: removeTranslation
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Extract from Class...'
-		  itemValue: extractTranslationsFromClass
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Extract from Project...'
-		  itemValue: extractTranslationsFromProject
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: 'Extract from NameSpace...'
-		  itemValue: extractTranslationsFromNameSpace
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'Run Application and Collect Translations...'
-		  itemValue: runApplicationAndCollectTranslations
-		  translateLabel: true
-		)
-	       )
-	      nil
-	      nil
-	    )
-	  )
-	 (MenuItem
-	    label: 'Preferences'
-	    translateLabel: true
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'Auto Accept Changes'
-		  translateLabel: true
-		  indication: autoAcceptHolder
-		)
-	       (MenuItem
-		  label: 'Search For Similar Translations'
-		  translateLabel: true
-		  indication: searchForSimilarTranslationEnableHolder
-		)
-	       (MenuItem
-		  label: 'Always Write UTF8'
-		  translateLabel: true
-		  indication: alwaysWriteUTF8Holder
-		)
-	       )
-	      nil
-	      nil
-	    )
-	  )
-	 (MenuItem
-	    label: 'Help'
-	    translateLabel: true
-	    startGroup: right
-	    submenu:
-	   (Menu
-	      (
-	       (MenuItem
-		  label: 'Documentation'
-		  itemValue: openDocumentation
-		  translateLabel: true
-		)
-	       (MenuItem
-		  label: '-'
-		)
-	       (MenuItem
-		  label: 'About this Application...'
-		  itemValue: openAboutThisApplication
-		  translateLabel: true
-		)
-	       )
-	      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: '-'
+                )
+               (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
       )
 !
 
@@ -934,6 +868,72 @@
         nil
         nil
       )
+!
+
+translationsMenuSpec
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+
+    "
+     MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#translationsMenuSpec
+     (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor translationsMenuSpec)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            label: 'Add Translation...'
+            itemValue: addTranslation
+          )
+         (MenuItem
+            label: 'Remove Translation...'
+            itemValue: removeTranslation
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'Extract from Class...'
+            itemValue: extractTranslationsFromClass
+          )
+         (MenuItem
+            label: 'Extract from Project...'
+            itemValue: extractTranslationsFromProject
+          )
+         (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
+      )
 ! !
 
 !InternationalLanguageTranslationEditor class methodsFor:'startup'!
@@ -1682,7 +1682,7 @@
 !
 
 extractTranslationsFromProject
-    |box projectID newTranslations|
+    |projectID newTranslations|
 
     projectID := Dialog requestProject:(resources string:'Package to extract translations from:') initialAnswer:(lastExtractedProject ? LastExtractedProject) suggestions:(lastExtractedProject ? LastExtractedProject).
     projectID notNil ifTrue:[
@@ -1695,15 +1695,49 @@
     newTranslations := Set new.
 
     Smalltalk allClassesDo:[:eachClass |
-        eachClass theNonMetaclass package == projectID ifTrue:[
-"/ eachClass isLoaded ifTrue:[ self halt. ].
-            newTranslations addAll:( self extractTranslationsFromClass:eachClass theNonMetaclass).
-        ]
+        eachClass theNonMetaclass instAndClassMethodsDo:[:eachMethod |
+            eachMethod package == projectID ifTrue:[ 
+                newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ).
+            ]
+        ].
     ].
 
     self addAllTranslations:newTranslations.
 
-    "Modified: / 16-02-2015 / 16:54:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-02-2015 / 11:44:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+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.  
+                ].
+            ].
+        ].
+    ].
+
+    "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 ]
+
+    "Created: / 19-02-2015 / 12:39:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+generateMissingTranslationsForAll
+    self generateMissingTranslationsFor: keyStringsToLanguageMappings languages
+
+    "Created: / 19-02-2015 / 12:40:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 importExistingTranslationsFromFile
@@ -2030,6 +2064,23 @@
     ^ self shownLanguages includes:lang
 !
 
+menuSliceTranslateGenerate
+    | 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) ])
+        ].
+    ].
+    ^ menu
+
+    "Created: / 19-02-2015 / 12:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 shownLanguagesMenu
     <resource: #programMenu >
 
@@ -2210,54 +2261,56 @@
     |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 classResources `@msg: `@args'
-	).
+        #(
+                'resources `@msg: `@args'
+                'self resources `@msg: `@args'
+                'self class resources `@msg: `@args'
+                'self 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:')]) ifTrue:[
-		    keyStringArgNode := aNode arguments at:1.
-		    keyStringArgNode isLiteral ifTrue:[
-			keyStringArg := keyStringArgNode value.
-			keyStringArg isString ifTrue:[
-			    resourceKeys add:keyStringArg.
-			] ifFalse:[
-			    Transcript
-				showCR:(resources
-					string:'Cannot derive resourceKey from non-string: %1 in %2'
-					with:keyStringArgNode formattedCode
-					with:aMethod selector).
-			].
-		    ] ifFalse:[
-			Transcript
-			    showCR:(resources
-					string:'Cannot derive resourceKey from non-literal: %1 in %2'
-					with:keyStringArgNode formattedCode
-					with:aMethod selector).
-		    ].
-		].
-		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.
+                    keyStringArgNode isLiteral ifTrue:[
+                        keyStringArg := keyStringArgNode value.
+                        keyStringArg isString ifTrue:[
+                            resourceKeys add:keyStringArg.
+                        ] ifFalse:[
+                            Transcript
+                                showCR:(resources
+                                        string:'Cannot derive resourceKey from non-string: %1 in %2'
+                                        with:keyStringArgNode formattedCode
+                                        with:aMethod selector).
+                        ].
+                    ] ifFalse:[
+                        Transcript
+                            showCR:(resources
+                                        string:'Cannot derive resourceKey from non-literal: %1 in %2'
+                                        with:keyStringArgNode formattedCode
+                                        with:aMethod selector).
+                    ].
+                ].
+                aNode
+            ].
 
     matcher executeTree: parseTree initialAnswer: nil.
     ^ resourceKeys
+
+    "Modified: / 19-02-2015 / 11:42:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 extractTranslationsFromSpecMethod:aMethod