[squeak-dev] The Trunk: GetText-edc.18.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Mar 15 21:28:00 UTC 2012
Edgar J. De Cleene uploaded a new version of GetText to project The Trunk:
http://source.squeak.org/trunk/GetText-edc.18.mcz
==================== Summary ====================
Name: GetText-edc.18
Author: edc
Time: 15 March 2012, 6:29:37.486 pm
UUID: 43d88f85-6e87-41fb-8dd1-883feaf3d297
Ancestors: GetText-edc.17
'_' s replaced by ':='
=============== Diff against GetText-edc.17 ===============
Item was changed:
----- Method: GetTextExporter>>appendStringReceivers:into: (in category 'private') -----
appendStringReceivers: aSymbol into: domains
| literals references domainName methodReference keywords found |
found := TranslatedReceiverFinder new stringReceiversWithContext: aSymbol.
found do: [ :assoc |
methodReference := assoc key.
keywords := assoc value.
domainName := (PackageOrganizer default packageOfMethod: methodReference ifNone: [nil]).
domainName := domainName isNil ifTrue: [TextDomainManager defaultDomain] ifFalse: [domainName name].
+ literals := domains at: domainName ifAbsentPut: [Dictionary new].
- literals _ domains at: domainName ifAbsentPut: [Dictionary new].
keywords do: [ :literal |
+ references := literals at: literal ifAbsentPut: [OrderedCollection new].
- references _ literals at: literal ifAbsentPut: [OrderedCollection new].
references add: methodReference.
].
].
!
Item was changed:
----- Method: GetTextExporter>>appendVocabularies: (in category 'private') -----
appendVocabularies: domains
| literalsForDomain references domainName methodReference |
EToyVocabulary allPhrasesWithContextToTranslate do: [ :r |
methodReference := (MethodReference new setStandardClass: (r second) methodSymbol: (r third)).
+ "domainName := self getTextDomainForPackage: (PackageOrganizer default packageOfMethod: methodReference)".
- "domainName _ self getTextDomainForPackage: (PackageOrganizer default packageOfMethod: methodReference)".
domainName := 'Etoys-Tiles'.
+ literalsForDomain := domains at: domainName ifAbsentPut: [Dictionary new].
- literalsForDomain _ domains at: domainName ifAbsentPut: [Dictionary new].
r fourth do: [ :literal |
+ references := literalsForDomain at: literal ifAbsentPut: [OrderedCollection new].
- references _ literalsForDomain at: literal ifAbsentPut: [OrderedCollection new].
references add: methodReference.
].
].
!
Item was changed:
----- Method: GetTextExporter>>dirNameCategory:translator: (in category 'exporting') -----
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 Support' translator:
NaturalLanguageTranslator current"
"self new dirNameCategory: 'Morphic-Scripting Support' translator: nil"
| safeCategory fileName dirName pathName |
+ safeCategory := category copyReplaceAll: ' ' with: ':='.
- safeCategory := category copyReplaceAll: ' ' with: '_'.
fileName := translator
ifNil: [safeCategory , '.pot']
ifNotNil: [translator localeID posixName , '.po'].
dirName := (safeCategory findTokens: '-')
inject: 'po'
into: [:aString :next | aString , FileDirectory slash , next].
pathName := dirName , FileDirectory slash , fileName.
(FileDirectory default directoryNamed: dirName) assureExistence.
^ pathName!
Item was changed:
----- Method: GetTextExporter>>dirNameDomain:translator: (in category 'exporting') -----
dirNameDomain: domain translator: translator
"Answer a file name for the domain. Make one if it is not exist yet.
Make template file name if translator is nil"
"self new dirNameDomain: 'etoys' translator:
NaturalLanguageTranslator current"
"self new dirNameDomain: 'etoys' translator: nil"
| fileName dirName pathName |
+ "safeCategory := category copyReplaceAll: ' ' with: ':='."
- "safeCategory := category copyReplaceAll: ' ' with: '_'."
fileName := domain,
(translator
ifNil: ['.pot']
ifNotNil: ['.po']).
dirName := 'po', FileDirectory slash,
(translator
ifNil: ['templates']
ifNotNil: [translator localeID posixName]).
pathName := dirName , FileDirectory slash , fileName.
(FileDirectory default directoryNamed: dirName) assureExistence.
^ pathName!
Item was changed:
----- Method: GetTextExporter>>exportBody:translator: (in category 'file out') -----
exportBody: literals translator: translator
"Export a gettext file body. literals is a dictionary of keyword ->
#(MethodReference...) in the textDomain."
"Build {sortKey. comment. msgid } to optimize sorting (getting category is
too slow).
If there are two or more methods for a mgsid, only first method
(alphabetical) is used for sorting."
| sorted msgid sortedMethods category sortKey comment triplets commentUnderLined |
triplets := literals associations
collect: [:assoc |
msgid := assoc key.
sortedMethods := assoc value asArray sort.
category := (Smalltalk at: sortedMethods first classSymbol) category asString.
sortKey := category , ',' , sortedMethods first printString , ',' , msgid.
comment := (sortedMethods
collect: [:each | each actualClass asString , '>>' , each methodSymbol asString])
inject: category
into: [:result :methodName | result , ',' , methodName].
+ "Replace white spaces to := because gettext tool might
- "Replace white spaces to _ because gettext tool might
replace a space to a new line some times, and it makes
difficult to take a diff."
+ commentUnderLined := comment copyReplaceAll: ' ' with: ':='.
- commentUnderLined := comment copyReplaceAll: ' ' with: '_'.
Array
with: sortKey
with: commentUnderLined
with: msgid].
"Sort and output the words"
sorted := triplets
sort: [:a :b | a first <= b first].
sorted
do: [:triplet |
comment := triplet second.
msgid := triplet third.
self exportRecordHeader: comment.
self
exportPhrase: msgid
translation: (self translationFor: msgid in: translator)]!
Item was changed:
----- Method: GetTextExporter>>exportPhrase:translation: (in category 'private') -----
exportPhrase: phraseString translation: translationString
| normalizedTrans tmp transStartsWithCR transEndsWithCR|
phraseString isEmpty
ifTrue: [^ self].
self exportTag: 'msgid' msg: phraseString.
translationString size = 0 ifTrue: [
+ normalizedTrans := ''
- normalizedTrans _ ''
] ifFalse: [
+ transEndsWithCR := translationString last = (Character cr).
- transEndsWithCR _ translationString last = (Character cr).
phraseString last = (Character cr) ifTrue: [
transEndsWithCR ifTrue: [
+ normalizedTrans := translationString
- normalizedTrans _ translationString
] ifFalse: [
+ normalizedTrans := translationString , String cr
- normalizedTrans _ translationString , String cr
]
] ifFalse: [
transEndsWithCR ifTrue: [
+ normalizedTrans := translationString allButLast
- normalizedTrans _ translationString allButLast
] ifFalse: [
+ normalizedTrans := translationString
- normalizedTrans _ translationString
]
].
+ transStartsWithCR := normalizedTrans first = (Character cr).
- transStartsWithCR _ normalizedTrans first = (Character cr).
phraseString first = (Character cr) ifTrue: [
transStartsWithCR ifFalse: [
+ tmp := (Character cr asString) , normalizedTrans.
+ normalizedTrans := tmp.
- tmp _ (Character cr asString) , normalizedTrans.
- normalizedTrans _ tmp.
]
] ifFalse: [
transStartsWithCR ifTrue: [
+ normalizedTrans := normalizedTrans allButFirst
- normalizedTrans _ normalizedTrans allButFirst
]
]
].
self exportTag: 'msgstr' msg: normalizedTrans.
stream cr!
Item was changed:
----- Method: GetTextExporter2>>appendStringReceivers:into: (in category 'private') -----
appendStringReceivers: aSymbol into: domains
| literals references domainName methodReference keywords found |
found := TranslatedReceiverFinder new stringReceiversWithContext: aSymbol.
found do: [ :assoc |
methodReference := assoc key.
keywords := assoc value.
+ domainName := self getTextDomainForPackage:
- domainName _ self getTextDomainForPackage:
(PackageOrganizer default packageOfMethod: methodReference ifNone: [TextDomainManager defaultDomain]).
+ literals := domains at: domainName ifAbsentPut: [Dictionary new].
- literals _ domains at: domainName ifAbsentPut: [Dictionary new].
keywords do: [ :literal |
+ references := literals at: literal ifAbsentPut: [OrderedCollection new].
- references _ literals at: literal ifAbsentPut: [OrderedCollection new].
references add: methodReference.
].
].
!
Item was changed:
----- Method: GetTextExporter2>>appendVocabularies: (in category 'private') -----
appendVocabularies: domains
| literalsForDomain references domainName methodReference |
EToyVocabulary allPhrasesWithContextToTranslate do: [ :r |
methodReference := (MethodReference new setStandardClass: (r second) methodSymbol: (r third)).
+ "domainName := self getTextDomainForPackage: (PackageOrganizer default packageOfMethod: methodReference)".
- "domainName _ self getTextDomainForPackage: (PackageOrganizer default packageOfMethod: methodReference)".
domainName := 'Etoys-Tiles'.
+ literalsForDomain := domains at: domainName ifAbsentPut: [Dictionary new].
- literalsForDomain _ domains at: domainName ifAbsentPut: [Dictionary new].
r fourth do: [ :literal |
+ references := literalsForDomain at: literal ifAbsentPut: [OrderedCollection new].
- references _ literalsForDomain at: literal ifAbsentPut: [OrderedCollection new].
references add: methodReference.
].
].
!
Item was changed:
----- Method: GetTextExporter2>>dirNameCategory:translator: (in category 'exporting') -----
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 Support' translator:
NaturalLanguageTranslator current"
"self new dirNameCategory: 'Morphic-Scripting Support' translator: nil"
| safeCategory fileName dirName pathName |
+ safeCategory := category copyReplaceAll: ' ' with: ':='.
- safeCategory := category copyReplaceAll: ' ' with: '_'.
fileName := translator
ifNil: [safeCategory , '.pot']
ifNotNil: [translator localeID posixName , '.po'].
dirName := (safeCategory findTokens: '-')
inject: 'po'
into: [:aString :next | aString , FileDirectory slash , next].
pathName := dirName , FileDirectory slash , fileName.
(FileDirectory default directoryNamed: dirName) assureExistence.
^ pathName!
Item was changed:
----- Method: GetTextExporter2>>dirNameDomain:translator: (in category 'exporting') -----
dirNameDomain: domain translator: translator
"Answer a file name for the domain. Make one if it is not exist yet.
Make template file name if translator is nil"
"self new dirNameDomain: 'etoys' translator:
NaturalLanguageTranslator current"
"self new dirNameDomain: 'etoys' translator: nil"
| fileName dirName pathName |
+ "safeCategory := category copyReplaceAll: ' ' with: ':='."
- "safeCategory := category copyReplaceAll: ' ' with: '_'."
fileName := translator
ifNil: [domain , '.pot']
ifNotNil: [translator localeID posixName , '.po'].
dirName := 'po', FileDirectory slash, domain.
pathName := dirName , FileDirectory slash , fileName.
(FileDirectory default directoryNamed: dirName) assureExistence.
^ pathName!
Item was changed:
----- Method: GetTextExporter2>>exportBody:translator: (in category 'file out') -----
exportBody: literals translator: translator
"Export a gettext file body. literals is a dictionary of keyword ->
#(MethodReference...) in the textDomain."
"Build {sortKey. comment. msgid } to optimize sorting (getting category is
too slow).
If there are two or more methods for a mgsid, only first method
(alphabetical) is used for sorting."
| sorted msgid sortedMethods category sortKey comment triplets commentUnderLined |
triplets := literals associations
collect: [:assoc |
msgid := assoc key.
sortedMethods := assoc value asArray sort.
category := (Smalltalk at: sortedMethods first classSymbol) category asString.
sortKey := category , ',' , sortedMethods first printString , ',' , msgid.
comment := (sortedMethods
collect: [:each | each actualClass asString , '>>' , each methodSymbol asString])
inject: category
into: [:result :methodName | result , ',' , methodName].
+ "Replace white spaces to := because gettext tool might
- "Replace white spaces to _ because gettext tool might
replace a space to a new line some times, and it makes
difficult to take a diff."
+ commentUnderLined := comment copyReplaceAll: ' ' with: ':='.
- commentUnderLined := comment copyReplaceAll: ' ' with: '_'.
Array
with: sortKey
with: commentUnderLined
with: msgid].
"Sort and output the words"
sorted := triplets
sort: [:a :b | a first <= b first].
sorted
do: [:triplet |
comment := triplet second.
msgid := triplet third.
self exportRecordHeader: comment.
self
exportPhrase: msgid
translation: (self translationFor: msgid in: translator)]!
Item was changed:
----- Method: GetTextExporter2>>exportPhrase:translation: (in category 'private') -----
exportPhrase: phraseString translation: translationString
| normalizedTrans tmp transStartsWithCR transEndsWithCR|
phraseString isEmpty
ifTrue: [^ self].
self exportTag: 'msgid' msg: phraseString.
translationString size = 0 ifTrue: [
+ normalizedTrans := ''
- normalizedTrans _ ''
] ifFalse: [
+ transEndsWithCR := translationString last = (Character cr).
- transEndsWithCR _ translationString last = (Character cr).
phraseString last = (Character cr) ifTrue: [
transEndsWithCR ifTrue: [
+ normalizedTrans := translationString
- normalizedTrans _ translationString
] ifFalse: [
+ normalizedTrans := translationString , String cr
- normalizedTrans _ translationString , String cr
]
] ifFalse: [
transEndsWithCR ifTrue: [
+ normalizedTrans := translationString allButLast
- normalizedTrans _ translationString allButLast
] ifFalse: [
+ normalizedTrans := translationString
- normalizedTrans _ translationString
]
].
+ transStartsWithCR := normalizedTrans first = (Character cr).
- transStartsWithCR _ normalizedTrans first = (Character cr).
phraseString first = (Character cr) ifTrue: [
transStartsWithCR ifFalse: [
+ tmp := (Character cr asString) , normalizedTrans.
+ normalizedTrans := tmp.
- tmp _ (Character cr asString) , normalizedTrans.
- normalizedTrans _ tmp.
]
] ifFalse: [
transStartsWithCR ifTrue: [
+ normalizedTrans := normalizedTrans allButFirst
- normalizedTrans _ normalizedTrans allButFirst
]
]
].
self exportTag: 'msgstr' msg: normalizedTrans.
stream cr!
Item was changed:
----- Method: GetTextInterchange>>language: (in category 'accessing') -----
language: translator
+ language := translator!
- language _ translator!
Item was changed:
----- Method: GetTextInterchange>>stream: (in category 'accessing') -----
stream: aStream
+ stream := aStream!
- stream _ aStream!
Item was changed:
----- Method: GetTextTranslator class>>defaultLocaleDirs (in category 'translation data layout') -----
defaultLocaleDirs
| dirs |
+ dirs := OrderedCollection new.
- dirs _ OrderedCollection new.
UserDefaultLocaleDirs ifNotNil: [dirs addAll: UserDefaultLocaleDirs].
dirs addAll: self systemDefaultLocaleDirs.
^dirs
!
Item was changed:
----- Method: GetTextTranslator class>>findMOForLocaleID:domain: (in category 'private') -----
findMOForLocaleID: id domain: aDomainName
| sepa langSubDir path |
+ sepa := FileDirectory slash.
+ langSubDir := self langDirNameForLocaleID: id.
- sepa _ FileDirectory slash.
- langSubDir _ self langDirNameForLocaleID: id.
(self localeDirsForDomain: aDomainName)
do: [:each |
+ path := each , sepa , langSubDir, sepa , (self moNameForDomain: aDomainName).
- path _ each , sepa , langSubDir, sepa , (self moNameForDomain: aDomainName).
[(FileDirectory default fileExists: path)
ifTrue: [^path]] on: InvalidDirectoryError do: [:e | ^nil]].
^nil.!
Item was changed:
----- Method: GetTextTranslator class>>initialize (in category 'class initialization') -----
initialize
+ SystemDefaultLocaleDirs := OrderedCollection new.
+ UserDefaultLocaleDirs := OrderedCollection new.
+ LocaleDirsForDomain := Dictionary new.!
- SystemDefaultLocaleDirs _ OrderedCollection new.
- UserDefaultLocaleDirs _ OrderedCollection new.
- LocaleDirsForDomain _ Dictionary new.!
Item was changed:
----- Method: GetTextTranslator class>>localeDirsForDomain (in category 'private') -----
localeDirsForDomain
+ ^LocaleDirsForDomain ifNil: [LocaleDirsForDomain := Dictionary new]!
- ^LocaleDirsForDomain ifNil: [LocaleDirsForDomain _ Dictionary new]!
Item was changed:
----- Method: GetTextTranslator class>>localeDirsForDomain: (in category 'translation data layout') -----
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.
- dirs _ OrderedCollection new.
- dir _ self localeDirForDomain: aDomainName.
dir ifNotNil: [dirs add: dir].
dirs addAll: self defaultLocaleDirs.
^dirs!
Item was changed:
----- Method: GetTextTranslator>>initialize (in category 'initialize-release') -----
initialize
+ moFiles := Dictionary new.!
- moFiles _ Dictionary new.!
Item was changed:
----- Method: GetTextTranslator>>isDomainLoaded: (in category 'accessing') -----
isDomainLoaded: aDomainName
| mo |
+ mo := moFiles at: aDomainName ifAbsent: [nil].
- mo _ moFiles at: aDomainName ifAbsent: [nil].
^mo isNil not.
!
Item was changed:
----- Method: GetTextTranslator>>loadMOFileForDomain: (in category 'private') -----
loadMOFileForDomain: aDomainName
| moName |
+ moName := self class findMOForLocaleID: self localeID
- moName _ self class findMOForLocaleID: self localeID
domain: aDomainName.
moName notNil
ifTrue: [^MOFile new load: moName
localeID: self localeID]
ifFalse: [^nil]
!
Item was changed:
----- Method: GetTextTranslator>>reloadMOFiles (in category 'accessing') -----
reloadMOFiles
+ moFiles := Dictionary new.
- moFiles _ Dictionary new.
self loadMOFiles.!
Item was changed:
----- Method: GetTextTranslator>>translate:inDomain: (in category 'translation') -----
translate: aString inDomain: aDomainName
| mo |
+ mo := self moFileForDomain: aDomainName.
- mo _ self moFileForDomain: aDomainName.
^mo isNil
ifTrue: [aString]
ifFalse: [mo translationFor: aString]
!
Item was changed:
----- Method: ISOLanguageDefinition class>>iso3166Codes (in category 'private') -----
(excessive size, no diff calculated)
Item was changed:
----- Method: LanguageEditor>>checkSpanishPhrase:translation: (in category 'private') -----
checkSpanishPhrase: phraseString translation: translationString
"check the translation and aswer a string with a comment or a
nil meaning no-comments"
| superResult |
superResult := self checkPhrase: phraseString translation: translationString.
superResult isNil
ifFalse: [^ superResult].
"For some reason, MCInstaller couldn't read Spanish character. "
"((translationString includes: $?)
+ and: [(translationString includes: $ø) not])
+ ifTrue: [^ 'øOlvidÛ el signo de pregunta?'].
- and: [(translationString includes: $¿) not])
- ifTrue: [^ '¿Olvidó el signo de pregunta?'].
((translationString includes: $!!)
+ and: [(translationString includes: $°) not])
+ ifTrue: [^ 'øOlvidÛ el signo de admiraciÛn?'].
- and: [(translationString includes: $¡) not])
- ifTrue: [^ '¿Olvidó el signo de admiración?'].
"
^ nil
!
Item was changed:
----- Method: LanguageEditor>>codeSelectedTranslationAsMimeString (in category 'gui methods') -----
codeSelectedTranslationAsMimeString
| keys code tmpStream s2 gzs cont |
keys := selectedTranslations
collect: [:key | self translations at: key].
code := String
streamContents: [:aStream | self translator fileOutOn: aStream keys: keys withBOM: false].
+ tmpStream := MultiByteBinaryOrTextStream on: ''.
- tmpStream _ MultiByteBinaryOrTextStream on: ''.
tmpStream converter: UTF8TextConverter new.
tmpStream nextPutAll: code.
+ s2 := RWBinaryOrTextStream on: ''.
- s2 _ RWBinaryOrTextStream on: ''.
gzs := GZipWriteStream on: s2.
tmpStream reset.
gzs nextPutAll: (tmpStream binary contentsOfEntireFile asString) contents.
gzs close.
s2 reset.
+ cont := String streamContents: [:strm |
- cont _ String streamContents: [:strm |
strm nextPutAll: '"Gzip+Base64 encoded translation for;'; cr.
strm nextPutAll: '#('.
keys do: [:each | strm nextPutAll: '''', each, ''' '.].
strm nextPutAll: ')"'; cr; cr.
strm nextPutAll: 'NaturalLanguageTranslator loadForLocaleIsoString: '.
strm nextPut: $'.
strm nextPutAll: translator localeID isoString.
strm nextPut: $'.
strm nextPutAll: ' fromGzippedMimeLiteral: '.
strm nextPut: $'.
strm nextPutAll: (Base64MimeConverter mimeEncode: s2) contents.
strm nextPutAll: '''.'.
strm cr.
].
(StringHolder new contents: cont)
openLabel: 'exported codes in Gzip+Base64 encoding' translated!
Item was changed:
----- Method: LanguageEditor>>filterTranslations: (in category 'gui methods') -----
filterTranslations: aString
| filter |
filter := aString ifNil:[''].
""
+ translationsFilter := filter.
- translationsFilter _ filter.
self refreshTranslations.
!
Item was changed:
----- Method: LanguageEditor>>initializeNewerKeys (in category 'initialization') -----
initializeNewerKeys
+ newerKeys := Set new.
- newerKeys _ Set new.
!
Item was changed:
----- Method: LanguageEditor>>selectNewerKeys (in category 'gui methods') -----
selectNewerKeys
| index |
self deselectAllTranslation.
newerKeys do: [:k |
+ index := self translations indexOf: k ifAbsent: [0].
- index _ self translations indexOf: k ifAbsent: [0].
index > 0 ifTrue: [
self selectedTranslationsAt: index put: true
].
].
!
Item was changed:
----- Method: LanguageEditor>>translation: (in category 'accessing') -----
translation: aStringOrText
"change the translation for the selected phrase"
| phrase |
self selectedTranslation isZero
ifTrue: [^ self].
+ phrase := self translations at: self selectedTranslation.
- phrase _ self translations at: self selectedTranslation.
translator
phrase: phrase
translation: aStringOrText asString.
newerKeys add: phrase.
^ true!
Item was changed:
----- Method: LanguageEditor>>translations (in category 'accessing') -----
translations
"answet the translator's translations"
| allTranslations filterString |
translations ifNotNil: [^translations].
allTranslations := self translator translations keys.
""
filterString := self translationsFilter.
""
filterString isEmpty
ifFalse: [allTranslations := allTranslations
select: [:each | ""
('*' , filterString , '*' match: each)
or: ['*' , filterString , '*'
match: (self translator translate: each)]]].
""
+ ^ translations := allTranslations asSortedCollection asArray!
- ^ translations _ allTranslations asSortedCollection asArray!
Item was changed:
----- Method: LanguageEditor>>untranslated (in category 'accessing') -----
untranslated
"answer the translator's untranslated phrases"
| all filterString |
untranslated ifNotNil: [^ untranslated].
all := self translator untranslated.
""
filterString := self untranslatedFilter.
""
filterString isEmpty
ifFalse: [all := all
select: [:each | ""
('*' , filterString , '*' match: each)
or: ['*' , filterString , '*'
match: (self translator translate: each)]]].
""
+ ^ untranslated := all asSortedCollection asArray!
- ^ untranslated _ all asSortedCollection asArray!
Item was changed:
----- Method: Locale class>>localeChangedListeners (in category 'notification') -----
localeChangedListeners
+ ^LocaleChangeListeners ifNil: [LocaleChangeListeners := OrderedCollection new]!
- ^LocaleChangeListeners ifNil: [LocaleChangeListeners _ OrderedCollection new]!
Item was changed:
----- Method: Locale class>>migrateSystem (in category 'private') -----
migrateSystem
"Locale migrateSystem"
"Do all the necessary operations to switch to the new Locale environment."
+ LocaleChangeListeners := nil.
- LocaleChangeListeners _ nil.
self
addLocalChangedListener: HandMorph;
addLocalChangedListener: Clipboard;
addLocalChangedListener: Vocabulary;
addLocalChangedListener: PartsBin;
addLocalChangedListener: Project;
addLocalChangedListener: PaintBoxMorph;
yourself!
Item was changed:
----- Method: Locale class>>switchTo:gently: (in category 'accessing') -----
switchTo: locale gently: gentlyFlag
"Locale switchTo: (Locale isoLanguage: 'de')"
| availableID |
availableID := (NaturalLanguageTranslator availableForLocaleID: locale localeID) localeID.
Current localeID = availableID
+ ifFalse: [Previous := Current.
- ifFalse: [Previous _ Current.
CurrentPlatform := Current := Locale localeID: availableID.
NaturalLanguageTranslator localeChanged.
gentlyFlag ifTrue: [self localeChangedGently] ifFalse: [self localeChanged]]!
Item was changed:
----- Method: LocaleID class>>posixName: (in category 'instance creation') -----
posixName: aString
^ self
+ isoString: (aString copyReplaceAll: ':=' with: '-')!
- isoString: (aString copyReplaceAll: '_' with: '-')!
Item was changed:
----- Method: LocaleID>>posixName (in category 'printing') -----
posixName
"(LocaleID isoString: 'es-MX') posixName"
"(LocaleID isoString: 'es') posixName"
"language[_territory]"
^ self isoCountry
ifNil: [self isoLanguage]
+ ifNotNil: [self isoLanguage , ':=' , self isoCountry]!
- ifNotNil: [self isoLanguage , '_' , self isoCountry]!
Item was changed:
----- Method: MOFile>>fileName: (in category 'public') -----
fileName: path
+ fileName := path!
- fileName _ path!
Item was changed:
----- 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.
- stringSize _ aString size.
- hash _ 0.
1 to: stringSize do: [:pos |
+ hash := hash bitShift: 4.
+ hash := hash + ((aString at: pos) asInteger).
+ g := hash bitAnd: 16rF0000000.
- 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 _ hash bitXor: (g bitShift: -24).
- hash _ hash bitXor: g.
]
].
^hash.
!
Item was changed:
----- 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.
- localeID _ id.
strm_ FileStream readOnlyFileNamed: aFileName.
+ fileName := aFileName.
- fileName _ aFileName.
[
self loadHeader: strm.
+ originalTable := self loadStringPointers: strm
- originalTable _ self loadStringPointers: strm
offset: originalTableOffset.
+ originalStrings := self loadStrings: strm
- originalStrings _ self loadStrings: strm
pointers: originalTable.
+ translatedTable := self loadStringPointers: strm
- translatedTable _ self loadStringPointers: strm
offset: translatedTableOffset.
+ translatedStrings := self loadStrings: strm
- translatedStrings _ self loadStrings: strm
pointers: translatedTable
encoding: 'utf8'
languageEnvironment: (Locale localeID: localeID) languageEnvironment .
+ translations := Dictionary new.
- translations _ Dictionary new.
1 to: nStrings do: [:index |
| key |
+ key := originalStrings at: index.
- key _ originalStrings at: index.
translations at: key put: index.
].
+ originalTable := nil.
- originalTable _ nil.
] ensure: [strm close].!
Item was changed:
----- 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.
- localeID _ id.
strm_ FileStream readOnlyFileNamed: aFileName.
+ fileName := aFileName.
- fileName _ aFileName.
[
self loadHeader: strm.
self loadHashTable: strm.
+ originalTable := self loadStringPointers: strm
- originalTable _ self loadStringPointers: strm
offset: originalTableOffset.
+ originalStrings := self loadStrings: strm
- originalStrings _ self loadStrings: strm
pointers: originalTable.
+ translatedTable := self loadStringPointers: strm
- translatedTable _ self loadStringPointers: strm
offset: translatedTableOffset.
+ translatedStrings := self loadStrings: strm
- translatedStrings _ self loadStrings: strm
pointers: translatedTable
encoding: 'utf-8'
languageEnvironment: (Locale localeID: localeID) languageEnvironment .
] ensure: [strm close].!
Item was changed:
----- 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.
- localeID _ id.
strm_ FileStream readOnlyFileNamed: aFileName.
+ fileName := aFileName.
- fileName _ aFileName.
[
self loadHeader: strm.
+ originalTable := self loadStringPointers: strm
- originalTable _ self loadStringPointers: strm
offset: originalTableOffset.
+ originalStrings := self loadStrings: strm
- originalStrings _ self loadStrings: strm
pointers: originalTable.
+ translatedTable := self loadStringPointers: strm
- translatedTable _ self loadStringPointers: strm
offset: translatedTableOffset.
+ translatedStrings := self loadStrings: strm
- translatedStrings _ self loadStrings: strm
pointers: translatedTable.
+ translations := Dictionary new: nStrings * 2. "make too enough room to avoid #grow"
- translations _ Dictionary new: nStrings * 2. "make too enough room to avoid #grow"
1 to: nStrings do: [:index |
| key |
+ key := originalStrings at: index.
- key _ originalStrings at: index.
translations at: key put: index.
].
+ originalStrings := nil.
- originalStrings _ nil.
] ensure: [strm close].!
Item was changed:
----- Method: MOFile>>loadHashTable: (in category 'experimental') -----
loadHashTable: strm
| entry |
+ hashTable := IntegerArray ofSize: hashTableSize.
- hashTable _ IntegerArray ofSize: hashTableSize.
strm binary.
strm position: hashTableOffset.
1 to: hashTableSize do: [:index |
+ entry := self nextInt32From: strm.
- entry _ self nextInt32From: strm.
hashTable at: index put: entry.
]!
Item was changed:
----- Method: MOFile>>loadHeader: (in category 'private') -----
loadHeader: strm
strm binary.
+ magic := strm uint32.
- magic _ strm uint32.
magic = 16rDE120495
+ ifTrue: [isLittleEndian := true]
- ifTrue: [isLittleEndian _ true]
ifFalse: [
magic = 16r950412DE
+ ifTrue: [isLittleEndian := false]
- 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.
- 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 changed:
----- Method: MOFile>>loadString:pointer:length: (in category 'private') -----
loadString: strm pointer: top length: len
| str |
+ str := ByteString new: len.
- str _ ByteString new: len.
strm position: top.
strm nextInto: str.
^str replaceAll: Lf with: Cr.
!
Item was changed:
----- 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.
- 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.
- len _ self nextInt32From: strm.
- offset _ self nextInt32From: strm.
offsetTable at: index put: offset.
lenTable at: index put: len.
].
+ tupple := Array new: 2.
- tupple _ Array new: 2.
tupple at: 1 put: offsetTable.
tupple at: 2 put: lenTable.
^tupple
!
Item was changed:
----- 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.
- offsetTable _ tupple first.
- lenTable _ tupple second.
- strings _ Array new: nStrings.
1 to: nStrings do: [:index |
+ rawStr := self loadString: strm
- rawStr _ self loadString: strm
pointer: (offsetTable at: index)
length: (lenTable at: index).
+ str := encodingName isNil ifTrue: [rawStr]
- 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 changed:
----- Method: MOFile>>searchByDictionary: (in category 'public') -----
searchByDictionary: aString
| index |
+ index := translations at: aString ifAbsent: [^nil].
- index _ translations at: aString ifAbsent: [^nil].
^self translatedString: index
!
Item was changed:
----- 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 ).
- 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 _ self originalString: nstr.
key = aString ifTrue: [^self translatedString: nstr].
index >= (hashTableSize - incr)
+ ifTrue: [index := index - (hashTableSize - incr) ]
+ ifFalse:[index := index + incr].
- ifTrue: [index _ index - (hashTableSize - incr) ]
- ifFalse:[index _ index + incr].
] doWhileTrue: true.!
Item was changed:
----- Method: MOFile>>translateByHash: (in category 'experimental') -----
translateByHash: aString
| trans |
+ trans := self searchByHash: aString.
- trans _ self searchByHash: aString.
trans isNil ifTrue: [^aString]
ifFalse: [^trans].
!
Item was changed:
----- Method: MOFile>>translatedString: (in category 'private') -----
translatedString: index
"KNOWN PROBLEM: conversion is executed everytimes this method called"
| str |
+ str := translatedStrings at: index.
- str _ translatedStrings at: index.
^str utf8ToSqueak applyLanguageInfomation: (Locale localeID: localeID) languageEnvironment.
!
Item was changed:
----- Method: NaturalLanguageFormTranslator class>>loadFormsFrom: (in category 'i/o') -----
loadFormsFrom: aStream
| rr pair inst |
+ rr := ReferenceStream on: aStream.
+ pair := rr next.
+ inst := self localeID: (LocaleID isoString: pair first).
- rr _ ReferenceStream on: aStream.
- pair _ rr next.
- inst _ self localeID: (LocaleID isoString: pair first).
pair second associationsDo: [:assoc |
inst name: assoc key form: assoc value.
].
^ inst.
!
Item was changed:
----- Method: NaturalLanguageFormTranslator>>saveFormsOn: (in category 'i/o') -----
saveFormsOn: aStream
| rr |
+ rr := ReferenceStream on: aStream.
- rr _ ReferenceStream on: aStream.
rr nextPut: {id isoString. generics}.
rr close.
!
Item was changed:
----- Method: NaturalLanguageTranslator class>>translateWithoutLoading:toLocaleID:inDomain: (in category 'translation') -----
translateWithoutLoading: aString toLocaleID: localeID inDomain: aDomainName
"try to translate with small footprint:
if GetTextTranslator hasn't loaded MO, try to use InternalTranslator.
if InternalTranslator isn't available, then actually load MO and use it"
| translator |
+ translator := self availableForLocaleID: localeID.
- translator _ self availableForLocaleID: localeID.
(translator isDomainLoaded: aDomainName) ifFalse: [
(InternalTranslator availableLanguageLocaleIDs includes: localeID)
+ ifTrue: [translator := InternalTranslator localeID: localeID].
- ifTrue: [translator _ InternalTranslator localeID: localeID].
].
^translator translate: aString inDomain: aDomainName!
Item was changed:
----- Method: String>>translatedIfCorresponds (in category '*gettext') -----
translatedIfCorresponds
"answer the receiver translated to the default language only if
+ the receiver begins and ends with an underscore (:=)"
+ ^ (':=*:=' match: self)
- the receiver begins and ends with an underscore (_)"
- ^ ('_*_' match: self)
ifTrue: [(self copyFrom: 2 to: self size - 1) translated]
ifFalse: [self]!
Item was changed:
----- Method: TranslatedReceiverFinder>>stringReceiversWithContext (in category 'accessing') -----
stringReceiversWithContext
| mrs results rr cls mn t o |
+ mrs := SystemNavigation default allCallsOn: #translated.
+ results := OrderedCollection new.
- mrs _ SystemNavigation default allCallsOn: #translated.
- results _ OrderedCollection new.
mrs do: [:mr |
+ rr := OrderedCollection new.
+ cls := Smalltalk at: mr classSymbol.
- rr _ OrderedCollection new.
- cls _ Smalltalk at: mr classSymbol.
rr add: cls category.
rr add: mr classSymbol.
rr add: mr methodSymbol.
mr classIsMeta ifTrue: [
+ mn := cls class decompile: mr methodSymbol.
- mn _ cls class decompile: mr methodSymbol.
] ifFalse: [
+ mn := cls decompile: mr methodSymbol.
- mn _ cls decompile: mr methodSymbol.
].
+ o := OrderedCollection new.
+ t := Set new.
- o _ OrderedCollection new.
- t _ Set new.
self searchMessageNode: mn addTo: t.
t do: [ :te |
(te receiver isMemberOf: LiteralNode) ifTrue: [
o add: te receiver key.
].
].
o ifNotEmpty: [
rr add: o.
results add: rr.
].
].
^ results.
!
Item was changed:
----- Method: TranslatedReceiverFinder>>stringReceiversWithContext: (in category 'accessing') -----
stringReceiversWithContext: aSymbol
"Find string receivers for a symbol.
Answer a collection of aMethodReference -> {keyword. keyword...}"
"self new stringReceiversWithContext: #translated"
| keywords methodReferences |
+ methodReferences := SystemNavigation default allCallsOn: aSymbol.
- methodReferences _ SystemNavigation default allCallsOn: aSymbol.
^ methodReferences inject: OrderedCollection new into: [:list :next |
keywords := self findWordsWith: aSymbol in: next.
keywords
ifNotEmpty: [list add: next -> keywords].
list]
!
More information about the Squeak-dev
mailing list
|