--- 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'!