'From etoys2.2 of 25 September 2007 [latest update: #1710] on 17 October 2007 at 1:36:58 pm'! "Change Set: gettextRT1-KR Date: 17 October 2007 Author: Korakurider NaturalLanguageTranslator2 is new language translation framework introducing the concept of translation domain (i.e. textdomain of gettext). While this is intended to replace the legacy NaturalLanguageTranslator, interim NaturalLanguageTranslatorWrapper is provided for migration. GetTextTranslator is emulation stuff of gettext runtime. "! TestCase subclass: #GetTextTranslatorTest instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'GetText-RuntimeEmuation'! Object subclass: #MOFile instanceVariableNames: 'localeID fileName isLittleEndian magic revision nStrings originalTableOffset translatedTableOffset hashTableSize hashTableOffset hashTable originalStrings translatedStrings translations' classVariableNames: '' poolDictionaries: '' category: 'GetText-RuntimeEmuation'! !MOFile commentStamp: '' prior: 0! Wrapper for MO file of gettext. Known limitation: currently don't support prural form. translation strings have to be encoded in utf-8. Implementation notes: Testing on XO showed emulation of hash search without plugin + on demand loading is slow. The test also showed conversion of utf8 string to Squeak's String is really slow (especially for non-latin language). so in this version, all of original/translated strings are loaded on initiaization, but "translated strings" is left as ByteString on loading time, to reduce loading time. After that the translated string is converted on demand. ! Object subclass: #NaturalLanguageTranslator2 instanceVariableNames: 'id' classVariableNames: 'CachedTranslators Initialized' poolDictionaries: '' category: 'System-Localization'! !NaturalLanguageTranslator2 commentStamp: '' prior: 0! abstract class of natural language translator. Class side manages and holds loaded instances of concrete classes.! NaturalLanguageTranslator2 subclass: #GetTextTranslator instanceVariableNames: 'moFiles' classVariableNames: 'LocaleDirsForDomain UserDefaultLocaleDirs' poolDictionaries: '' category: 'GetText-RuntimeEmuation'! !GetTextTranslator commentStamp: '' prior: 0! emulation of gettext runtime Known limitation: currently don't support prural form. ! NaturalLanguageTranslator2 subclass: #NaturalLanguageTranslatorWrapper instanceVariableNames: 'translator' classVariableNames: '' poolDictionaries: '' category: 'System-Localization'! !NaturalLanguageTranslatorWrapper commentStamp: '' prior: 0! wrapper of legacy NaturalLanguageTranslator. By this lgacy translator stuff can coexists within new framework.! !GetTextTranslatorTest methodsFor: 'testing' stamp: 'KR 10/17/2007 13:35'! testTranslateAll | translator legacy trn1 trn2| GetTextTranslator availableLocaleIDs do: [:localeID | Transcript show: 'switching to ', (localeID isoString); cr. translator _ GetTextTranslator newForLocaleID: localeID. legacy _ NaturalLanguageTranslator localeID: localeID. legacy translations keys do: [:each | trn1 _ translator translate: each. trn2 _ legacy translate: each. trn1 = each ifFalse: [ "skip phrases not translated yet" "ignore enclosing blanks for now" trn1 _ trn1 withBlanksTrimmed. trn2 _ trn2 withBlanksTrimmed. self assert: (trn1 = trn2). ]. ]. ].! ! !MOFile methodsFor: 'public' stamp: 'KR 10/4/2007 01:46'! fileName ^fileName! ! !MOFile methodsFor: 'public' stamp: 'KR 10/16/2007 19:03'! fileName: path fileName _ path! ! !MOFile methodsFor: 'public' stamp: 'KR 10/16/2007 17:16'! load: aFileName localeID: id "all of original/translated strings are loaded. but conversion of translation string (in utf-8 bytestring) to Squeak format will be defered. original-string/index pairs are registerd to Dictionary on load time. hash search can't be used" | strm originalTable translatedTable | localeID _ id. strm_ FileStream readOnlyFileNamed: aFileName. fileName _ aFileName. [ self loadHeader: strm. originalTable _ self loadStringPointers: strm offset: originalTableOffset. originalStrings _ self loadStrings: strm pointers: originalTable. translatedTable _ self loadStringPointers: strm offset: translatedTableOffset. translatedStrings _ self loadStrings: strm pointers: translatedTable. translations _ Dictionary new: nStrings * 2. "make too enough room to avoid #grow" 1 to: nStrings do: [:index | | key | key _ originalStrings at: index. translations at: key put: index. ]. originalStrings _ nil. ] ensure: [strm close].! ! !MOFile methodsFor: 'public' stamp: 'KR 10/5/2007 01:41'! searchByDictionary: aString | index | index _ translations at: aString ifAbsent: [^nil]. ^self translatedString: index ! ! !MOFile methodsFor: 'public' stamp: 'KR 10/17/2007 03:18'! translationFor: aString | trans | trans _ self searchByDictionary: aString. trans isNil ifTrue: [^aString] ifFalse: [^trans]. ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/4/2007 00:29'! loadHeader: strm strm binary. magic _ strm uint32. magic = 16rDE120495 ifTrue: [isLittleEndian _ true] ifFalse: [ magic = 16r950412DEC ifTrue: [isLittleEndian _ false] ifFalse: [ self error: 'invalid MO'] ]. revision _ self nextInt32From: strm. nStrings _ self nextInt32From: strm. originalTableOffset _ self nextInt32From: strm. translatedTableOffset _ self nextInt32From: strm. hashTableSize _ self nextInt32From: strm. hashTableOffset _ self nextInt32From: strm. ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/16/2007 13:31'! loadStringPointers: strm offset: tableOffset "returns tupple {arrayOfOffsetToString arrayOfLengthOfString}" | offsetTable lenTable len offset tupple | offsetTable _ IntegerArray new: nStrings. lenTable _ IntegerArray new: nStrings. strm binary. strm position: tableOffset. 1 to: nStrings do: [:index | len _ self nextInt32From: strm. offset _ self nextInt32From: strm. offsetTable at: index put: offset. lenTable at: index put: len. ]. tupple _ Array new: 2. tupple at: 1 put: offsetTable. tupple at: 2 put: lenTable. ^tupple ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/16/2007 17:08'! loadStrings: strm pointers: table ^self loadStrings: strm pointers: table encoding: nil languageEnvironment: nil ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/16/2007 16:56'! loadStrings: strm pointers: tupple encoding: encodingName languageEnvironment: env | strings rawStr str offsetTable lenTable | offsetTable _ tupple first. lenTable _ tupple second. strings _ Array new: nStrings. 1 to: nStrings do: [:index | rawStr _ self loadString: strm pointer: (offsetTable at: index) length: (lenTable at: index). str _ encodingName isNil ifTrue: [rawStr] ifFalse: [ encodingName = 'utf8' ifTrue: [rawStr utf8ToSqueak applyLanguageInfomation: env] ifFalse: [self error: 'this encoding isn''t supported'] ]. strings at: index put: str. ]. ^strings.! ! !MOFile methodsFor: 'private' stamp: 'KR 10/11/2007 23:24'! loadString: strm pointer: top length: len | str | str _ ByteString new: len. strm position: top. strm nextInto: str. ^str. ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/4/2007 00:27'! nextInt32From: strm ^isLittleEndian ifTrue: [^strm nextLittleEndianNumber: 4] ifFalse: [^strm nextInt32]! ! !MOFile methodsFor: 'private' stamp: 'KR 10/16/2007 13:41'! originalString: index ^originalStrings at: index. ! ! !MOFile methodsFor: 'private' stamp: 'KR 10/17/2007 13:16'! translatedString: index "KNOWN PROBLEM: conversion is executed everytimes this method called" | str | str _ translatedStrings at: index. ^str utf8ToSqueak applyLanguageInfomation: (Locale localeID: localeID) languageEnvironment. ! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/4/2007 00:18'! hashPjw: aString "So called `hashpjw' function by P.J. Weinberger [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, 1986, 1987 Bell Telephone Laboratories, Inc.] " | stringSize hash g | stringSize _ aString size. hash _ 0. 1 to: stringSize do: [:pos | hash _ hash bitShift: 4. hash _ hash + ((aString at: pos) asInteger). g _ hash bitAnd: 16rF0000000. g = 0 ifFalse: [ hash _ hash bitXor: (g bitShift: -24). hash _ hash bitXor: g. ] ]. ^hash. ! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/16/2007 17:40'! load1: aFileName localeID: id "CASE1: all of strings are loaded. translation strings are converted to Squeak format on load time. original-string/index pairs are registerd to Dictionary on load time. hash search can't be used" | strm originalTable translatedTable | localeID _ id. strm_ FileStream readOnlyFileNamed: aFileName. fileName _ aFileName. [ self loadHeader: strm. originalTable _ self loadStringPointers: strm offset: originalTableOffset. originalStrings _ self loadStrings: strm pointers: originalTable. translatedTable _ self loadStringPointers: strm offset: translatedTableOffset. translatedStrings _ self loadStrings: strm pointers: translatedTable encoding: 'utf8' languageEnvironment: (Locale localeID: localeID) languageEnvironment . translations _ Dictionary new. 1 to: nStrings do: [:index | | key | key _ originalStrings at: index. translations at: key put: index. ]. originalTable _ nil. ] ensure: [strm close].! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/16/2007 17:33'! load4: aFileName localeID: id "CASE4: all of strings are loaded. loading and conversion of translation strings to Squeak format is executed on initialization time. only hash search can be used" | strm originalTable translatedTable | localeID _ id. strm_ FileStream readOnlyFileNamed: aFileName. fileName _ aFileName. [ self loadHeader: strm. self loadHashTable: strm. originalTable _ self loadStringPointers: strm offset: originalTableOffset. originalStrings _ self loadStrings: strm pointers: originalTable. translatedTable _ self loadStringPointers: strm offset: translatedTableOffset. translatedStrings _ self loadStrings: strm pointers: translatedTable encoding: 'utf-8' languageEnvironment: (Locale localeID: localeID) languageEnvironment . ] ensure: [strm close].! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/4/2007 00:27'! loadHashTable: strm | entry | hashTable _ IntegerArray ofSize: hashTableSize. strm binary. strm position: hashTableOffset. 1 to: hashTableSize do: [:index | entry _ self nextInt32From: strm. hashTable at: index put: entry. ]! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/5/2007 01:43'! searchByHash: aString | hashValue nstr index incr key | hashValue _ self hashPjw: aString. incr _ 1 + (hashValue \\ (hashTableSize -2)). index _ (hashValue \\ hashTableSize) . [ nstr _ (hashTable at: index +1 ). nstr = 0 ifTrue: [^nil]. key _ self originalString: nstr. key = aString ifTrue: [^self translatedString: nstr]. index >= (hashTableSize - incr) ifTrue: [index _ index - (hashTableSize - incr) ] ifFalse:[index _ index + incr]. ] doWhileTrue: true.! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/5/2007 02:24'! testSearchByDictionary NaturalLanguageTranslator allKnownPhrases do: [:each | self searchByDictionary: each ]. ! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/5/2007 02:23'! testSearchByHash NaturalLanguageTranslator allKnownPhrases do: [:each | self searchByHash: each ]. ! ! !MOFile methodsFor: 'experimental' stamp: 'KR 10/5/2007 02:02'! translateByHash: aString | trans | trans _ self searchByHash: aString. trans isNil ifTrue: [^aString] ifFalse: [^trans]. ! ! !MOFile class methodsFor: 'instance creation' stamp: 'KR 10/16/2007 19:05'! fileName: path localeID: id ^self new load:path localeID: id! ! !NaturalLanguageTranslator2 methodsFor: 'initialize-release' stamp: 'KR 10/15/2007 12:50'! localeID: anID id := anID! ! !NaturalLanguageTranslator2 methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:49'! displayLanguage ^ id displayLanguage! ! !NaturalLanguageTranslator2 methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:50'! displayName ^ id displayName! ! !NaturalLanguageTranslator2 methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:50'! isoCountry ^self localeID isoCountry! ! !NaturalLanguageTranslator2 methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:50'! isoLanguage ^self localeID isoLanguage! ! !NaturalLanguageTranslator2 methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:48'! localeID ^id! ! !NaturalLanguageTranslator2 methodsFor: 'language switching' stamp: 'KR 10/17/2007 01:57'! setCurrent "notify locale of the translator become current" ! ! !NaturalLanguageTranslator2 methodsFor: 'translation' stamp: 'KR 10/17/2007 01:34'! translate: aString ^self translate: aString inDomain: TextDomainManager defaultDomain! ! !NaturalLanguageTranslator2 methodsFor: 'translation' stamp: 'KR 10/17/2007 01:37'! translate: aString inDomain: aDomainName "returns original phrase if translation isn't registered" ^(self translationFor: aString inDomain: aDomainName) ifNil: [aString] ! ! !NaturalLanguageTranslator2 methodsFor: 'translation' stamp: 'KR 10/17/2007 02:52'! translationFor: aString inDomain: aDomainName "returns nil if translation isn't registered" "self subclassresponsibility" ^nil! ! !GetTextTranslator methodsFor: 'private' stamp: 'KR 10/17/2007 03:20'! loadMOFileForDomain: aDomainName | moName | moName _ self class findMOForLocaleID: self localeID domain: aDomainName. moName notNil ifTrue: [^MOFile new load: moName localeID: self localeID] ifFalse: [^nil] ! ! !GetTextTranslator methodsFor: 'private' stamp: 'KR 10/3/2007 19:46'! moFileForDomain: domainName ^moFiles at: domainName ifAbsentPut: [self loadMOFileForDomain: domainName]! ! !GetTextTranslator methodsFor: 'accessing' stamp: 'KR 10/16/2007 20:58'! loadMOFiles TextDomainManager allKnownDomains do: [:domainName | self moFileForDomain: domainName ].! ! !GetTextTranslator methodsFor: 'accessing' stamp: 'KR 10/5/2007 00:39'! reloadMOFiles moFiles _ Dictionary new. self loadMOFiles.! ! !GetTextTranslator methodsFor: 'initialize-release' stamp: 'KR 10/3/2007 19:43'! initialize moFiles _ Dictionary new.! ! !GetTextTranslator methodsFor: 'translation' stamp: 'KR 10/17/2007 03:18'! translationFor: aString inDomain: domainName | mo | mo _ self moFileForDomain: domainName. ^mo isNil ifTrue: [aString] ifFalse: [mo translationFor: aString] ! ! !GetTextTranslator methodsFor: 'language switching' stamp: 'KR 10/17/2007 02:00'! setCurrent "ensure actual contents of MOs is loaded on switching language" self loadMOFiles! ! !NaturalLanguageTranslator2 class methodsFor: 'class initialization' stamp: 'KR 10/15/2007 19:15'! importLegacyTranslators NaturalLanguageTranslator availableLanguageLocaleIDs do: [:each|]. ! ! !NaturalLanguageTranslator2 class methodsFor: 'class initialization' stamp: 'KR 10/15/2007 19:03'! initialize Smalltalk addToStartUpList: NaturalLanguageTranslator2 after: NaturalLanguageTranslator. ! ! !NaturalLanguageTranslator2 class methodsFor: 'class initialization' stamp: 'KR 10/17/2007 02:03'! startUp: resuming resuming ifFalse: [^ self]. self resetCaches. GetTextTranslator loadAvailableTranslators. NaturalLanguageTranslatorWrapper mergeLegacyTranslators. self localeChanged: LocaleID current.! ! !NaturalLanguageTranslator2 class methodsFor: 'translation' stamp: 'KR 10/17/2007 01:43'! translate: aString toLocaleID: localeID ^self translate: aString toLocaleID: localeID inDomain: TextDomainManager defaultDomain ! ! !NaturalLanguageTranslator2 class methodsFor: 'translation' stamp: 'KR 10/15/2007 14:00'! translate: aString toLocaleID: localeID inDomain: aDomainName ^ (self availableForLocaleID: localeID) translate: aString inDomain: aDomainName! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:58'! availableForLocaleID: localeID "Answer available locale ID. If translator is not found for correct locale ID, then isoLanguage is attempted for the key." ^ self cachedTranslators at: localeID ifAbsent: [localeID hasParent ifTrue: [self cachedTranslators at: localeID parent ifAbsent: [self default]] ifFalse: [self default]]! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:57'! availableLanguageLocaleIDs "Return the locale ids for the currently available languages. Meaning those which either internally or externally have translations available." "NaturalLanguageTranslator2 availableLanguageLocaleIDs" ^ CachedTranslators values collect:[:each | each localeID]! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:56'! cachedTranslators "CachedTranslators := nil" ^CachedTranslators ifNil: [CachedTranslators := Dictionary new] ! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:58'! current ^ self availableForLocaleID: LocaleID current! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:59'! default "Answer translator for backstop" "self default translate: 'test'" ^ self new localeID: (LocaleID isoLanguage: 'en')! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 19:08'! initialized ^Initialized! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/17/2007 01:51'! localeChanged: localeID "notify some project starts to use this locale. this facility may use the event to load translation data dynamically" ! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 12:59'! removeLocaleID: localeID "self removeLocaleID: (LocaleID isoString: 'ja-kids')" ^ self cachedTranslators removeKey: localeID ifAbsent: []! ! !NaturalLanguageTranslator2 class methodsFor: 'accessing' stamp: 'KR 10/15/2007 19:21'! resetCaches CachedTranslators := nil.! ! !GetTextTranslator class methodsFor: 'instance creation' stamp: 'KR 10/16/2007 20:56'! newForLocaleID: id ^self new localeID: id! ! !GetTextTranslator class methodsFor: 'accessing translator' stamp: 'KR 10/16/2007 20:26'! availableLocaleIDs | ids dirs localeDirForLang| ids _ Set new. dirs _ Set new. dirs addAll: LocaleDirsForDomain values. dirs addAll: self defaultLocaleDirs. dirs do: [:dir | | localesDir | localesDir _ FileDirectory on: dir. localesDir directoryNames do: [:langDirName | | localeID | localeID _ LocaleID isoString: langDirName. localeDirForLang _ localesDir directoryNamed: (self langDirNameForLocaleID: localeID). localeDirForLang ifNotNil: [ (localeDirForLang fileNamesMatching: '*.mo') ifNotEmpty: [ids add: localeID] ] ]. ]. ^ids! ! !GetTextTranslator class methodsFor: 'accessing translator' stamp: 'KR 10/17/2007 01:27'! loadAvailableTranslators self availableLocaleIDs do: [ :localeID | NaturalLanguageTranslator2 cachedTranslators at: localeID put: (self newForLocaleID: localeID). ]! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:38'! defaultLocaleDirs | dirs | dirs _ OrderedCollection new. UserDefaultLocaleDirs ifNotNil: [dirs addAll: UserDefaultLocaleDirs]. dirs addAll: self systemDefaultLocaleDirs. ^dirs ! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:29'! localeDirForDomain: aDomainName "returns registered localeDirectory for the textdomain. returns nil if not registered" ^LocaleDirsForDomain at: aDomainName ifAbsent: [nil]! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:30'! localeDirsForDomain: aDomainName "returns collection of locale directories for text domain. This includes user defined one for the domain, user defaults and system defaults" | dirs dir | dirs _ OrderedCollection new. dir _ self localeDirForDomain: aDomainName. dir ifNotNil: [dirs add: dir]. dirs addAll: self defaultLocaleDirs. ^dirs! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:50'! setLocaleDir: path forDoamin: aDomainName self LocaleDirsForDomain at: aDomainName put: path.! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:13'! systemDefaultLocaleDirs | dirs sepa localesDirName | sepa _ FileDirectory slash. dirs _ OrderedCollection new. localesDirName _ 'locales'. dirs add: (SmalltalkImage current imagePath) , sepa , localesDirName. dirs add: (SmalltalkImage current vmPath) , sepa , localesDirName. ^dirs! ! !GetTextTranslator class methodsFor: 'translation data layout' stamp: 'KR 10/16/2007 20:40'! userDefaultLocaleDirs ^UserDefaultLocaleDirs ifNil: [UserDefaultLocaleDirs := OrderedCollection new] ! ! !GetTextTranslator class methodsFor: 'private' stamp: 'KR 10/16/2007 20:20'! findMOForLocaleID: id domain: aDomainName | sepa langSubDir path | sepa _ FileDirectory slash. langSubDir _ self langDirNameForLocaleID: id. (self localeDirsForDomain: aDomainName) do: [:each | path _ each , sepa , langSubDir, sepa , (self moNameForDomain: aDomainName). (FileDirectory default fileExists: path) ifTrue: [^path] ]. ^nil.! ! !GetTextTranslator class methodsFor: 'private' stamp: 'KR 10/16/2007 20:32'! langDirNameForLocaleID: id "returns relative path from locale directory to actual directory containing MOs" ^(id posixName) , (FileDirectory slash) , 'LC_MESSAGES'! ! !GetTextTranslator class methodsFor: 'private' stamp: 'KR 10/16/2007 20:36'! localeDirsForDomain ^LocaleDirsForDomain ifNil: [LocaleDirsForDomain _ Dictionary new]! ! !GetTextTranslator class methodsFor: 'private' stamp: 'KR 10/16/2007 19:40'! moNameForDomain: domainName ^domainName , '.mo'! ! !GetTextTranslator class methodsFor: 'class initialization' stamp: 'KR 10/16/2007 20:07'! initialize UserDefaultLocaleDirs _ OrderedCollection new. LocaleDirsForDomain _ Dictionary new.! ! !NaturalLanguageTranslatorWrapper methodsFor: 'translation' stamp: 'KR 10/15/2007 18:19'! translate: aString inDomain: aDomainName ^translator translate: aString! ! !NaturalLanguageTranslatorWrapper methodsFor: 'translation' stamp: 'KR 10/15/2007 18:23'! translationFor: aString inDomain: aDomainName ^translator translationFor: aString! ! !NaturalLanguageTranslatorWrapper methodsFor: 'initialize-release' stamp: 'KR 10/15/2007 18:14'! translator: aTranslator translator _ aTranslator! ! !NaturalLanguageTranslatorWrapper class methodsFor: 'instance creation' stamp: 'KR 10/17/2007 01:46'! newForLocaleID: aLocaleID ^self new translator: (NaturalLanguageTranslator localeID: aLocaleID); localeID: aLocaleID.! ! !NaturalLanguageTranslatorWrapper class methodsFor: 'class initialization' stamp: 'KR 10/15/2007 19:20'! importAllLegacyTranslators NaturalLanguageTranslator availableLanguageLocaleIDs do: [:each| self importLegacyTranslator: each]. ! ! !NaturalLanguageTranslatorWrapper class methodsFor: 'class initialization' stamp: 'KR 10/17/2007 01:47'! importLegacyTranslator: localeID NaturalLanguageTranslator2 cachedTranslators at: localeID put: (self newForLocaleID: localeID).! ! !NaturalLanguageTranslatorWrapper class methodsFor: 'class initialization' stamp: 'KR 10/17/2007 02:10'! mergeLegacyTranslators NaturalLanguageTranslator availableLanguageLocaleIDs do: [:each| NaturalLanguageTranslator2 cachedTranslators at: each ifAbsent: [self importLegacyTranslator: each]] ! ! !TextDomainManager class methodsFor: 'accessing' stamp: 'KR 10/5/2007 00:36'! allKnownDomains | domains | domains _ Set new. domains addAll: ClassCategories values. domains add: self defaultDomain. ^domains ! ! !NaturalLanguageTranslatorWrapper class reorganize! ('instance creation' newForLocaleID:) ('accessing') ('class initialization' importAllLegacyTranslators importLegacyTranslator: mergeLegacyTranslators) ! GetTextTranslator initialize! NaturalLanguageTranslator2 initialize! !GetTextTranslatorTest reorganize! ('testing' testTranslateAll) !