# HG changeset patch # User fm # Date 1149775228 -7200 # Node ID 998f72439bfc2d207dbec48c393310472a975629 # Parent d10762e5d924142575f408247f662bd69def657f 2.0 diff -r d10762e5d924 -r 998f72439bfc Tools__InternationalLanguageTranslationEditor.st --- a/Tools__InternationalLanguageTranslationEditor.st Fri May 19 19:09:40 2006 +0200 +++ b/Tools__InternationalLanguageTranslationEditor.st Thu Jun 08 16:00:28 2006 +0200 @@ -12,7 +12,9 @@ monitoredApplication originalTextModifiedHolder languageTextModifiedHolder languageTextAcceptHolder inSingleFileMode lastExtractedProject lastLanguage - lastSelectedKey autoAccept languageEditor selectedColIndexHolder' + lastSelectedKey autoAcceptHolder languageEditor + selectedColIndexHolder exampleLanguageSelectionHolder + exampleLanguageTextHolder' classVariableNames:'LastExtractedClass LastExtractedApplicationClass LastExtractedProject' poolDictionaries:'' @@ -112,7 +114,7 @@ name: 'InternationalLanguageTranslationEditor' min: (Point 10 10) max: (Point 1024 768) - bounds: (Rectangle 0 0 636 396) + bounds: (Rectangle 0 0 609 482) menu: mainMenu ) component: @@ -125,7 +127,7 @@ textDefault: true ) (VariableVerticalPanelSpec - name: 'VariableVerticalPanel1' + name: 'VariableVerticalPanel2' layout: (LayoutFrame 0 0 30 0 0 1 0 1) component: (SpecCollection @@ -141,60 +143,107 @@ columnAdaptor: yourself postBuildCallback: postBuildDataSet: ) - (ViewSpec - name: 'Box1' + (VariableVerticalPanelSpec + name: 'VariableVerticalPanel1' component: (SpecCollection collection: ( - (LabelSpec - label: 'Original String (Key):' - name: 'Label2' - layout: (LayoutFrame 0 0 0 0 0 1 30 0) - translateLabel: true - adjust: left + (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 + ) + ) + + ) ) - (TextEditorSpec - name: 'OriginalText' - layout: (LayoutFrame 0 0 30 0 0 1 0 1) - model: originalTextHolder - hasHorizontalScrollBar: true - hasVerticalScrollBar: true - modifiedChannel: originalTextModifiedHolder + (ViewSpec + name: 'Box3' + component: + (SpecCollection + collection: ( + (LabelSpec + label: 'Select Another Traduction as example:' + name: 'Label3' + layout: (LayoutFrame 0 0 -6 0 0 1 24 0) + translateLabel: true + adjust: left + ) + (ComboBoxSpec + name: 'ComboBox1' + layout: (LayoutFrame 197 0 -2 0 322 0 18 0) + model: exampleLanguageSelectionHolder + immediateAccept: false + acceptOnLeave: true + acceptOnLostFocus: true + acceptOnPointerLeave: false + comboList: shownLanguages + useIndex: false + ) + (TextEditorSpec + name: 'ExampleLanguageText' + layout: (LayoutFrame 0 0 25 0 611 0 66 0) + model: exampleLanguageTextHolder + hasHorizontalScrollBar: true + hasVerticalScrollBar: true + isReadOnly: true + ) + ) + + ) + ) + (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 + postBuildCallback: languageEditorBuilt: + ) + ) + + ) ) ) ) - ) - (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 - postBuildCallback: languageEditorBuilt: - ) - ) - - ) + handles: (Any 0.33333333333333 0.66666666666667 1.0) ) ) ) - handles: (Any 0.33333333333333 0.66666666666667 1.0) + handles: (Any 0.5 1.0) ) ) @@ -212,8 +261,8 @@ the MenuEditor may not be able to read the specification." " - MenuEditor new openOnClass:InternationalLanguageTranslationEditor andSelector:#mainMenu - (Menu new fromLiteralArrayEncoding:(InternationalLanguageTranslationEditor mainMenu)) startUp + MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#mainMenu + (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor mainMenu)) startUp " @@ -354,6 +403,22 @@ ) ) (MenuItem + label: 'Preferences' + translateLabel: true + submenu: + (Menu + ( + (MenuItem + label: 'Auto Accept Changes' + translateLabel: true + indication: autoAcceptHolder + ) + ) + nil + nil + ) + ) + (MenuItem label: 'Help' translateLabel: true startGroup: right @@ -489,24 +554,44 @@ !InternationalLanguageTranslationEditor methodsFor:'accessing'! -autoAccept - autoAccept isNil ifTrue:[autoAccept := true]. - ^ autoAccept -! - -autoAccept:something - autoAccept := something. -! - newLanguageText "/ languageEditor accept ^self languageTextHolder value isNil ifTrue:[''] ifFalse:[self languageTextHolder value asCollectionOfLines first.] +! + +selectedKey + "Returns the current selected key if there is one row seleted. Otherwise, returns nil" + |rowSelectionIndex | + + rowSelectionIndex := self selectedKeyRow value. + rowSelectionIndex == 0 ifTrue:[^nil]. + ^ keyStringsToLanguageMappings keyAt:rowSelectionIndex. ! ! !InternationalLanguageTranslationEditor methodsFor:'aspects'! +autoAcceptHolder + autoAcceptHolder isNil ifTrue:[autoAcceptHolder := true asValue]. + ^ autoAcceptHolder +! + +exampleLanguageSelectionHolder + exampleLanguageSelectionHolder isNil ifTrue:[ + exampleLanguageSelectionHolder := self exampleLanguageByDefault asValue. + exampleLanguageSelectionHolder addDependent:self. + ]. + ^ exampleLanguageSelectionHolder +! + +exampleLanguageTextHolder + exampleLanguageTextHolder isNil ifTrue:[ + exampleLanguageTextHolder := '' asValue. + ]. + ^ exampleLanguageTextHolder. +! + keyStringAndLanguageSelectionTable keyStringsToLanguageMappings isNil ifTrue:[ keyStringsToLanguageMappings := KeyStringsToLanguageMappings new. @@ -552,15 +637,13 @@ languageTextAcceptHolder languageTextAcceptHolder isNil ifTrue:[ - languageTextAcceptHolder := false asValue. - languageTextAcceptHolder onChangeSend:#languageTextAccepted to:self. + languageTextAcceptHolder := false asValue. ]. ^ languageTextAcceptHolder. ! -languageTextAccepted - " -self updateLanguageTextModification. " +languageTextAccepted + self selectedKeyRow value: self selectedKeyRow value + 1. ! @@ -628,30 +711,6 @@ stopApplicationIconVisibleHolder := false asValue. ]. ^ stopApplicationIconVisibleHolder. -! - -updateLanguageAndKeySelection - - |rowSelectionIndex colSelectionIndex language selectedKey originalText languageText| - - colSelectionIndex := dataSetView selectedColIndex. - language := colSelectionIndex > 1 ifTrue:[ shownLanguages at:colSelectionIndex-1 ] ifFalse:nil. - - rowSelectionIndex := self selectedKeyRow value. - rowSelectionIndex ~~ 0 ifTrue:[ - selectedKey := keyStringsToLanguageMappings keyAt:rowSelectionIndex. - originalText := selectedKey storeString. - language notNil ifTrue:[ - languageText := keyStringsToLanguageMappings at:selectedKey language:language. - languageText notNil ifTrue:[ - languageText := languageText storeString. - ] - ] - ]. - self originalTextHolder value:originalText. - self languageTextHolder value:languageText. - lastLanguage := language. - lastSelectedKey := selectedKey. ! ! !InternationalLanguageTranslationEditor methodsFor:'change & update'! @@ -665,6 +724,16 @@ self updateLanguageTextModification. ^ self. ]. + changedObject == exampleLanguageSelectionHolder ifTrue:[ + self updateExampleLanguageText. + ^ self. + ]. +! + +updateExampleLanguageText + + self selectedKeyRow value isNil ifTrue:[^ self]. + self exampleLanguageTextHolder value:self currentExampleLanguageText ! updateKeyStringsToLanguageMappings @@ -675,6 +744,19 @@ put: self newLanguageText. ! +updateLanguageAndKeySelection + + |colSelectionIndex language| + + colSelectionIndex := dataSetView selectedColIndex. + language := colSelectionIndex > 1 ifTrue:[ shownLanguages at:colSelectionIndex-1 ] ifFalse:nil. + + self originalTextHolder value: self selectedKey. + self languageTextHolder value: (self languageTextFromSelectedKeyFor: language). + lastLanguage := language. + lastSelectedKey := self selectedKey. +! + updateLanguageTextModification self languageTextModifiedHolder value ifTrue:[ (self autoAccept or:[Dialog confirm:'Accept changed translation ?']) ifTrue:[ @@ -706,6 +788,33 @@ ]. ! ! +!InternationalLanguageTranslationEditor methodsFor:'dialogs'! + +requestEncoderString + + ^Dialog request:'Enter the encoder : '. +! + +requestFilename + + |aFilename| + + aFilename := Dialog + requestFileName:'Name of resource file:' + default:nil + pattern:'*.rs'. + + aFilename isEmptyOrNil ifTrue:[^ nil ]. + ^aFilename asFilename +! + +requestLanguage + ^ Dialog + choose:'Which language do you want to save?' + fromList:languagesList + lines:10 +! ! + !InternationalLanguageTranslationEditor methodsFor:'initialization & release'! closeRequest @@ -829,34 +938,36 @@ ! menuOpen - |fn| + |aFilename| - fn := Dialog - requestFileName:'Name of resource file:' - default:nil - pattern:'*.rs'. - - fn isEmptyOrNil ifTrue:[^ self ]. - fn := fn asFilename. - fn exists ifFalse:[^ self ]. - - self readResourceFile:fn + aFilename := self requestFilename. + aFilename isNil ifTrue:[^ self ]. + self readResourceFile:aFilename ! menuSave - "This method was generated by the Browser. - It will be invoked when the menu-item 'save' is selected." +"Saves the language selected in the fileName from where the language resource was obtained." + |lang aFilename| - "/ change below and add any actions as required here ... - self warn:'no action for ''save'' available.'. + lang := self requestLanguage. + lang isNil ifTrue:[^ self]. + aFilename := keyStringsToLanguageMappings filenameAt:lang. + aFilename isNil ifTrue:[ + aFilename := self requestFilename. + aFilename isNil ifTrue:[^ self]. + ]. + self saveResourceFile:aFilename for:lang asSymbol ! menuSaveAs - "This method was generated by the Browser. - It will be invoked when the menu-item 'saveAs' is selected." +"Saves the language selected in the specified fileName." + |lang aFilename| - "/ change below and add any actions as required here ... - self warn:'no action for ''saveAs'' available.'. + lang := self requestLanguage. + lang isNil ifTrue:[^ self]. + aFilename := self requestFilename. + aFilename isNil ifTrue:[^ self]. + self saveResourceFile:aFilename for:lang asSymbol ! openAboutThisApplication @@ -890,59 +1001,15 @@ self readResourceFile:aFilename asLanguage:lang asSymbol ! -readResourceFile:aFilename asLanguage:lang - |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys| - - aFilename exists ifFalse:[^ self ]. - - resourcePack := ResourcePack new. +removeLanguage + |lang| - inStream := aFilename readStream. - [inStream atEnd] whileFalse:[ - lineString := inStream nextLine. - (lineString notEmpty - 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. - - sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection. - remainingKeys := resourcePack keys select:[:k | k isString not]. - - sortedKeys do:[:k | - keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) - ]. - remainingKeys do:[:k | - keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) - ]. -! - -removeLanguage - "automatically generated by UIEditor ..." - - "*** the code below performs no action" - "*** (except for some feedback on the Transcript)" - "*** Please change as required and accept in the browser." - "*** (and replace this comment by something more useful ;-)" - - "action to be added ..." - - Transcript showCR:self class name, ': action for #removeLanguage ...'. + lang := Dialog choose:'Which language do you want to remove?' fromList:languagesList lines:10. + lang isNil ifTrue:[^ self ]. + (Dialog confirm: 'Are you sure to remove the language ', lang ) ifTrue:[ + self languagesList remove:lang. + self shownLanguages remove:lang. + ]. ! removeTranslation @@ -1311,8 +1378,143 @@ !InternationalLanguageTranslationEditor methodsFor:'queries'! +autoAccept + + ^ self autoAcceptHolder value +! + +currentExampleLanguageText + "Returns the language text corresponding for the current selected key and the example language selection" + + ^self languageTextFromSelectedKeyFor: self exampleLanguageSelectionHolder value +! + +exampleLanguageByDefault + +^self shownLanguages isEmpty + ifTrue:[nil] + ifFalse:[self shownLanguages first] +! + hasUnsavedChanges ^ modified +! + +languageTextFromSelectedKeyFor: language + "Returns the language text corresponding for the current selected key and the received language" + + language isNil ifTrue:[^'']. + ^keyStringsToLanguageMappings at: self selectedKey language:language. +! ! + +!InternationalLanguageTranslationEditor methodsFor:'read/write resourceFile'! + +printEditingWarningOn: aStream + +aStream nextPutAll: ';'; + cr; + nextPutAll: '; WARNING:'; + cr; + nextPutAll: '; this file contains national characters'; + cr; + nextPutAll: '; DONT EDIT this file with an old vi !!'; + cr; + nextPutAll: ';'; + cr. +! + +printEncoderFor: lang on: aStream +|characterEncoder encoderString| + +characterEncoder := keyStringsToLanguageMappings encoderAt: lang. +encoderString := characterEncoder isNil + ifTrue:[self requestEncoderString] + ifFalse:[characterEncoder nameOfEncoding printString]. + +aStream nextPutAll: '#encoding'; + space; + nextPutAll: encoderString; + cr; + cr. +! + +printLanguage: lang on: aStream + +self printEncoderFor: lang on: aStream. +self printEditingWarningOn: aStream. +self printLanguageMappingsFor: lang on: aStream. +! + +printLanguageMappingsFor: lang on: aStream + +|languageMappings maxKeySize| + +languageMappings := keyStringsToLanguageMappings atLanguage: lang. + +maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang. +maxKeySize := maxKeySize + 10. "adds the separator between key and value" + +languageMappings keysAndValuesDo:[:key :value | + aStream nextPutAll: (key storeString paddedTo: maxKeySize) ; + nextPutAll: value storeString; + cr. + ]. +! + +readResourceFile:aFilename asLanguage:lang + |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys| + + aFilename exists ifFalse:[^ self ]. + + resourcePack := ResourcePack new. + + inStream := aFilename readStream. + [inStream atEnd] whileFalse:[ + lineString := inStream nextLine. + (lineString notEmpty + 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. + + sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection. + remainingKeys := resourcePack keys select:[:k | k isString not]. + + keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename. + keyStringsToLanguageMappings atLanguage: lang putEncoder: decoder. + + sortedKeys do:[:k | + keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) + ]. + remainingKeys do:[:k | + keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) + ]. +! + +saveResourceFile: aFilename for: lang + +|aStream | + +aStream := FileStream fileNamed: aFilename. +self printLanguage: lang on: aStream. +aStream flush; + close. +DialogBox information: 'The resource file for the language ', lang printString storeString, ' was saved in the file: ', aFilename nameString ! ! !InternationalLanguageTranslationEditor methodsFor:'specs-dynamic'! @@ -1355,11 +1557,17 @@ !InternationalLanguageTranslationEditor methodsFor:'user actions'! +exampleLanguageSelectionChanged + + self updateExampleLanguageText. +! + selectionChanged self updateOriginalTextModification. self updateLanguageTextModification. self updateLanguageAndKeySelection. + self updateExampleLanguageText. self originalTextModifiedHolder value:false. self languageTextModifiedHolder value:false. @@ -1421,6 +1629,36 @@ (self rowForKey:aKey) changed ! +atLanguage: lang putEncoder: aDecoder + +^(self languageInfoAt: lang) at: self encoderKey put: aDecoder +! + +atLanguage: lang putFilename: aFilename + +^(self languageInfoAt: lang) at: self fileNameKey put: aFilename +! + +decoderKey + ^#decoder +! + +encoderAt:lang + ^ (self languageInfoAt:lang) at: self encoderKey ifAbsent:[nil] +! + +encoderKey + ^#encoder +! + +fileNameKey + ^ #filename +! + +filenameAt:lang + ^ (self languageInfoAt:lang) at: self fileNameKey ifAbsent:[nil] +! + keyAt:index ^ keys at:index. ! @@ -1433,10 +1671,23 @@ ^ keys ! +languageInfoAt: lang + +^self perLanguageInfo at: lang ifAbsentPut:[Dictionary new] +! + languages ^ languages ! +perLanguageInfo + ^ perLanguageInfo +! + +perLanguageInfo:something + perLanguageInfo := something. +! + removeKey:aKey keys remove:aKey ifAbsent:[]. perLanguageMappings do:[:eachMapping | @@ -1472,7 +1723,7 @@ keys := OrderedSet new. languages := OrderedCollection new. perLanguageMappings := Dictionary new. - perLanguageInfo := Dictionary new. + perLanguageInfo := Dictionary new. rowPerKey := Dictionary new. self addLanguage:#'de'. @@ -1540,6 +1791,14 @@ indexOfKey:aKey ^ keys indexOf:aKey +! + +maxKeySizeForLanguage: lang + +^(self atLanguage: lang) keys inject: 0 into:[:maxSize :each | + maxSize < each size + ifTrue:[each size] + ifFalse:[maxSize].]. ! ! !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'!