Tools__InternationalLanguageTranslationEditor.st
changeset 2051 88d16a7d0bd9
parent 2050 998f72439bfc
child 2053 8440fcd83b7b
--- a/Tools__InternationalLanguageTranslationEditor.st	Thu Jun 08 16:00:28 2006 +0200
+++ b/Tools__InternationalLanguageTranslationEditor.st	Tue Jun 13 17:52:42 2006 +0200
@@ -14,7 +14,8 @@
 		inSingleFileMode lastExtractedProject lastLanguage
 		lastSelectedKey autoAcceptHolder languageEditor
 		selectedColIndexHolder exampleLanguageSelectionHolder
-		exampleLanguageTextHolder'
+		exampleLanguageTextHolder pastePreviousTranslationEnableHolder
+		searchForSimilarTranslationEnableHolder'
 	classVariableNames:'LastExtractedClass LastExtractedApplicationClass
 		LastExtractedProject'
 	poolDictionaries:''
@@ -114,7 +115,7 @@
           name: 'InternationalLanguageTranslationEditor'
           min: (Point 10 10)
           max: (Point 1024 768)
-          bounds: (Rectangle 0 0 609 482)
+          bounds: (Rectangle 0 0 780 616)
           menu: mainMenu
         )
         component: 
@@ -179,7 +180,7 @@
                          (SpecCollection
                             collection: (
                              (LabelSpec
-                                label: 'Select Another Traduction as example:'
+                                label: 'Select Another Language as example:'
                                 name: 'Label3'
                                 layout: (LayoutFrame 0 0 -6 0 0 1 24 0)
                                 translateLabel: true
@@ -198,7 +199,7 @@
                               )
                              (TextEditorSpec
                                 name: 'ExampleLanguageText'
-                                layout: (LayoutFrame 0 0 25 0 611 0 66 0)
+                                layout: (LayoutFrame 0 0 30 0 0 1 0 1)
                                 model: exampleLanguageTextHolder
                                 hasHorizontalScrollBar: true
                                 hasVerticalScrollBar: true
@@ -231,6 +232,15 @@
                                 acceptCallBack: languageTextAccepted
                                 postBuildCallback: languageEditorBuilt:
                               )
+                             (ActionButtonSpec
+                                label: 'Paste Previous'
+                                name: 'pastePreviousTranslation'
+                                layout: (LayoutOrigin 0 0.83085250338295 0 0.03448275862069)
+                                translateLabel: true
+                                model: pastePreviousTranslationInLanguageText
+                                enableChannel: pastePreviousTranslationEnableHolder
+                                disabledLogo: 'Paste Previous'
+                              )
                              )
                            
                           )
@@ -413,6 +423,11 @@
                   translateLabel: true
                   indication: autoAcceptHolder
                 )
+               (MenuItem
+                  label: 'Search For Similar Translations'
+                  translateLabel: true
+                  indication: searchForSimilarTranslationEnableHolder
+                )
                )
               nil
               nil
@@ -449,6 +464,36 @@
       )
 !
 
+menuItemsEditLanguage
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#menu
+     (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor menu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            enabled: pastePreviousTranslationEnableHolder
+            label: 'Paste Previous Translation'
+            itemValue: pastePreviousTranslationInLanguageText
+            nameKey: pastePreviousTranslationInLanguageText
+            translateLabel: true
+          )
+         )
+        nil
+        nil
+      )
+!
+
 menuToolBar
     "This resource specification was automatically generated
      by the MenuEditor of ST/X."
@@ -457,8 +502,8 @@
      the MenuEditor may not be able to read the specification."
 
     "
-     MenuEditor new openOnClass:InternationalLanguageTranslationEditor andSelector:#menuToolBar
-     (Menu new fromLiteralArrayEncoding:(InternationalLanguageTranslationEditor menuToolBar)) startUp
+     MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#menuToolBar
+     (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor menuToolBar)) startUp
     "
 
     <resource: #menu>
@@ -468,6 +513,7 @@
         (
          (MenuItem
             label: 'Save'
+            itemValue: menuSave
             translateLabel: true
             labelImage: (ResourceRetriever XPToolbarIconLibrary saveImageIcon)
           )
@@ -570,6 +616,34 @@
     ^ keyStringsToLanguageMappings keyAt:rowSelectionIndex.
 ! !
 
+!InternationalLanguageTranslationEditor methodsFor:'additionalFuncionalities'!
+
+searchForSimilarTranslation
+"Looks for a quite similar translation for the key and display a dialog with available options"
+|similarTranslationsAssociations selectedTranslation|
+
+self shouldSearchForSimilarTranslation ifFalse:[^self]. 
+
+similarTranslationsAssociations := keyStringsToLanguageMappings searchForSimilarTranslation: self selectedKey in: self currentLanguage.
+similarTranslationsAssociations isEmpty ifTrue:[^self].    
+
+similarTranslationsAssociations := similarTranslationsAssociations associations inject: OrderedCollection new into:[:collection :association |
+    collection detect:[:selectedAssociation |
+        selectedAssociation value sameAs: association value] ifNone:[collection add: association].
+    collection].
+selectedTranslation := Dialog 
+    choose:'Choose one if you consider itīs usefull to translate: 
+', 
+    '<', self selectedKey, '>  ',
+    self currentExampleLanguageText
+    fromList: (similarTranslationsAssociations collect:[:each |  '<', each key, '>  ', each value])
+    values: (similarTranslationsAssociations collect:[:each | each value])
+    lines:10
+    cancel: nil.      
+
+selectedTranslation notNil ifTrue:[self languageTextHolderValue: selectedTranslation]. 
+! !
+
 !InternationalLanguageTranslationEditor methodsFor:'aspects'!
 
 autoAcceptHolder
@@ -642,11 +716,6 @@
     ^ languageTextAcceptHolder.
 !
 
-languageTextAccepted                                   
-
-self selectedKeyRow value: self selectedKeyRow value + 1.
-!
-
 languageTextHolder
     languageTextHolder isNil ifTrue:[
         languageTextHolder := '' asValue.
@@ -682,6 +751,17 @@
     ^ originalTextModifiedHolder.
 !
 
+pastePreviousTranslationEnableHolder
+   pastePreviousTranslationEnableHolder isNil ifTrue:[pastePreviousTranslationEnableHolder := false asValue]. 
+    ^ pastePreviousTranslationEnableHolder
+!
+
+searchForSimilarTranslationEnableHolder
+   searchForSimilarTranslationEnableHolder isNil 
+        ifTrue:[searchForSimilarTranslationEnableHolder := true asValue]. 
+    ^ searchForSimilarTranslationEnableHolder
+!
+
 selectedKeyRow
     selectedKeyRow isNil ifTrue:[
         selectedKeyRow := ValueHolder new.
@@ -693,6 +773,7 @@
 showMissingTranslationsOnly
     showMissingTranslationsOnly isNil ifTrue:[
         showMissingTranslationsOnly := false asValue.
+        showMissingTranslationsOnly onChangeSend:#showMissingTranslationsOnlyChanged to:self.
     ].
     ^ showMissingTranslationsOnly.
 !
@@ -715,6 +796,12 @@
 
 !InternationalLanguageTranslationEditor methodsFor:'change & update'!
 
+languageTextHolderValue: aString
+
+self languageTextHolder value: aString.
+self languageTextModifiedHolder value:true.
+!
+
 update:something with:aParameter from:changedObject
     changedObject == shownLanguages ifTrue:[
          self shownLanguagesChanged.
@@ -727,7 +814,16 @@
     changedObject == exampleLanguageSelectionHolder ifTrue:[
         self updateExampleLanguageText.
         ^ self.
-    ].
+    ].    
+    changedObject == showMissingTranslationsOnly ifTrue:[
+        self showMissingTranslationsOnlyChanged.
+        ^ self.
+    ]. 
+!
+
+updateCopyPreviousTranslationButtonEnabled
+
+ self pastePreviousTranslationEnableHolder value: self shouldCopyPreviousTranslationButtonBeEnabled
 !
 
 updateExampleLanguageText
@@ -746,14 +842,9 @@
 
 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.
+    self languageTextHolder value: (self languageTextFromSelectedKeyFor: self currentLanguage).
+    lastLanguage := self currentLanguage.
     lastSelectedKey := self selectedKey. 
 !
 
@@ -790,9 +881,34 @@
 
 !InternationalLanguageTranslationEditor methodsFor:'dialogs'!
 
-requestEncoderString
+requestEncoderDialog
+
+   |box val characterCollection|
 
-    ^Dialog request:'Enter the encoder : '. 
+    val := '' asValue.
+    box := Dialog new.
+    (box addTextLabel:'Select or write the encoder') adjust:#left.
+    box addVerticalSpace.
+    characterCollection := CharacterEncoder supportedExternalEncodings 
+        inject: OrderedCollection new
+        into:[:collection :each |
+            collection add: each first;
+                        yourself].
+    (box addComboBoxOn:val) list: characterCollection.
+    box addOkButton.
+    box open.
+    ^val value
+!
+
+requestEncoderStringFor: lang
+  "Returns an encoder string and updates the language's info"
+    |encoderString encoder|
+    encoderString := self requestEncoderDialog.
+    encoderString notEmpty ifTrue:[
+        encoder := CharacterEncoder encoderFor: encoderString ifAbsent:nil.
+        encoder notNil ifTrue:[keyStringsToLanguageMappings atLanguage: lang putEncoder: encoder.].
+    ].
+    ^encoderString
 !
 
 requestFilename  
@@ -808,6 +924,20 @@
     ^aFilename asFilename
 !
 
+requestFilenameFor: lang  
+  "Returns a filename to save the language resource and updates the language's info"
+    |aFilename|
+
+    aFilename := Dialog 
+        requestFileName:'Name of resource file to save ', lang asString, ' :'
+        default:nil 
+        pattern:'*.rs'.
+
+    aFilename isEmptyOrNil ifTrue:[^ nil ].
+    keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename.
+    ^aFilename asFilename
+!
+
 requestLanguage
     ^ Dialog 
         choose:'Which language do you want to save?'
@@ -866,13 +996,13 @@
     |key index|
 
     key := Dialog request:'New Key:'.
+    key isEmpty ifTrue:[^self].
     (keyStringsToLanguageMappings includesKey:key) ifFalse:[
         keyStringsToLanguageMappings addKey:key.
         modified := true.
     ].
-    index := keyStringsToLanguageMappings indexOfKey:key.
-
-    self selectedKeyRow value:index
+   index := keyStringsToLanguageMappings indexOfKey:key.
+   self selectedKeyRow value:index
 !
 
 extractTranslationsFromClass
@@ -1389,6 +1519,14 @@
   ^self languageTextFromSelectedKeyFor: self exampleLanguageSelectionHolder value
 !
 
+currentLanguage
+
+|colSelectionIndex |
+
+    colSelectionIndex := dataSetView selectedColIndex.
+    ^colSelectionIndex > 1 ifTrue:[ shownLanguages at:colSelectionIndex-1 ] ifFalse:nil.
+!
+
 exampleLanguageByDefault
 
 ^self shownLanguages isEmpty
@@ -1396,15 +1534,49 @@
     ifFalse:[self shownLanguages first]
 !
 
+hasFirstRowSelection
+    self selectedKeyRow isNil ifTrue:[^false].
+    ^ self selectedKeyRow value > 1
+!
+
+hasLanguageSelection
+    dataSetView selectedColIndex isNil ifTrue:[^false].
+    ^ dataSetView selectedColIndex > 1
+!
+
 hasUnsavedChanges
     ^ modified
 !
 
+isSearchForSimilarTranslationEnabled
+
+^self searchForSimilarTranslationEnableHolder value
+!
+
+languageTextFromKey: aKeyIndex for: language
+    "Returns the language text corresponding for the aKeyIndex and the received language"    
+
+    language isNil ifTrue:[^''].
+    ^keyStringsToLanguageMappings at: aKeyIndex language:language.   
+!
+
 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.   
+    ^self languageTextFromKey: self selectedKey for: language 
+!
+
+shouldCopyPreviousTranslationButtonBeEnabled
+    ^ self hasLanguageSelection 
+        and:[self hasFirstRowSelection]
+!
+
+shouldSearchForSimilarTranslation
+
+self isSearchForSimilarTranslationEnabled ifFalse:[^false].
+(self languageTextHolder value notNil and:[self languageTextHolder value notEmpty]) ifTrue:[^false].
+(self hasLanguageSelection and:[self selectedKeyRow notNil]) ifFalse:[^false].
+^true
 ! !
 
 !InternationalLanguageTranslationEditor methodsFor:'read/write resourceFile'!
@@ -1420,6 +1592,7 @@
         nextPutAll: '; DONT EDIT this file with an old vi !!';
         cr;
         nextPutAll: ';';
+        cr; 
         cr.
 !
 
@@ -1428,7 +1601,7 @@
 
 characterEncoder := keyStringsToLanguageMappings encoderAt: lang.
 encoderString := characterEncoder isNil 
-    ifTrue:[self requestEncoderString]
+    ifTrue:[self requestEncoderStringFor: lang]
     ifFalse:[characterEncoder nameOfEncoding printString].
 
 aStream nextPutAll: '#encoding';
@@ -1447,16 +1620,16 @@
 
 printLanguageMappingsFor: lang on: aStream
 
-|languageMappings maxKeySize|   
+|orderedAssociations maxKeySize|   
 
-languageMappings := keyStringsToLanguageMappings atLanguage: lang.
+orderedAssociations := keyStringsToLanguageMappings orderedLanguageMappingsAssociationsFor: lang. 
 
-maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang.  
-maxKeySize := maxKeySize + 10.                  "adds the separator between key and value"
+maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang.     
 
-languageMappings keysAndValuesDo:[:key :value |
-    aStream nextPutAll: (key storeString paddedTo: maxKeySize) ;  
-        nextPutAll: value storeString;
+orderedAssociations do:[:association |
+    aStream nextPutAll: (association key storeString paddedTo: maxKeySize) ; 
+        nextPutAll: (String new: 10);
+        nextPutAll: association value storeString;
         cr.
     ].
 !
@@ -1510,7 +1683,8 @@
 
 |aStream |
 
-aStream := FileStream fileNamed: aFilename.  
+keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename.
+aStream := FileStream newFileNamed: aFilename.  
 self printLanguage: lang on: aStream.
 aStream flush;
         close.
@@ -1562,6 +1736,28 @@
    self updateExampleLanguageText.
 !
 
+languageTextAccepted                                   
+|nextRowIndex|
+keyStringsToLanguageMappings size = self selectedKeyRow value
+    ifTrue:[ self updateLanguageTextModification.]
+    ifFalse:[ 
+        nextRowIndex := self selectedKeyRow value + 1.
+        self selectedKeyRow value: nextRowIndex].
+!
+
+pastePreviousTranslationInLanguageText
+    "Obtain the text from the previous translation and paste it into the languageTextEditor"
+    
+    | previousLanguageText previousLanguageRow|
+
+    previousLanguageRow := dataSetView at:self selectedKeyRow value - 1
+                ifAbsent:[^self].
+    previousLanguageText := previousLanguageRow atLanguage: self currentLanguage.
+    languageEditor selectAll.
+    languageEditor pasteOrReplace:previousLanguageText.
+    self languageTextModifiedHolder value:true.
+!
+
 selectionChanged                
 
    self updateOriginalTextModification.
@@ -1569,8 +1765,15 @@
    self updateLanguageAndKeySelection.
    self updateExampleLanguageText.
 
+   self updateCopyPreviousTranslationButtonEnabled.
+
    self originalTextModifiedHolder value:false.
    self languageTextModifiedHolder value:false.
+
+   self searchForSimilarTranslation.
+!
+
+showMissingTranslationsOnlyChanged
 !
 
 shownLanguagesChanged
@@ -1615,7 +1818,7 @@
 addLanguage:lang
     (languages includes:lang) ifFalse:[
         languages add:lang.
-        perLanguageMappings at:lang put:(Dictionary new).
+        perLanguageMappings at:lang put:(OrderedDictionary new).
     ]
 !
 
@@ -1660,7 +1863,7 @@
 !
 
 keyAt:index
-    ^ keys at:index.
+    ^ keys at:index ifAbsent:[nil].
 !
 
 keyAt:index ifAbsent:exceptionalValue
@@ -1680,6 +1883,11 @@
     ^ languages
 !
 
+orderedLanguageMappingsAssociationsFor: language
+"Returns a collection of languageMappings associations (alphabetically ordered by keys) "
+^(self atLanguage: language) associations asSortedCollection:[:a :b | a key < b key].
+!
+
 perLanguageInfo
     ^ perLanguageInfo
 !
@@ -1796,9 +2004,24 @@
 maxKeySizeForLanguage: lang
 
 ^(self atLanguage: lang) keys inject: 0 into:[:maxSize :each |
-    maxSize < each size 
+    (maxSize < each size and:[each size < 100])
         ifTrue:[each size]
         ifFalse:[maxSize].].
+!
+
+searchForSimilarTranslation: aKey in: language
+"Returns a collection of translation associations that corresponds to a quite similar key comparing with aKey"
+|similarAssociations|
+similarAssociations:= 
+(self mappingAtLanguage: language) associationsSelect:[:each |
+    ((each key sameAs: aKey) 
+        or:[(aKey asUppercase startsWith: each key asUppercase)
+            or:[((each key asUppercase levenshteinTo: aKey asUppercase)/ each key size) < 0.3
+            ]])
+     and:[each value notNil
+            and:[each value notEmpty]]
+].
+^similarAssociations
 ! !
 
 !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'!