[etoys-dev] Etoys Inbox: System-Richo.18.mcz

Ricardo Moran richi.moran at gmail.com
Tue May 25 01:04:36 EDT 2010


I uploaded to the Inbox because I saw a lot of weird changes I didn't mean.
The only one I meant was LocaleID>>#displayName.
Please ignore this commit. BTW, how do you remove a bad commit from the
inbox? And how do I clean the package to upload only what I want?

Richo

On Tue, May 25, 2010 at 1:59 AM, <commits at source.squeak.org> wrote:

> A new version of System was added to project Etoys Inbox:
> http://source.squeak.org/etoysinbox/System-Richo.18.mcz
>
> ==================== Summary ====================
>
> Name: System-Richo.18
> Author: Richo
> Time: 25 May 2010, 1:59:04 am
> UUID: c21f1dfd-8a00-e648-b388-ec8cdeb92e3a
> Ancestors: System-bf.16
>
> * Fixed LocaleID>>#displayName
>
> =============== Diff against System-bf.16 ===============
>
> Item was added:
> + ----- Method: MOFile>>load1:localeID: (in category 'experimental') -----
> + 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].!
>
> Item was added:
> + ----- Method: MOFile>>loadString:pointer:length: (in category 'private')
> -----
> + loadString: strm pointer: top  length: len
> +       | str |
> +       str _ ByteString new: len.
> +       strm position:  top.
> +       strm nextInto: str.
> +       ^str replaceAll: Lf with: Cr.
> + !
>
> Item was added:
> + ----- Method: MOFile>>translatedString: (in category 'private') -----
> + translatedString: index
> +       "KNOWN PROBLEM: conversion is executed everytimes this method
> called"
> +       | str |
> +       str _ translatedStrings at: index.
> +
> +       ^str utf8ToSqueak applyLanguageInfomation: (Locale localeID:
> localeID) languageEnvironment.
> + !
>
> Item was added:
> + ----- Method: MOFile>>loadStrings:pointers: (in category 'private') -----
> + loadStrings: strm pointers: table
> +       ^self loadStrings: strm pointers: table encoding: nil
> languageEnvironment: nil
> + !
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>allMethodsWithTranslations (in
> category 'accessing') -----
> + allMethodsWithTranslations
> + "Look for #translated calls"
> + | methodsWithTranslations |
> + methodsWithTranslations := TranslatedReceiverFinder new
> stringReceiversWithContext: #translated.
> + methodsWithTranslations := methodsWithTranslations,
> (TranslatedReceiverFinder new
> + stringReceiversWithContext: #translatedNoop).
> +
> + methodsWithTranslations := methodsWithTranslations collect: [:each | each
> key compiledMethod].
> +
> + "Look for Etoys tiles and vocabularies"
> + methodsWithTranslations := methodsWithTranslations, (EToyVocabulary
> allPhrasesWithContextToTranslate collect: [:r |
> +       (MethodReference new setStandardClass: r second methodSymbol: r
> third) compiledMethod.
> + ]).
> +
> + ^methodsWithTranslations!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>domainForPackage: (in category
> 'accessing') -----
> + domainForPackage: aPackageInfo
> + "Package names and text domains are synonyms now"
> +       ^aPackageInfo name!
>
> Item was added:
> + ----- Method: MOFile>>loadHeader: (in category 'private') -----
> + loadHeader: strm
> +       strm binary.
> +       magic _  strm uint32.
> +       magic = 16rDE120495
> +               ifTrue: [isLittleEndian _ true]
> +               ifFalse: [
> +                       magic = 16r950412DE
> +                               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.
> + !
>
> Item was added:
> + ----- Method: MOFile>>searchByDictionary: (in category 'public') -----
> + searchByDictionary: aString
> +       | index |
> +       index _ translations at: aString ifAbsent: [^nil].
> +       ^self translatedString: index
> +
> + !
>
> Item was added:
> + ----- Method: MOFile classSide>>initialize (in category 'class
> initialization') -----
> + initialize
> +       Cr := Character cr.
> +       Lf := Character lf.
> + !
>
> Item was added:
> + ----- Method: MOFile>>hashPjw: (in category 'experimental') -----
> + 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.
> + !
>
> Item was added:
> + Object subclass: #TextDomainManager
> +       instanceVariableNames: ''
> +       classVariableNames: 'ClassCategories Classes DefaultDomain
> DomainInfos LoneClasses Packages'
> +       poolDictionaries: ''
> +       category: 'System-Localization'!
> + TextDomainManager class
> +       instanceVariableNames: 'defaultDomain'!
> +
> + !TextDomainManager commentStamp: 'tk 1/4/2008 16:08' prior: 0!
> + I manages mapping from class category to textdomain.
> +
> + Class variables:
> +  ClassCategories      IdentityDictionary -- classCategory -> domainName
> +  Classes                      IdentityDictionary -- class name (a Symbol)
> -> domainName   (a cache only!!)
> +  DefaultDomain        String -- the default domain name
> +  DomainInfos          Dictionary -- domainName -> a TextDomainInfo
> +  LoneClasses          IdentityDictionary -- class name (a Symbol) ->
> domainName.  For classes whose entire category are not all in the same
> domain (BookMorph and QuickGuideMorph)
> +
> + TextDomainManager registerCategoryPrefix: 'DrGeoII' domain: 'DrGeoII'.
> + TextDomainManager unregisterDomain: 'DrGeoII'.
> +
> + TextDomainManager registerClass: #QuickGuideMorph domain: 'quickguides'.
> + TextDomainManager registerClass: #QuickGuideHolderMorph  domain:
> 'quickguides'.
> + !
> + TextDomainManager class
> +       instanceVariableNames: 'defaultDomain'!
>
> Item was added:
> + ----- Method: MOFile>>load4:localeID: (in category 'experimental') -----
> + 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].!
>
> Item was added:
> + ----- Method: MOFile>>loadHashTable: (in category 'experimental') -----
> + 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.
> +       ]!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>domainOfMethod: (in category
> 'accessing') -----
> + domainOfMethod: aCompiledMethod
> +       ^ aCompiledMethod
> +               propertyValueAt: self textDomainProperty
> +               ifAbsent: [self updateDomainOfMethod: aCompiledMethod] !
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>clearAllDomains (in category
> 'private') -----
> + clearAllDomains
> +       SystemNavigation default
> +               allCompiledMethodDo: [:each | each
> +                               removeProperty: self textDomainProperty
> +                               ifAbsent: []] !
>
> Item was added:
> + ----- Method: MOFile>>nextInt32From: (in category 'private') -----
> + nextInt32From: strm
> +       ^isLittleEndian
> +                       ifTrue: [^strm nextLittleEndianNumber: 4]
> +                       ifFalse: [^strm nextInt32]!
>
> Item was added:
> + ----- Method: TextDomainManager
> classSide>>updateDomainOfAllMethodsWithTranslations (in category 'private')
> -----
> + updateDomainOfAllMethodsWithTranslations
> + self allMethodsWithTranslations do: [:each|
> +       self updateDomainOfMethod: each
> + ]!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>initialize (in category 'class
> initialization') -----
> + initialize
> +       "       TextDomainManager initialize    "
> +       self defaultDomain: 'Etoys'; clearAllDomains!
>
> Item was added:
> + ----- Method: MOFile>>testSearchByHash (in category 'experimental') -----
> + testSearchByHash
> +       InternalTranslator allKnownPhrases
> +               do: [:each |
> +                       self searchByHash: each
> +               ].
> +       !
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>textDomainProperty (in
> category 'private') -----
> + textDomainProperty
> + ^#textDomain!
>
> Item was added:
> + ----- Method: MOFile>>loadStringPointers:offset: (in category 'private')
> -----
> + 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
> + !
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>defaultDomain (in category
> 'accessing') -----
> + defaultDomain
> + "I'm not sure we still need a default domain, AFAIK the default domain
> will only be used when no domain is found. In that case, wouldn't it be
> better to just look for a translation in all domains?"
> +       ^defaultDomain!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>domainForClass: (in category
> 'accessing') -----
> + domainForClass: aClass
> + ^'etoys'!
>
> Item was added:
> + ----- Method: MOFile classSide>>fileName:localeID: (in category 'instance
> creation') -----
> + fileName: path localeID: id
> +       ^self new
> +                       load:path localeID: id!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>updateDomainOfMethod: (in
> category 'private') -----
> + updateDomainOfMethod: aCompiledMethod
> +       "First it looks for the package of the method reference (using
> +       the PackageOrganizer: deadly slow). If the method doesn't
> +       belong to any package it uses the default domain. Finally it
> +       stores the text domain of the method using a method
> +       property, this way we gain performance the next time we
> +       translate the same method because we avoid the use of
> +       PackageOrganizer. Have I mentioned it is really slow? :)"
> +       | package |
> +       package := PackageOrganizer default
> +                               packageOfMethod: aCompiledMethod
> methodReference
> +                               ifNone: [].
> +       ^ aCompiledMethod
> +               propertyValueAt: self textDomainProperty
> +               put: (package isNil
> +                               ifTrue: [TextDomainManager defaultDomain]
> +                               ifFalse: [package name])!
>
> Item was added:
> + Object subclass: #MOFile
> +       instanceVariableNames: 'localeID fileName isLittleEndian magic
> revision nStrings originalTableOffset translatedTableOffset hashTableSize
> hashTableOffset hashTable originalStrings translatedStrings translations'
> +       classVariableNames: 'Cr Lf'
> +       poolDictionaries: ''
> +       category: 'System-Localization'!
> +
> + !MOFile commentStamp: '<historical>' 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.
> + !
>
> Item was added:
> + ----- Method: MOFile>>searchByHash: (in category 'experimental') -----
> + 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.!
>
> Item was added:
> + ----- Method: MOFile>>translateByHash: (in category 'experimental') -----
> + translateByHash: aString
> +       | trans |
> +       trans _ self searchByHash: aString.
> +       trans isNil ifTrue: [^aString]
> +                       ifFalse: [^trans].
> + !
>
> Item was added:
> + ----- Method: MOFile>>originalString: (in category 'private') -----
> + originalString: index
> +       ^originalStrings at: index.
> + !
>
> Item was added:
> + ----- Method: MOFile>>loadStrings:pointers:encoding:languageEnvironment:
> (in category 'private') -----
> + 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.!
>
> Item was added:
> + ----- Method: MOFile>>testSearchByDictionary (in category 'experimental')
> -----
> + testSearchByDictionary
> +       InternalTranslator allKnownPhrases
> +               do: [:each |
> +                       self searchByDictionary: each
> +               ].
> +       !
>
> Item was added:
> + ----- Method: MOFile>>fileName: (in category 'public') -----
> + fileName: path
> +       fileName _ path!
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>allKnownDomains (in category
> 'accessing') -----
> + allKnownDomains
> + "Every package has it's own text domain now so it's not necessary to keep
> a registry of all domains, we can simply return all the packages in the
> image.
> + PROBLEM: If a package doesn't contain translations, it won't have a mo
> file but the GetTextTranslator will try to load it anyway. This happens when
> we switch languages. So far I tested it briefly and it seems to work..."
> + ^PackageOrganizer default packageNames!
>
> Item was added:
> + ----- Method: MOFile>>atRandom (in category 'public') -----
> + atRandom
> +
> +       ^ self translatedString:nStrings atRandom.
> + !
>
> Item was added:
> + ----- Method: MOFile>>translationFor: (in category 'public') -----
> + translationFor: aString
> +       | file |
> +       aString size = 0 ifTrue: [^ '']. "Gettext header"
> +       ^ (self searchByDictionary: aString) ifNil: [
> + file := (fileName subStrings: '\').
> + Transcript show: aString printString, ' not found in ', "(file atLast:
> 3),'\', "(file last); cr.
> + ^aString]
> + !
>
> Item was added:
> + ----- Method: TextDomainManager classSide>>defaultDomain: (in category
> 'accessing') -----
> + defaultDomain: aDomainName
> +       defaultDomain := aDomainName!
>
> Item was changed:
>  ----- Method: LocaleID>>displayName (in category 'accessing') -----
>  displayName
>        "Answer a proper name to represent the receiver in GUI.
>
>        The wording is provided by translations of the magic value
>        '<language display name>'.
>
>        'English' -> 'English'
>        'German' -> 'Deutsch'
>        "
>        | magicPhrase translatedMagicPhrase |
> +       magicPhrase := 'Language-Name'.
> -       magicPhrase := '<language display name>'.
>        translatedMagicPhrase := NaturalLanguageTranslator
> translateWithoutLoading: magicPhrase toLocaleID: self.
>        ^ translatedMagicPhrase = magicPhrase
>                ifTrue: [self displayLanguage]
>                ifFalse: [translatedMagicPhrase]!
>
> Item was added:
> + ----- Method: MOFile>>load:localeID: (in category 'public') -----
> + 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].!
>
> Item was added:
> + ----- Method: MOFile>>fileName (in category 'public') -----
> + fileName
> +       ^fileName!
>
> _______________________________________________
> etoys-dev mailing list
> etoys-dev at squeakland.org
> http://lists.squeakland.org/mailman/listinfo/etoys-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakland.org/pipermail/etoys-dev/attachments/20100525/94f04dff/attachment-0001.html


More information about the etoys-dev mailing list