cg@2015: "{ Package: 'stx:libtool2' }" cg@2015: cg@2015: "{ NameSpace: Tools }" cg@2015: cg@2015: ApplicationModel subclass:#InternationalLanguageTranslationEditor cg@2015: instanceVariableNames:'languagesList keyStringsToLanguageMappings languageTextHolder cg@2015: originalTextHolder modified shownLanguages selectedKeyRow cg@2015: showMissingTranslationsOnly cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: languageShownHolders dataSetView lastExtractedClass cg@2015: lastExtractedApplicationClass stopApplicationIconVisibleHolder cg@2015: monitoredApplication originalTextModifiedHolder cg@2032: languageTextModifiedHolder inSingleFileMode lastExtractedProject' cg@2032: classVariableNames:'LastExtractedClass LastExtractedApplicationClass cg@2032: LastExtractedProject' cg@2015: poolDictionaries:'' cg@2015: category:'Interface-UIPainter' cg@2015: ! cg@2015: cg@2015: Object subclass:#AccessCollectingPseudoResourcePack cg@2015: instanceVariableNames:'collectedKeys realResourcePack' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Collection subclass:#KeyStringsToLanguageMappings cg@2032: instanceVariableNames:'keys keyInfo perLanguageInfo perLanguageMappings languageMappings cg@2032: languages' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Object subclass:#LanguageMappingRow cg@2015: instanceVariableNames:'key mappings' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Visitor subclass:#UISpecVisitor cg@2015: instanceVariableNames:'translatedLabels' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'documentation'! cg@2015: cg@2015: documentation cg@2015: " cg@2015: documentation to be added. cg@2015: cg@2015: [author:] cg@2015: cg (cg@FUSI) cg@2015: cg@2015: [instance variables:] cg@2015: cg@2015: [class variables:] cg@2015: cg@2015: [see also:] cg@2015: cg@2015: " cg@2015: ! cg@2015: cg@2015: examples cg@2015: " cg@2015: Starting the application: cg@2015: [exBegin] cg@2015: InternationalLanguageTranslationEditor open cg@2015: cg@2015: [exEnd] cg@2015: cg@2015: more examples to be added: cg@2015: [exBegin] cg@2015: ... add code fragment for cg@2015: ... executable example here ... cg@2015: [exEnd] cg@2015: " cg@2015: ! cg@2015: cg@2015: history cg@2015: "Created: / 04-03-2006 / 09:07:19 / cg" cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'interface specs'! cg@2015: cg@2015: windowSpec cg@2015: "This resource specification was automatically generated cg@2015: by the UIPainter of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the UIPainter may not be able to read the specification." cg@2015: cg@2015: " cg@2015: UIPainter new openOnClass:InternationalLanguageTranslationEditor andSelector:#windowSpec cg@2015: InternationalLanguageTranslationEditor new openInterface:#windowSpec cg@2015: InternationalLanguageTranslationEditor open cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(FullSpec cg@2015: name: windowSpec cg@2015: window: cg@2015: (WindowSpec cg@2015: label: 'InternationalLanguageTranslationEditor' cg@2015: name: 'InternationalLanguageTranslationEditor' cg@2015: min: (Point 10 10) cg@2015: max: (Point 1024 768) cg@2015: bounds: (Rectangle 0 0 640 400) cg@2015: menu: mainMenu cg@2015: ) cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (MenuPanelSpec cg@2015: name: 'ToolBar' cg@2015: layout: (LayoutFrame 0 0 0 0 0 1 30 0) cg@2015: menu: menuToolBar cg@2015: textDefault: true cg@2015: ) cg@2015: (VariableVerticalPanelSpec cg@2015: name: 'VariableVerticalPanel1' cg@2015: layout: (LayoutFrame 0 0 30 0 0 1 0 1) cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (DataSetSpec cg@2015: name: 'KeyStringAndLanguageSelectionTable' cg@2015: model: selectedKeyRow cg@2015: hasHorizontalScrollBar: true cg@2015: hasVerticalScrollBar: true cg@2015: dataList: keyStringAndLanguageSelectionTable cg@2015: columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: columnAdaptor: yourself cg@2015: postBuildCallback: postBuildDataSet: cg@2015: ) cg@2015: (ViewSpec cg@2015: name: 'Box1' cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (LabelSpec cg@2015: label: 'Original String (Key):' cg@2015: name: 'Label2' cg@2015: layout: (LayoutFrame 0 0 0 0 0 1 30 0) cg@2015: translateLabel: true cg@2015: adjust: left cg@2015: ) cg@2015: (TextEditorSpec cg@2015: name: 'OriginalText' cg@2015: layout: (LayoutFrame 0 0 30 0 0 1 0 1) cg@2015: model: originalTextHolder cg@2015: hasHorizontalScrollBar: true cg@2015: hasVerticalScrollBar: true cg@2015: modifiedChannel: originalTextModifiedHolder cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) cg@2015: ) cg@2015: (ViewSpec cg@2015: name: 'Box2' cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (LabelSpec cg@2015: label: 'Translated String:' cg@2015: name: 'Label1' cg@2015: layout: (LayoutFrame 0 0 0 0 0 1 30 0) cg@2015: translateLabel: true cg@2015: adjust: left cg@2015: ) cg@2015: (TextEditorSpec cg@2015: name: 'LanguageText' cg@2015: layout: (LayoutFrame 0 0 30 0 0 1 0 1) cg@2015: model: languageTextHolder cg@2015: hasHorizontalScrollBar: true cg@2015: hasVerticalScrollBar: true cg@2015: modifiedChannel: languageTextModifiedHolder cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) cg@2015: handles: (Any 0.33333333333333 0.66666666666667 1.0) cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) cg@2015: ) cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'menu specs'! cg@2015: cg@2015: mainMenu cg@2015: "This resource specification was automatically generated cg@2015: by the MenuEditor of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the MenuEditor may not be able to read the specification." cg@2015: cg@2015: " cg@2015: MenuEditor new openOnClass:InternationalLanguageTranslationEditor andSelector:#mainMenu cg@2015: (Menu new fromLiteralArrayEncoding:(InternationalLanguageTranslationEditor mainMenu)) startUp cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'File' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'New' cg@2015: itemValue: menuNew cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Open Resource File...' cg@2015: itemValue: menuOpen cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Save Resource File' cg@2015: itemValue: menuSave cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Save Resource File As...' cg@2015: itemValue: menuSaveAs cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Exit' cg@2015: itemValue: closeRequest cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'View' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Show Missing Translations Only' cg@2015: translateLabel: true cg@2015: indication: showMissingTranslationsOnly cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Shown Languages' cg@2015: translateLabel: true cg@2015: submenuChannel: shownLanguagesMenu cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Languages' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Add Language...' cg@2015: itemValue: addLanguage cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Language...' cg@2015: itemValue: removeLanguage cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Translations' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Add Translation...' cg@2015: itemValue: addTranslation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Translation...' cg@2015: itemValue: removeTranslation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Extract from Class...' cg@2015: itemValue: extractTranslationsFromClass cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2032: label: 'Extract from Project...' cg@2032: itemValue: extractTranslationsFromProject cg@2032: translateLabel: true cg@2032: ) cg@2032: (MenuItem cg@2032: label: '-' cg@2032: ) cg@2032: (MenuItem cg@2015: label: 'Run Application and Collect Translations...' cg@2015: itemValue: runApplicationAndCollectTranslations cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Help' cg@2015: translateLabel: true cg@2015: startGroup: right cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Documentation' cg@2015: itemValue: openDocumentation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'About this Application...' cg@2015: itemValue: openAboutThisApplication cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ! cg@2015: cg@2015: menuToolBar cg@2015: "This resource specification was automatically generated cg@2015: by the MenuEditor of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the MenuEditor may not be able to read the specification." cg@2015: cg@2015: " cg@2015: MenuEditor new openOnClass:InternationalLanguageTranslationEditor andSelector:#menuToolBar cg@2015: (Menu new fromLiteralArrayEncoding:(InternationalLanguageTranslationEditor menuToolBar)) startUp cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Save' cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary saveImageIcon) cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Add Translation' cg@2015: itemValue: addTranslation cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary newRowIcon) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Translation' cg@2015: itemValue: removeTranslation cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary removeRowIcon) cg@2015: ) cg@2015: (MenuItem cg@2015: label: '' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Stop Application' cg@2015: itemValue: stopApplication cg@2015: translateLabel: true cg@2015: isVisible: stopApplicationIconVisibleHolder cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary stop16x16Icon) cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'aspects'! cg@2015: cg@2015: keyStringAndLanguageSelectionTable cg@2015: keyStringsToLanguageMappings isNil ifTrue:[ cg@2015: keyStringsToLanguageMappings := KeyStringsToLanguageMappings new. cg@2015: ]. cg@2015: ^ keyStringsToLanguageMappings. cg@2015: ! cg@2015: cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder isNil ifTrue:[ cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder := ValueHolder new. cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder value:(self keyStringAndLanguageSelectionTableColumnDescription). cg@2015: ]. cg@2015: ^ keyStringAndLanguageSelectionTableColumnDescriptionHolder. cg@2015: ! cg@2015: cg@2015: languageAtCol:colNr cg@2015: ^ shownLanguages at:colNr-1. cg@2015: ! cg@2015: cg@2015: languageShownHolderFor:lang cg@2015: |holder| cg@2015: cg@2015: languageShownHolders isNil ifTrue:[ cg@2015: languageShownHolders := Dictionary new cg@2015: ]. cg@2015: holder := languageShownHolders cg@2015: at:lang cg@2015: ifAbsentPut:[ cg@2015: |h| cg@2015: cg@2015: h := true asValue. cg@2015: h onChangeEvaluate:[ cg@2015: h value ifTrue:[ cg@2015: self enableLanguageDisplayFor:lang cg@2015: ] ifFalse:[ cg@2015: self disableLanguageDisplayFor:lang cg@2015: ]. cg@2015: ]. cg@2015: h cg@2015: ]. cg@2015: ^ holder. cg@2015: ! cg@2015: cg@2015: languageTextHolder cg@2015: languageTextHolder isNil ifTrue:[ cg@2015: languageTextHolder := '' asValue. cg@2015: ]. cg@2015: ^ languageTextHolder. cg@2015: ! cg@2015: cg@2015: languageTextModifiedHolder cg@2015: languageTextModifiedHolder isNil ifTrue:[ cg@2015: languageTextModifiedHolder := false asValue. cg@2015: ]. cg@2015: ^ languageTextModifiedHolder. cg@2015: ! cg@2015: cg@2015: languagesList cg@2015: languagesList isNil ifTrue:[ cg@2015: languagesList := List withAll:(self keyStringAndLanguageSelectionTable languages). cg@2015: ]. cg@2015: ^ languagesList. cg@2015: ! cg@2015: cg@2015: originalTextHolder cg@2015: originalTextHolder isNil ifTrue:[ cg@2015: originalTextHolder := '' asValue. cg@2015: ]. cg@2015: ^ originalTextHolder. cg@2015: ! cg@2015: cg@2015: originalTextModifiedHolder cg@2015: originalTextModifiedHolder isNil ifTrue:[ cg@2015: originalTextModifiedHolder := false asValue. cg@2015: ]. cg@2015: ^ originalTextModifiedHolder. cg@2015: ! cg@2015: cg@2015: selectedKeyRow cg@2015: selectedKeyRow isNil ifTrue:[ cg@2015: selectedKeyRow := ValueHolder new. cg@2015: selectedKeyRow onChangeSend:#selectionChanged to:self. cg@2015: ]. cg@2015: ^ selectedKeyRow. cg@2015: ! cg@2015: cg@2015: showMissingTranslationsOnly cg@2015: showMissingTranslationsOnly isNil ifTrue:[ cg@2015: showMissingTranslationsOnly := false asValue. cg@2015: ]. cg@2015: ^ showMissingTranslationsOnly. cg@2015: ! cg@2015: cg@2015: shownLanguages cg@2015: shownLanguages isNil ifTrue:[ cg@2015: shownLanguages := List new. cg@2015: shownLanguages addAll:(self languagesList). cg@2015: shownLanguages onChangeSend:#shownLanguagesChanged to:self. cg@2015: ]. cg@2015: ^ shownLanguages. cg@2015: ! cg@2015: cg@2015: stopApplicationIconVisibleHolder cg@2015: stopApplicationIconVisibleHolder isNil ifTrue:[ cg@2015: stopApplicationIconVisibleHolder := false asValue. cg@2015: ]. cg@2015: ^ stopApplicationIconVisibleHolder. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'initialization & release'! cg@2015: cg@2015: closeRequest cg@2015: "asks for permission before closing" cg@2015: cg@2015: self hasUnsavedChanges ifTrue:[ cg@2015: (Dialog cg@2015: confirm:(resources string:'Close without saving ?') cg@2015: default:false) ifFalse:[ cg@2015: ^ self cg@2015: ] cg@2015: ]. cg@2015: cg@2015: super closeRequest cg@2015: ! cg@2015: cg@2015: initialize cg@2015: modified := false. cg@2031: inSingleFileMode := false. cg@2015: super initialize cg@2015: ! cg@2015: cg@2015: postBuildDataSet:aView cg@2015: dataSetView := aView cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'menu actions'! cg@2015: cg@2015: addLanguage cg@2015: |lang| cg@2015: cg@2015: lang := Dialog request:'New language (ISO symbol):'. cg@2015: lang isEmptyOrNil ifTrue:[^ self]. cg@2015: cg@2015: (keyStringsToLanguageMappings includesLanguage:lang) ifTrue:[^ self ]. cg@2015: cg@2015: keyStringsToLanguageMappings addLanguage:lang. cg@2015: self languagesList add:lang. cg@2015: self shownLanguages add:lang. cg@2015: modified := true. cg@2015: ! cg@2015: cg@2015: addTranslation cg@2015: |key index| cg@2015: cg@2015: key := Dialog request:'New Key:'. cg@2015: (keyStringsToLanguageMappings includesKey:key) ifFalse:[ cg@2015: keyStringsToLanguageMappings addKey:key. cg@2015: modified := true. cg@2015: ]. cg@2015: index := keyStringsToLanguageMappings indexOfKey:key. cg@2015: cg@2015: self selectedKeyRow value:index cg@2015: ! cg@2015: cg@2015: extractTranslationsFromClass cg@2015: |aClass newTranslations| cg@2015: cg@2015: aClass := Dialog cg@2015: requestClass:'Class to extract translations from:' cg@2015: okLabel:'OK' cg@2015: initialAnswer:(lastExtractedClass ? LastExtractedClass). cg@2015: aClass isNil ifTrue:[^ self ]. cg@2015: cg@2015: lastExtractedClass := LastExtractedClass := aClass. cg@2015: cg@2032: newTranslations := self extractTranslationsFromClass:aClass. cg@2032: self addAllTranslations:newTranslations. cg@2032: ! cg@2032: cg@2032: extractTranslationsFromProject cg@2032: |box projectID newTranslations| cg@2032: cg@2032: box := ListSelectionBox new. cg@2032: "/ box useComboBoxWithList:(Smalltalk allProjectIDs). cg@2032: box title:(resources string:'Project to extract translations from:'). cg@2032: box list:Smalltalk allProjectIDs. cg@2032: box okAction:[:sel | projectID := sel]. cg@2032: box initialText:(lastExtractedProject ? LastExtractedProject). cg@2032: box label:'Find Translations in Project'. cg@2032: cg@2032: box showAtPointer. cg@2032: cg@2032: projectID notNil ifTrue:[ cg@2032: projectID := projectID withoutSeparators asSymbol. cg@2032: ]. cg@2032: projectID isEmptyOrNil ifTrue:[^ self ]. cg@2032: cg@2032: lastExtractedProject := LastExtractedProject := projectID. cg@2032: cg@2015: newTranslations := Set new. cg@2015: cg@2032: Smalltalk allClassesDo:[:eachClass | cg@2032: eachClass theNonMetaclass package == projectID ifTrue:[ cg@2032: "/ eachClass isLoaded ifTrue:[ self halt. ]. cg@2032: newTranslations addAll:( self extractTranslationsFromClass:eachClass theNonMetaclass). cg@2032: ] cg@2015: ]. cg@2015: cg@2032: self addAllTranslations:newTranslations. cg@2015: ! cg@2015: cg@2015: menuNew cg@2015: modified ifTrue:[ cg@2015: (Dialog cg@2015: confirm:(resources stringWithCRs:'Modified translations have not been changed.\\Create new translations set anyway ?') cg@2015: default:false) ifFalse:[^ self]. cg@2015: ]. cg@2015: cg@2015: keyStringsToLanguageMappings initialize. cg@2015: keyStringsToLanguageMappings changed. cg@2015: cg@2015: self languagesList contents:self keyStringAndLanguageSelectionTable languages. cg@2015: self shownLanguages contents:self keyStringAndLanguageSelectionTable languages. cg@2015: modified := false. cg@2015: ! cg@2015: cg@2015: menuOpen cg@2015: |fn| cg@2015: cg@2015: fn := Dialog cg@2015: requestFileName:'Name of resource file:' cg@2015: default:nil cg@2015: pattern:'*.rs'. cg@2015: cg@2015: fn isEmptyOrNil ifTrue:[^ self ]. cg@2015: fn := fn asFilename. cg@2015: fn exists ifFalse:[^ self ]. cg@2015: cg@2015: self readResourceFile:fn cg@2015: ! cg@2015: cg@2015: menuSave cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'save' is selected." cg@2015: cg@2015: "/ change below and add any actions as required here ... cg@2015: self warn:'no action for ''save'' available.'. cg@2015: ! cg@2015: cg@2015: menuSaveAs cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'saveAs' is selected." cg@2015: cg@2015: "/ change below and add any actions as required here ... cg@2015: self warn:'no action for ''saveAs'' available.'. cg@2015: ! cg@2015: cg@2015: openAboutThisApplication cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'help-about' is selected." cg@2015: cg@2015: "/ could open a customized aboutBox here ... cg@2015: super openAboutThisApplication cg@2015: ! cg@2015: cg@2015: openDocumentation cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'help-documentation' is selected." cg@2015: cg@2015: "/ change below as required ... cg@2015: cg@2015: "/ to open an HTML viewer on some document (under 'doc/online//' ): cg@2015: HTMLDocumentView openFullOnDocumentationFile:'TOP.html'. cg@2015: cg@2015: "/ add application-specific help files under the 'doc/online//help/appName' cg@2015: "/ directory, and open a viewer with: cg@2015: "/ HTMLDocumentView openFullOnDocumentationFile:'help//TOP.html'. cg@2015: ! cg@2015: cg@2015: readResourceFile:aFilename cg@2031: |lang| cg@2031: cg@2031: lang := Dialog choose:'For which language ?' fromList:languagesList lines:10. cg@2031: lang isNil ifTrue:[^ self ]. cg@2031: cg@2031: self readResourceFile:aFilename asLanguage:lang asSymbol cg@2031: ! cg@2031: cg@2031: readResourceFile:aFilename asLanguage:lang cg@2031: |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys| cg@2015: cg@2015: aFilename exists ifFalse:[^ self ]. cg@2015: cg@2031: resourcePack := ResourcePack new. cg@2031: cg@2015: inStream := aFilename readStream. cg@2015: [inStream atEnd] whileFalse:[ cg@2015: lineString := inStream nextLine. cg@2015: (lineString notEmpty cg@2015: and:[ (lineString startsWith:';') not ]) ifTrue:[ cg@2031: ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[ cg@2031: lineString := (lineString copyFrom:2) withoutSeparators. cg@2031: (lineString startsWith:'encoding ') ifTrue:[ cg@2031: encoding := ResourcePack extractEncodingFromLine:lineString. cg@2031: decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil. cg@2031: ]. cg@2015: ] ifFalse:[ cg@2031: ResourcePack cg@2031: processResourceLine:lineString cg@2031: encoding:decoder cg@2031: file:aFilename pathName cg@2031: printErrorWith:[:msg | Transcript showCR:msg ] cg@2031: for:resourcePack cg@2031: keepUselessTranslations:true. cg@2015: ]. cg@2015: ]. cg@2015: ]. cg@2015: inStream close. cg@2031: cg@2031: sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection. cg@2031: remainingKeys := resourcePack keys select:[:k | k isString not]. cg@2031: cg@2031: sortedKeys do:[:k | cg@2031: keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) cg@2031: ]. cg@2031: remainingKeys do:[:k | cg@2031: keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) cg@2031: ]. cg@2015: ! cg@2015: cg@2015: removeLanguage cg@2015: "automatically generated by UIEditor ..." cg@2015: cg@2015: "*** the code below performs no action" cg@2015: "*** (except for some feedback on the Transcript)" cg@2015: "*** Please change as required and accept in the browser." cg@2015: "*** (and replace this comment by something more useful ;-)" cg@2015: cg@2015: "action to be added ..." cg@2015: cg@2015: Transcript showCR:self class name, ': action for #removeLanguage ...'. cg@2015: ! cg@2015: cg@2015: removeTranslation cg@2015: |rowSelectionIndex selectedKey| cg@2015: cg@2015: rowSelectionIndex := self selectedKeyRow value. cg@2015: rowSelectionIndex ~~ 0 ifTrue:[ cg@2015: selectedKey := keyStringsToLanguageMappings keyAt:rowSelectionIndex ifAbsent:nil. cg@2015: (Dialog confirm:(resources string:'Really remove key %1' with:selectedKey)) ifTrue:[ cg@2015: keyStringsToLanguageMappings removeKey:selectedKey. cg@2015: ]. cg@2015: ]. cg@2015: ! cg@2015: cg@2015: runApplicationAndCollectTranslations cg@2015: |applicationClass newTranslations pseudoPack app| cg@2015: cg@2015: monitoredApplication notNil ifTrue:[ cg@2015: monitoredApplication terminate. cg@2015: [monitoredApplication notNil] whileTrue:[ cg@2015: Delay waitForSeconds:0.1 cg@2015: ]. cg@2015: ]. cg@2015: cg@2015: applicationClass := Dialog cg@2015: requestClass:'Application class to start and collect translations from:' cg@2015: okLabel:'OK' cg@2015: initialAnswer:(lastExtractedApplicationClass ? LastExtractedApplicationClass ). cg@2015: applicationClass isNil ifTrue:[^ self ]. cg@2015: cg@2015: lastExtractedApplicationClass := LastExtractedApplicationClass := applicationClass. cg@2015: cg@2015: newTranslations := Set new. cg@2015: cg@2015: pseudoPack := AccessCollectingPseudoResourcePack new. cg@2015: pseudoPack realResourcePack:(applicationClass classResources). cg@2015: cg@2015: self stopApplicationIconVisibleHolder value:true. cg@2015: cg@2015: monitoredApplication := [ cg@2015: [ cg@2015: app := applicationClass new. cg@2015: app open. cg@2015: app window waitUntilVisible. cg@2015: app window waitUntilClosed. cg@2015: ] ensure:[ cg@2015: app closeRequest. cg@2015: self stopApplicationIconVisibleHolder value:false. cg@2015: monitoredApplication := nil. cg@2015: ]. cg@2015: ] fork. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'menus dynamic'! cg@2015: cg@2015: disableLanguageDisplayFor:lang cg@2015: self shownLanguages remove:lang ifAbsent:[] cg@2015: ! cg@2015: cg@2015: enableLanguageDisplayFor:newLang cg@2015: |shownLanguagesInOrder| cg@2015: cg@2015: (self shownLanguages includes:newLang) ifFalse:[ cg@2015: shownLanguagesInOrder := self languagesList cg@2015: select:[:lang | (self shownLanguages includes:lang) cg@2015: or:[ lang = newLang ]]. cg@2015: self shownLanguages contents:shownLanguagesInOrder. cg@2015: ] cg@2015: ! cg@2015: cg@2015: isLanguageShown:lang cg@2015: ^ self shownLanguages includes:lang cg@2015: ! cg@2015: cg@2015: shownLanguagesMenu cg@2015: cg@2015: cg@2015: ^ [ cg@2015: |m selected| cg@2015: cg@2015: m := Menu new. cg@2015: cg@2015: self languagesList do:[:lang | cg@2015: |item| cg@2015: cg@2015: item := MenuItem label:lang. cg@2015: item indication:(self languageShownHolderFor:lang). cg@2015: item hideMenuOnActivated:false. cg@2015: m addItem:item. cg@2015: ]. cg@2015: m cg@2015: ]. cg@2015: ! cg@2015: cg@2015: toggleLanguageDisplayFor:lang cg@2015: (self shownLanguages includes:lang) ifTrue:[ cg@2015: self disableLanguageDisplayFor:lang cg@2015: ] ifFalse:[ cg@2015: self enableLanguageDisplayFor:lang cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'private-key extraction'! cg@2015: cg@2032: addAllTranslations:newTranslations cg@2034: |newTranslationKeys stringKeys nonStringKeys| cg@2032: cg@2034: newTranslationKeys := newTranslations select:[:k | k notEmpty and:[k isString not or:[k isBlank not]]]. cg@2032: newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not]. cg@2034: newTranslationKeys := newTranslationKeys cg@2034: collect:[:k | cg@2034: (k endsWith:'...') ifTrue:[ cg@2034: k copyWithoutLast:3. cg@2034: ] ifFalse:[ cg@2034: ('.:' includes:k last) ifTrue:[ cg@2034: k copyWithoutLast:1. cg@2034: ] ifFalse:[ cg@2034: k cg@2034: ]]]. cg@2034: newTranslationKeys := newTranslationKeys asSet. cg@2034: cg@2032: newTranslationKeys notEmpty ifTrue:[ cg@2034: stringKeys := newTranslationKeys select:[:k | k isString]. cg@2034: nonStringKeys := newTranslationKeys select:[:k | k isString not]. cg@2034: cg@2034: stringKeys := stringKeys asSortedCollection. cg@2034: keyStringsToLanguageMappings addKeys:stringKeys. cg@2034: keyStringsToLanguageMappings addKeys:nonStringKeys. cg@2032: modified := true. cg@2032: ]. cg@2032: ! cg@2032: cg@2032: extractTranslationsFromClass:aClass cg@2032: |newTranslations| cg@2032: cg@2032: newTranslations := Set new. cg@2032: cg@2032: self withWaitCursorDo:[ cg@2032: "/ now, the hard part: cg@2032: "/ possible translations are in the specs, cg@2032: "/ and all arguments to (resources string:) messages. cg@2032: aClass instAndClassMethodsDo:[:eachMethod | cg@2032: newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ). cg@2032: ]. cg@2032: ]. cg@2032: ^ newTranslations cg@2032: ! cg@2032: cg@2015: extractTranslationsFromHelpSpecMethod:aMethod cg@2015: |codeStrings matcher parseTree resourceKeys| cg@2015: cg@2015: parseTree := RBParser cg@2015: parseMethod:aMethod source cg@2015: onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos. cg@2015: nil]. cg@2015: parseTree isNil ifTrue:[^ #() ]. cg@2015: cg@2015: codeStrings := cg@2015: #( cg@2015: '`@dict addPairsFrom: `#helpKeysAndStrings' cg@2015: ). cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: matcher := ParseTreeSearcher new. cg@2015: matcher cg@2015: matchesAnyOf: codeStrings cg@2015: do: [:aNode :answer | cg@2015: |sel argNode arg| cg@2015: cg@2015: sel := aNode selector. cg@2015: (sel startsWith:'addPairsFrom:') ifTrue:[ cg@2015: argNode := aNode arguments at:1. cg@2015: argNode isLiteral ifTrue:[ cg@2015: arg := argNode value. cg@2015: arg isArray ifTrue:[ cg@2015: arg doWithIndex:[:el :index | cg@2015: index even ifTrue:[ cg@2015: el isString ifTrue:[ cg@2015: resourceKeys add:el. cg@2015: ] cg@2015: ]. cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-array in %1 in %2' cg@2015: with:argNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-literal: %1 in %2' cg@2015: with:argNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ]. cg@2015: aNode cg@2015: ]. cg@2015: cg@2015: matcher executeTree: parseTree initialAnswer: nil. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMenuSpecMethod:aMethod cg@2015: |menu resourceKeys| cg@2015: cg@2015: menu := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: menu isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (menu isKindOf:Menu) ifFalse:[ cg@2015: menu := Menu new fromLiteralArrayEncoding:menu cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: menu allItemsDo:[:aMenuItem | cg@2015: aMenuItem translateLabel ifTrue:[ cg@2015: aMenuItem isSeparatorItem ifFalse:[ cg@2015: resourceKeys add:aMenuItem label. cg@2015: ] cg@2015: ] cg@2015: ]. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMethod:aMethod cg@2015: |mResources| cg@2015: cg@2015: mResources := aMethod resources. cg@2015: mResources notNil ifTrue:[ cg@2015: (mResources includesKey:#menu) ifTrue:[ cg@2015: ^ self extractTranslationsFromMenuSpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#canvas) ifTrue:[ cg@2015: ^ self extractTranslationsFromUISpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#help) ifTrue:[ cg@2015: ^ self extractTranslationsFromHelpSpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#tableColumns) ifTrue:[ cg@2015: ^ self extractTranslationsFromTableColumnsSpecMethod:aMethod. cg@2015: ]. cg@2015: cg@2015: ^ self extractTranslationsFromSpecMethod:aMethod. cg@2015: ]. cg@2015: ^ self extractTranslationsFromMethodsCode:aMethod cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMethodsCode:aMethod cg@2015: "/method:mthd selector:sel inClass:cls matchesParseTreeMatcher:aMatcher cg@2015: |codeStrings matcher parseTree resourceKeys| cg@2015: cg@2015: parseTree := RBParser cg@2015: parseMethod:aMethod source cg@2015: onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos. cg@2015: nil]. cg@2015: parseTree isNil ifTrue:[^ #() ]. cg@2015: cg@2015: codeStrings := cg@2015: #( cg@2015: 'resources `@msg: `@args' cg@2015: 'self resources `@msg: `@args' cg@2015: 'self class resources `@msg: `@args' cg@2015: 'self classResources `@msg: `@args' cg@2015: ). cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: matcher := ParseTreeSearcher new. cg@2015: matcher cg@2015: matchesAnyOf: codeStrings cg@2015: do: [:aNode :answer | cg@2015: |sel keyStringArgNode keyStringArg| cg@2015: cg@2015: sel := aNode selector. cg@2015: ((sel startsWith:'string:') or:[(sel startsWith:'at:')]) ifTrue:[ cg@2015: keyStringArgNode := aNode arguments at:1. cg@2015: keyStringArgNode isLiteral ifTrue:[ cg@2015: keyStringArg := keyStringArgNode value. cg@2015: keyStringArg isString ifTrue:[ cg@2015: resourceKeys add:keyStringArg. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-string: %1 in %2' cg@2015: with:keyStringArgNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-literal: %1 in %2' cg@2015: with:keyStringArgNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ]. cg@2015: aNode cg@2015: ]. cg@2015: cg@2015: matcher executeTree: parseTree initialAnswer: nil. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromSpecMethod:aMethod cg@2015: ^ #() cg@2015: ! cg@2015: cg@2015: extractTranslationsFromTableColumnsSpecMethod:aMethod cg@2015: |columnDescription resourceKeys| cg@2015: cg@2015: columnDescription := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: columnDescription isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (columnDescription first isKindOf:DataSetColumnSpec) ifFalse:[ cg@2015: columnDescription := columnDescription collect:[:el | DataSetColumnSpec new fromLiteralArrayEncoding:el]. cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: columnDescription do:[:aColumnSpec | cg@2015: aColumnSpec translateLabel ifTrue:[ cg@2015: resourceKeys add:aColumnSpec label. cg@2015: ] cg@2015: ]. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromUISpecMethod:aMethod cg@2015: |spec resourceKeys visitor| cg@2015: cg@2015: spec := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: spec isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (spec isKindOf:UISpecification) ifFalse:[ cg@2015: spec := UISpecification from:spec cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: visitor := UISpecVisitor new. cg@2015: spec acceptVisitor:visitor. cg@2015: cg@2015: ^ visitor translatedLabels cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'queries'! cg@2015: cg@2015: hasUnsavedChanges cg@2015: ^ modified cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'specs-dynamic'! cg@2015: cg@2015: columnInRow:row at:colIndex cg@2015: |lang| cg@2015: cg@2015: lang := self languageAtCol:colIndex. cg@2015: ^ row atLanguage:lang cg@2015: ! cg@2015: cg@2015: getBackgroundForRow:row rowNr:rowNr col:colIndex cg@2015: |lang| cg@2015: cg@2015: colIndex == 1 ifTrue:[^ nil]. cg@2015: lang := self languageAtCol:colIndex. cg@2015: ^ (row atLanguage:lang) isNil ifTrue:[Color red lightened] ifFalse:nil cg@2015: ! cg@2015: cg@2015: keyStringAndLanguageSelectionTableColumnDescription cg@2015: |spec| cg@2015: cg@2015: spec := OrderedCollection new. cg@2015: cg@2015: spec add: cg@2015: #(DataSetColumnSpec cg@2015: label: 'Key' cg@2015: labelAlignment: center cg@2015: labelButtonType: Button cg@2015: minWidth: 50 cg@2015: model: keyStringInRow: cg@2015: isResizeable: true cg@2015: canSelect: true cg@2015: showRowSeparator: true cg@2015: showColSeparator: true cg@2015: ). cg@2015: cg@2015: self shownLanguages do:[:lang | cg@2015: |entry| cg@2015: cg@2015: entry := cg@2015: #(DataSetColumnSpec cg@2015: label: lang cg@2015: labelAlignment: center cg@2015: labelButtonType: Button cg@2015: minWidth: 50 cg@2015: model: #columnInRow:at: cg@2015: canSelect: true cg@2015: isResizeable: true cg@2015: showRowSeparator: true cg@2015: showColSeparator: true cg@2015: backgroundSelector: #getBackgroundForRow:rowNr:col: cg@2015: ). cg@2015: entry := entry copy. cg@2015: entry replaceAll:#lang with:lang. cg@2015: spec add: entry cg@2015: ]. cg@2015: ^ spec cg@2015: ! cg@2015: cg@2015: keyStringInRow:row cg@2015: ^ row keyString cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'user actions'! cg@2015: cg@2015: selectionChanged cg@2015: |rowSelectionIndex colSelectionIndex language selectedKey originalText languageText cg@2015: answer| cg@2015: cg@2015: colSelectionIndex := dataSetView selectedColIndex. cg@2015: language := colSelectionIndex > 1 ifTrue:[ shownLanguages at:colSelectionIndex-1 ] ifFalse:nil. cg@2015: cg@2015: rowSelectionIndex := self selectedKeyRow value. cg@2015: rowSelectionIndex ~~ 0 ifTrue:[ cg@2015: selectedKey := keyStringsToLanguageMappings keyAt:rowSelectionIndex. cg@2015: originalText := selectedKey storeString. cg@2015: language notNil ifTrue:[ cg@2015: languageText := keyStringsToLanguageMappings at:selectedKey language:language. cg@2015: languageText notNil ifTrue:[ cg@2015: languageText := languageText storeString. cg@2015: ] cg@2015: ] cg@2015: ]. cg@2015: cg@2015: self originalTextModifiedHolder value ifTrue:[ cg@2015: answer := OptionBox cg@2015: request:'Accept changed original text (key) ?' cg@2015: label:'Original text (key) changed' cg@2015: image:(WarningBox iconBitmap) cg@2015: buttonLabels:#('Cancel' 'Accept' 'Accept As New') cg@2015: values:#(nil #accept #acceptAsNew) cg@2015: default:#acceptAsNew. cg@2015: cg@2015: answer isNil ifTrue:[^ self ]. cg@2015: answer == #accept ifTrue:[ cg@2015: self halt. ]. cg@2015: answer == #acceptAsNew ifTrue:[ cg@2015: self halt. ]. cg@2015: ]. cg@2015: self languageTextModifiedHolder value ifTrue:[ self halt. cg@2015: (Dialog confirm:'Accept changed translation ?') ifTrue:[ cg@2015: self halt. cg@2015: ] cg@2015: ]. cg@2015: cg@2015: self originalTextHolder value:originalText. cg@2015: self languageTextHolder value:languageText. cg@2015: cg@2015: self originalTextModifiedHolder value:false. cg@2015: self languageTextModifiedHolder value:false. cg@2015: ! cg@2015: cg@2015: shownLanguagesChanged cg@2015: self keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: value:(self keyStringAndLanguageSelectionTableColumnDescription). cg@2015: ! cg@2015: cg@2015: stopApplication cg@2015: |p| cg@2015: cg@2015: (p := monitoredApplication) notNil ifTrue:[ cg@2015: p terminate. cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::AccessCollectingPseudoResourcePack methodsFor:'accessing'! cg@2015: cg@2015: realResourcePack:something cg@2015: realResourcePack := something. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings class methodsFor:'instance creation'! cg@2015: cg@2015: new cg@2015: ^ self basicNew initialize cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'accessing'! cg@2015: cg@2015: addKey:aKey cg@2031: (keys includes:aKey) ifFalse:[ cg@2031: keys add:aKey. cg@2031: self changed. cg@2031: ] cg@2015: ! cg@2015: cg@2015: addKeys:aCollectionOfKey cg@2015: keys addAll:aCollectionOfKey. cg@2015: self changed. cg@2015: ! cg@2015: cg@2015: addLanguage:lang cg@2031: (languages includes:lang) ifFalse:[ cg@2031: languages add:lang. cg@2032: perLanguageMappings at:lang put:(Dictionary new). cg@2031: ] cg@2015: ! cg@2015: cg@2015: at:aKey language:language cg@2032: ^ (perLanguageMappings at:language) at:aKey ifAbsent:nil cg@2015: ! cg@2015: cg@2015: at:aKey language:language put:value cg@2015: self addKey:aKey. cg@2032: ^ (perLanguageMappings at:language) at:aKey put:value cg@2015: ! cg@2015: cg@2015: keyAt:index cg@2015: ^ keys at:index. cg@2015: ! cg@2015: cg@2015: keyAt:index ifAbsent:exceptionalValue cg@2015: ^ keys at:index ifAbsent:exceptionalValue. cg@2015: ! cg@2015: cg@2015: keys cg@2015: ^ keys cg@2015: ! cg@2015: cg@2015: languages cg@2015: ^ languages cg@2015: ! cg@2015: cg@2015: removeKey:aKey cg@2015: keys remove:aKey ifAbsent:[]. cg@2032: perLanguageMappings do:[:eachMapping | cg@2015: eachMapping removeKey:aKey ifAbsent:[]. cg@2015: ]. cg@2015: self changed. cg@2015: ! cg@2015: cg@2015: size cg@2015: ^ keys size cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'enumerating'! cg@2015: cg@2015: do:aBlock cg@2015: keys do:[:eachKey | cg@2015: aBlock value:(InternationalLanguageTranslationEditor::LanguageMappingRow new cg@2015: key:eachKey; mappings:self). cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'initialization'! cg@2015: cg@2015: initialize cg@2015: super initialize. cg@2015: cg@2015: keys := OrderedSet new. cg@2015: languages := OrderedCollection new. cg@2032: perLanguageMappings := Dictionary new. cg@2032: perLanguageInfo := Dictionary new. cg@2015: cg@2031: self addLanguage:#'de'. cg@2031: self addLanguage:#'fr'. cg@2031: self addLanguage:#'es'. cg@2031: self addLanguage:(Smalltalk language). cg@2031: cg@2031: "/ self initializeDemoMappings. cg@2031: ! cg@2031: cg@2031: initializeDemoMappings cg@2015: keys add:'open'. cg@2015: keys add:'close'. cg@2015: keys add:'yes'. cg@2015: keys add:'no'. cg@2015: cg@2015: self addLanguage:#'de'. cg@2015: self addLanguage:#'fr'. cg@2015: cg@2015: self at:'open' language:#'de' put:'öffnen'. cg@2015: self at:'close' language:#'de' put:'schliessen'. cg@2015: self at:'yes' language:#'de' put:'ja'. cg@2015: self at:'no' language:#'de' put:'nein'. cg@2015: self at:'cancel' language:#'de' put:'abbrechen'. cg@2015: cg@2015: self at:'open' language:#'fr' put:'ouvrir'. cg@2015: self at:'close' language:#'fr' put:'fermer'. cg@2015: self at:'yes' language:#'fr' put:'oui'. cg@2015: self at:'no' language:#'fr' put:'non'. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'private'! cg@2015: cg@2015: atLanguage:lang cg@2032: ^ perLanguageMappings at:lang cg@2015: ! cg@2015: cg@2015: atLanguageIndex:idx cg@2015: |lang| cg@2015: cg@2015: lang := languages at:idx. cg@2015: ^ self atLanguage:lang. cg@2032: ! cg@2032: cg@2032: mappingAtLanguage:lang cg@2032: ^ perLanguageMappings at:lang cg@2032: ! cg@2032: cg@2032: mappingAtLanguageIndex:idx cg@2032: |lang| cg@2032: cg@2032: lang := languages at:idx. cg@2032: ^ self mappingAtLanguage:lang. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'queries'! cg@2015: cg@2015: includesKey:aKey cg@2015: ^ keys includes:aKey cg@2015: ! cg@2015: cg@2015: includesLanguage:lang cg@2015: ^ languages includes:lang cg@2015: ! cg@2015: cg@2015: indexOfKey:aKey cg@2015: ^ keys indexOf:aKey cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'! cg@2015: cg@2015: atLanguage:language cg@2032: |translation| cg@2032: cg@2032: translation := (mappings mappingAtLanguage:language) at:key ifAbsent:nil. cg@2032: ^ translation isNil ifTrue:nil ifFalse:[translation printString] cg@2015: ! cg@2015: cg@2015: columnAt:columnNr cg@2032: ^ (mappings mappingAtLanguageIndex:columnNr-1) at: key ifAbsent:nil cg@2015: ! cg@2015: cg@2015: key:something cg@2015: key := something. cg@2015: ! cg@2015: cg@2015: keyString cg@2032: ^ key printString cg@2015: ! cg@2015: cg@2015: mappings:something cg@2015: mappings := something. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::UISpecVisitor methodsFor:'accessing'! cg@2015: cg@2015: translatedLabels cg@2015: ^ translatedLabels ? #() cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::UISpecVisitor methodsFor:'visiting'! cg@2015: cg@2015: visitObject:anObject with:aParameter cg@2033: |l| cg@2033: cg@2015: (anObject isKindOf:UISpecification) ifTrue:[ cg@2015: (anObject respondsTo:#translateLabel) ifTrue:[ cg@2015: anObject translateLabel == true ifTrue:[ cg@2015: translatedLabels isNil ifTrue:[ cg@2015: translatedLabels := Set new. cg@2015: ]. cg@2033: l := anObject perform:#label ifNotUnderstood:nil. cg@2033: l notNil ifTrue:[ cg@2033: translatedLabels add:l. cg@2033: ]. cg@2015: ]. cg@2015: ]. cg@2015: ]. cg@2015: self visitChildrenOf:anObject. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'documentation'! cg@2015: cg@2015: version cg@2015: ^ '$Header$' cg@2015: ! !