--- 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