'From Squeakland 3.8.5976 of 25 August 2004 [latest update: #376] on 18 December 2004 at 5:19:39 pm'! "Change Set: TextualTranslationFile Date: 18 December 2004 Author: Takashi Yamamiya - Translation data is always saved as text file (chunk form). - Both binary and text file can be read when loading. - An translation file can also be read by 'file in' operation. " ! !LocaleID methodsFor: 'printing' stamp: 'tak 11/15/2004 12:45'! storeOn: aStream aStream nextPut: $(. aStream nextPutAll: self class name. aStream nextPutAll: ' isoString: '. aStream nextPutAll: '''' , self printString , ''''. aStream nextPut: $). ! ! !NaturalLanguageTranslator methodsFor: 'translation' stamp: 'yo 8/2/2004 12:27'! rawPhrase: phraseString translation: translationString self generics at: phraseString put: translationString asString. ! ! !NaturalLanguageTranslator methodsFor: 'translation' stamp: 'yo 8/1/2004 01:07'! removeTranslationFor: phraseString self generics removeKey: phraseString ifAbsent: []. self changed: #translations. self changed: #untranslated.! ! !NaturalLanguageTranslator methodsFor: 'private store-retrieve' stamp: 'yo 7/30/2004 13:00'! loadFromFileNamed: fileNameString "Load translations from an external file" | stream | [stream := FileStream readOnlyFileNamed: fileNameString. self loadFromStream: stream] ensure: [stream close]. self changed: #translations. self changed: #untranslated. ! ! !NaturalLanguageTranslator methodsFor: 'private store-retrieve' stamp: 'tak 11/16/2004 12:37'! loadFromRefStream: stream "Load translations from an external file" | loadedArray refStream | refStream := ReferenceStream on: stream. [loadedArray := refStream next] ensure: [refStream close]. self processExternalObject: loadedArray ! ! !NaturalLanguageTranslator methodsFor: 'private store-retrieve' stamp: 'tak 11/16/2004 12:39'! loadFromStream: stream "Load translations from an external file" | header isFileIn | header := '''Translation dictionary'''. isFileIn := (stream next: header size) = header. stream reset. isFileIn ifTrue: [stream fileInAnnouncing: 'Loading ' , stream localName] ifFalse: [self loadFromRefStream: stream]! ! !NaturalLanguageTranslator methodsFor: 'private store-retrieve' stamp: 'yo 8/2/2004 12:27'! mergeTranslations: newTranslations "Merge a new set of translations into the exiting table. Overwrites existing entries." newTranslations keysAndValuesDo: [:key :value | self rawPhrase: (self class registeredPhraseFor: key) translation: value]. self changed: #translations. self changed: #untranslated.! ! !NaturalLanguageTranslator methodsFor: 'private store-retrieve' stamp: 'tak 11/16/2004 14:39'! saveToFileNamed: fileNameString "save the receiver's translations to a file named fileNameString" | stream | "Set true if you need to save as binary" false ifTrue: [stream := ReferenceStream fileNamed: fileNameString. stream nextPut: {self translations. self untranslated}. stream close]. stream := CrLfFileStream fileNamed: fileNameString. [self fileOutOn: stream] ensure: [stream close]! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 11/16/2004 11:04'! fileOutHeader ^ '''Translation dictionary'''! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 11/28/2004 14:50'! fileOutHeaderOn: aStream aStream nextChunkPut: self fileOutHeader; cr. aStream timeStamp; cr. aStream nextPut: $!!. aStream nextChunkPut: '(' , self class name , ' localeID: ' , id storeString , ')'. aStream cr! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 11/28/2004 14:55'! fileOutOn: aStream "self current fileOutOn: Transcript. Transcript endEntry" self fileOutOn: aStream keys: nil! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 11/28/2004 14:54'! fileOutOn: aStream keys: keys "self current fileOutOn: Transcript. Transcript endEntry" self fileOutHeaderOn: aStream. (keys ifNil: [generics keys asSortedCollection]) do: [:key | self nextChunkPut: (generics associationAt: key) on: aStream]. keys ifNil: [self untranslated do: [:each | self nextChunkPut: each -> '' on: aStream]]. aStream nextPut: $!!; cr! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 11/16/2004 09:26'! nextChunkPut: anObject on: aStream | i remainder terminator | terminator := $!!. remainder := anObject storeString. [(i := remainder indexOf: terminator) = 0] whileFalse: [aStream nextPutAll: (remainder copyFrom: 1 to: i). aStream nextPut: terminator. "double imbedded terminators" remainder := remainder copyFrom: i + 1 to: remainder size]. aStream nextPutAll: remainder. aStream nextPut: terminator; cr.! ! !NaturalLanguageTranslator methodsFor: 'fileIn/fileOut' stamp: 'tak 12/15/2004 16:07'! scanFrom: aStream "Read a definition of dictionary. Make sure current locale corresponds my locale id" | aString newTranslations assoc currentPlatform | newTranslations := Dictionary new. currentPlatform := Locale currentPlatform. [Locale currentPlatform: (Locale localeID: id). [aString := aStream nextChunk withSqueakLineEndings. aString size > 0] whileTrue: [assoc := Compiler evaluate: aString. assoc value = '' ifTrue: [self class registerPhrase: assoc key] ifFalse: [newTranslations add: assoc]]] ensure: [Locale currentPlatform: currentPlatform]. self mergeTranslations: newTranslations! ! !SyntaxError methodsFor: 'initialization' stamp: 'tak 11/16/2004 14:58'! setClass: aClass code: aString debugger: aDebugger doitFlag: flag | types printables badChar | class _ aClass. debugger _ aDebugger. selector _ aClass parserClass new parseSelector: aString. types _ Scanner classPool at: #TypeTable. "dictionary" printables _ '!!@#$%&*-_=+<>{}?/\,·£¢§¶ªº–—“‘”’…ÚæÚ¯×¿«»`~`' asSet. badChar _ aString detect: [:aChar | (types at: aChar asciiValue ifAbsent: [#xLetter]) == #xBinary and: [ (printables includes: aChar) not]] ifNone: [nil]. contents _ badChar ifNil: [aString] ifNotNil: ['<<>> ', aString]. category ifNil: [category _ aClass organization categoryOfElement: selector]. category ifNil: [category _ ClassOrganizer default]. doitFlag _ flag! !