# HG changeset patch # User fm # Date 1150213962 -7200 # Node ID 88d16a7d0bd947a44ea0269c2a80e7d67ad9432d # Parent 998f72439bfc2d207dbec48c393310472a975629 felix' fixes and additions diff -r 998f72439bfc -r 88d16a7d0bd9 Tools__InternationalLanguageTranslationEditor.st --- 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 + " + + + + ^ + #(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 " @@ -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'!