--- 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
"
<resource: #menu>
@@ -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'!