# HG changeset patch # User Jan Vrany # Date 1424351626 -3600 # Node ID 4f828e688bf59913a39494ccaee9cc1e663bc599 # Parent 351c645c0921dfacd0789d8fc3995f1c7b665505 Support to automatically generate translations (for testing only) diff -r 351c645c0921 -r 4f828e688bf5 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 @@ - ^ + ^ #(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 + " + + + + ^ + #(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 " + "Modified: / 19-02-2015 / 11:44:24 / Jan Vrany " +! + +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 " +! + +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 " +! + +generateMissingTranslationsForAll + self generateMissingTranslationsFor: keyStringsToLanguageMappings languages + + "Created: / 19-02-2015 / 12:40:01 / Jan Vrany " ! 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 " +! + shownLanguagesMenu @@ -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 " ! extractTranslationsFromSpecMethod:aMethod