2.0
authorfm
Thu, 08 Jun 2006 16:00:28 +0200
changeset 2050 998f72439bfc
parent 2049 d10762e5d924
child 2051 88d16a7d0bd9
2.0
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
     "
 
     <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'!