'From etoys2.1 of 26 July 2007 [Xlatest update: #X1529] on 6 August 2007 at 1:39:40 pm'! "Change Set: gettextDirectory-tak Date: 6 August 2007 Author: Takashi Yamamiya 1) Gettext files are located a structure of: po/Category/Sub/Category-Sub.pot po/Category/Sub/de.pot For example: po/EToys/EToys.pot po/EToys/de.po po/EToys/pt.po po/Connectors/Connectors.pot po/Connectors/de.po po/Connectors/pt.po 2) CRLF is supported. 3) a file name is like en_US.po instead of en-US.po. "! !GetTextExporter2 methodsFor: 'exporting' stamp: 'tak 8/6/2007 12:14'! dirNameCategory: category translator: translator "Answer a file name for the category. Make one if it is not exist yet. Make template file name if translator is nil" "self new dirNameCategory: 'Morphic-Scripting' translator: NaturalLanguageTranslator current" "self new dirNameCategory: 'Morphic-Scripting' translator: nil" | fileName dirName pathName | fileName := translator ifNil: [category , '.pot'] ifNotNil: [translator localeID posixName , '.po']. dirName := (category findTokens: '-') inject: 'po' into: [:aString :next | aString , FileDirectory slash , next]. pathName := dirName , FileDirectory slash , fileName. (FileDirectory default directoryNamed: dirName) assureExistence. ^ pathName! ! !GetTextExporter2 methodsFor: 'exporting' stamp: 'tak 8/1/2007 15:42'! exportTranslator: translator "Export translation files. the file extention is 'po', or 'pot' if translator is nil " "GetTextExporter2 new exportTranslator: NaturalLanguageTranslator current" | categories extention fileName | categories := Dictionary new. self appendTranslations: categories. extention := translator ifNil: ['.pot'] ifNotNil: ['.po']. categories keysAndValuesDo: [:categoryName :value | fileName := self dirNameCategory: categoryName translator: translator. self export: value translator: translator fileNamed: fileName]! ! !GetTextExporter2 class methodsFor: 'utilities' stamp: 'tak 8/6/2007 11:49'! verifyExport "GetTextExporter2 verifyExport" "Test whether if gettext exporter works well. If you invoke this method, a language named 'test' will be made. And all possible translated words are shown with square bracket like 'XwordX' in the language." | src dst langName | langName := 'test-US'. NaturalLanguageTranslator removeLocaleID: (LocaleID isoString: langName). src := (LocaleID isoString: langName) translator. self keys do: [:key | src generics at: key put: 'X' , key , 'X']. GetTextExporter2 new exportTranslator: src. NaturalLanguageTranslator removeLocaleID: (LocaleID isoString: langName). dst := (LocaleID isoString: langName) translator. GetTextImporter import: dst allDirectory: FileDirectory default! ! !GetTextInterchange methodsFor: 'private' stamp: 'tak 8/6/2007 12:12'! defaultFileName ^ language localeID posixName , '.po'! ! !GetTextImporter methodsFor: 'parsing' stamp: 'tak 8/6/2007 12:23'! parse | size | size := (stream isKindOf: FileStream) ifTrue: [stream size] ifFalse: [1]. ProgressInitiationException display: 'Importing phrases from a gettext file.' during: [:bar | [stream atEnd] whileFalse: [| line | line := stream upTo: Character linefeed. self parseLine: ((line endsWith: String cr) ifTrue: [line allButLast] ifFalse: [line]). bar value: stream position / size]]. self storeTranslation! ! !GetTextImporter methodsFor: 'importing' stamp: 'tak 8/6/2007 11:29'! import: aLanguage ^ self import: aLanguage fileNamed: self defaultFileName! ! !GetTextImporter class methodsFor: 'utilities' stamp: 'tak 8/6/2007 12:12'! import: translator allDirectory: aFileDirectory "self import: NaturalLanguageTranslator current allDirectory: FileDirectory default" | fileName targetFile | fileName := translator localeID posixName , '.po'. (FileDirectory default directoryNamed: 'po') withAllSubdirectoriesCollect: [:each | (each fileExists: fileName) ifTrue: [targetFile := each fullNameFor: fileName. self new import: translator fileNamed: targetFile]]! ! !LanguageEditor methodsFor: 'gui methods' stamp: 'tak 8/1/2007 23:49'! getTextImport | menu | menu := MenuMorph new defaultTarget: self. menu addTitle: 'Choose translation file'. menu add: 'All *.po files' action: #getTextImportAll. menu add: 'Choose a file' action: #getTextImportAFile. menu popUpInWorld! ! !LanguageEditor methodsFor: 'gui methods' stamp: 'tak 8/6/2007 11:13'! getTextImportAFile | result | result := (StandardFileMenu new pattern: '*.po'; oldFileFrom: (FileDirectory default directoryNamed: 'po')) startUpWithCaption: 'Select a File:' translated. result ifNil: [^ self]. self withUnboundModelDo: [:trans | Cursor wait showWhile: [GetTextImporter new import: trans fileNamed: (result directory fullNameFor: result name)]]! ! !LanguageEditor methodsFor: 'gui methods' stamp: 'tak 7/23/2007 01:12'! getTextImportAll self withUnboundModelDo: [:trans | Cursor wait showWhile: [GetTextImporter import: trans allDirectory: FileDirectory default]]. self refreshBoth! ! !LocaleID methodsFor: 'printing' stamp: 'tak 8/6/2007 12:16'! posixName "(LocaleID isoString: 'es-MX') posixName" "(LocaleID isoString: 'es') posixName" "language[_territory]" ^ self isoCountry ifNil: [self isoLanguage] ifNotNil: [self isoLanguage , '_' , self isoCountry]! ! LanguageEditor removeSelector: #getTextImport:!