[Pkg] The Trunk: System-edc.474.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Mar 29 10:55:53 UTC 2012


Edgar J. De Cleene uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-edc.474.mcz

==================== Summary ====================

Name: System-edc.474
Author: edc
Time: 29 March 2012, 7:56:22.086 am
UUID: 50ce2068-fc68-4a19-9f8c-9334c1a501f4
Ancestors: System-bf.473

{InternalTranslator ISOLanguageDefinition Locale LocaleID NaturalLanguageFormTranslator NaturalLanguageTranslator}

Moved back to System-Localization

=============== Diff against System-bf.473 ===============

Item was added:
+ Object subclass: #ISOLanguageDefinition
+ 	instanceVariableNames: 'iso3 iso2 iso3Alternate language'
+ 	classVariableNames: 'ISO2Countries ISO2Table ISO3Countries ISO3Table'
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>buildIso3166CodesTables (in category 'private') -----
+ buildIso3166CodesTables
+ 	"ISOLanguageDefinition buildIso3166CodesTables"
+ 	| rawdata stream country isoa2 isoa3 unNumeric macName macCode windowsName windowsCode empty table |
+ 	rawdata := self iso3166Codes.
+ 	table := OrderedCollection new: 200. 
+ 	stream := rawdata readStream.
+ 	empty := 160 asCharacter asString.
+ 	[stream atEnd] whileFalse: 
+ 		[country := stream nextLine.
+ 		isoa2 := stream nextLine.
+ 		isoa3 := stream nextLine.
+ 		unNumeric := stream nextLine.
+ 		windowsName := stream nextLine.
+ 		windowsName = empty ifTrue: [windowsName := nil].
+ 		windowsCode := stream nextLine. 
+ 		windowsCode = empty ifTrue: [windowsCode := nil].
+ 		macName := stream nextLine.
+ 		macName = empty ifTrue: [macName := nil].
+ 		macCode := stream nextLine.
+ 		macCode = empty ifTrue: [macCode := nil].
+ 		table add: { country.  isoa2. isoa3.  unNumeric. windowsName.  windowsCode.  macName. macCode. }].
+ 	^table!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>extraCountryDefinitions (in category 'private') -----
+ extraCountryDefinitions
+ 	^{
+ 	{'Kids'. 'KIDS'. 'KIDS'.}.
+ 	}!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>extraISO3Definitions (in category 'private') -----
+ extraISO3Definitions
+ 
+ 	^self readISOLanguagesFrom: 'jpk		Japanese (Kids)
+ ' readStream!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>initISO3LanguageTable (in category 'private') -----
+ initISO3LanguageTable
+ 	"ISOLanguageDefinition initIso3LanguageTable"
+ 
+ 	| table |
+ 	table := ISOLanguageDefinition readISOLanguagesFrom: ISOLanguageDefinition isoLanguages readStream.
+ 	table addAll: self extraISO3Definitions.
+ 	^table!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>initISOCountries (in category 'private') -----
+ initISOCountries
+ 	"ISOLanguageDefinition initISOCountries"
+ 	| iso3166Table |
+ 	iso3166Table := ISOLanguageDefinition buildIso3166CodesTables.
+ 	ISO2Countries := Dictionary new.
+ 	ISO3Countries := Dictionary new.
+ 	iso3166Table do: [:entry | 
+ 		ISO2Countries at: (entry at: 2) put: (entry at: 1).
+ 		ISO3Countries at: (entry at: 3) put: (entry at: 1)].
+ 	self extraCountryDefinitions do: [:entry | 
+ 		ISO2Countries at: (entry at: 2) put: (entry at: 1).
+ 		ISO3Countries at: (entry at: 3) put: (entry at: 1)]!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>initialize (in category 'class initialization') -----
+ initialize
+ 	"ISOLanguageDefinition initialize"
+ 
+ 	ISO3Table := nil.
+ 	ISO2Table := nil!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso2Countries (in category 'private') -----
+ iso2Countries
+ 	"ISOLanguageDefinition iso2Countries"
+ 	"ISO2Countries := nil. ISO3Countries := nil"
+ 
+ 	ISO2Countries ifNil: [self initISOCountries].
+ 	^ISO2Countries!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso2LanguageDefinition: (in category 'accessing') -----
+ iso2LanguageDefinition: aString
+ 	^self iso2LanguageTable at: aString!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso2LanguageTable (in category 'private') -----
+ iso2LanguageTable
+ 	"ISOLanguageDefinition iso2LanguageTable"
+ 
+ 	ISO2Table ifNotNil: [^ISO2Table].
+ 	ISO2Table := Dictionary new: self iso3LanguageTable basicSize.
+ 	self iso3LanguageTable do: [:entry |
+ 		ISO2Table at: entry iso2 put: entry].
+ 	^ISO2Table!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso3166Codes (in category 'private') -----
+ iso3166Codes
+ "http://www.unicode.org/onlinedat/countries.html"
+ 
+ ^'­LAND ISLANDS
+ AX
+ 
+ 
+ †
+ †
+ †
+ †
+ AFGHANISTAN
+ AF
+ AFG
+ 004
+ †
+ †
+ †
+ †
+ ALBANIA
+ AL
+ ALB
+ 008
+ CTRY_ALBANIA
+ 355
+ †
+ †
+ ALGERIA
+ DZ
+ DZA
+ 012
+ CTRY_ALGERIA
+ 213
+ verArabic
+ 16
+ AMERICAN SAMOA
+ AS
+ ASM
+ 016
+ †
+ †
+ †
+ †
+ ANDORRA
+ AD
+ AND
+ 020
+ †
+ †
+ †
+ †
+ ANGOLA
+ AO
+ AGO
+ 024
+ †
+ †
+ †
+ †
+ ANGUILLA
+ AI
+ AIA
+ 660
+ †
+ †
+ †
+ †
+ ANTARCTICA
+ AQ
+ ATA
+ 010
+ †
+ †
+ †
+ †
+ ANTIGUA AND BARBUDA
+ AG
+ ATG
+ 028
+ †
+ †
+ †
+ †
+ ARGENTINA
+ AR
+ ARG
+ 032
+ CTRY_ARGENTINA
+ 54
+ †
+ †
+ ARMENIA
+ AM
+ ARM
+ 051
+ CTRY_ARMENIA
+ 374
+ verArmenian
+ 84
+ ARUBA
+ AW
+ ABW
+ 533
+ †
+ †
+ †
+ †
+ AUSTRALIA
+ AU
+ AUS
+ 036
+ CTRY_AUSTRALIA
+ 61
+ verAustralia
+ 15
+ AUSTRIA
+ AT
+ AUT
+ 040
+ CTRY_AUSTRIA
+ 43
+ verAustria
+ 92
+ AZERBAIJAN
+ AZ
+ AZE
+ 031
+ CTRY_AZERBAIJAN
+ 994
+ †
+ †
+ BAHAMAS
+ BS
+ BHS
+ 044
+ †
+ †
+ †
+ †
+ BAHRAIN
+ BH
+ BHR
+ 048
+ CTRY_BAHRAIN
+ 973
+ †
+ †
+ BANGLADESH
+ BD
+ BGD
+ 050
+ †
+ †
+ verBengali
+ 60
+ BARBADOS
+ BB
+ BRB
+ 052
+ †
+ †
+ †
+ †
+ BELARUS
+ BY
+ BLR
+ 112
+ CTRY_BELARUS
+ 375
+ †
+ †
+ BELGIUM
+ BE
+ BEL
+ 056
+ CTRY_BELGIUM
+ 32
+ verFrBelgium, verFlemish
+ 98
+ BELIZE
+ BZ
+ BLZ
+ 084
+ CTRY_BELIZE
+ 501
+ †
+ †
+ BENIN
+ BJ
+ BEN
+ 204
+ †
+ †
+ †
+ †
+ BERMUDA
+ BM
+ BMU
+ 060
+ †
+ †
+ †
+ †
+ BHUTAN
+ BT
+ BTN
+ 064
+ †
+ †
+ verBhutan
+ 83
+ BOLIVIA
+ BO
+ BOL
+ 068
+ CTRY_BOLIVIA
+ 591
+ †
+ †
+ BOSNIA AND HERZEGOVINA
+ BA
+ BIH
+ 070
+ †
+ †
+ †
+ †
+ BOTSWANA
+ BW
+ BWA
+ 072
+ †
+ †
+ †
+ †
+ BOUVET ISLAND
+ BV
+ BVT
+ 074
+ †
+ †
+ †
+ †
+ BRAZIL
+ BR
+ BRA
+ 076
+ CTRY_BRAZIL
+ 55
+ verBrazil
+ 71
+ BRITISH INDIAN OCEAN TERRITORY
+ IO
+ IOT
+ 086
+ †
+ †
+ †
+ †
+ BRUNEI DARUSSALAM
+ BN
+ BRN
+ 096
+ CTRY_BRUNEI_DARUSSALAM
+ 673
+ †
+ †
+ BULGARIA
+ BG
+ BGR
+ 100
+ CTRY_BULGARIA
+ 359
+ verBulgaria†
+ 72
+ BURKINA FASO
+ BF
+ BFA
+ 854
+ †
+ †
+ †
+ †
+ BURUNDI
+ BI
+ BDI
+ 108
+ †
+ †
+ †
+ †
+ CAMBODIA
+ KH
+ KHM
+ 116
+ †
+ †
+ †
+ †
+ CAMEROON
+ CM
+ CMR
+ 120
+ †
+ †
+ †
+ †
+ CANADA
+ CA
+ CAN
+ 124
+ CTRY_CANADA
+ 2
+ verFrCanada, verEndCanada
+ 82
+ CAPE VERDE
+ CV
+ CPV
+ 132
+ †
+ †
+ †
+ †
+ CAYMAN ISLANDS
+ KY
+ CYM
+ 136
+ †
+ †
+ †
+ †
+ CENTRAL AFRICAN REPUBLIC
+ CF
+ CAF
+ 140
+ †
+ †
+ †
+ †
+ CHAD
+ TD
+ TCD
+ 148
+ †
+ †
+ †
+ †
+ CHILE
+ CL
+ CHL
+ 152
+ CTRY_CHILE
+ 56
+ †
+ †
+ CHINA
+ CN
+ CHN
+ 156
+ CTRY_PRCHINA
+ 86
+ verChina
+ 52
+ CHRISTMAS ISLAND
+ CX
+ CXR
+ 162
+ †
+ †
+ †
+ †
+ COCOS (KEELING) ISLANDS
+ CC
+ CCK
+ 166
+ †
+ †
+ †
+ †
+ COLOMBIA
+ CO
+ COL
+ 170
+ CTRY_COLOMBIA
+ 57
+ †
+ †
+ COMOROS
+ KM
+ COM
+ 174
+ †
+ †
+ †
+ †
+ CONGO
+ CG
+ COG
+ 178
+ †
+ †
+ †
+ †
+ CONGO, THE DEMOCRATIC REPUBLIC OF THE
+ CD
+ 
+ 
+ †
+ †
+ †
+ †
+ COOK ISLANDS
+ CK
+ COK
+ 184
+ †
+ †
+ †
+ †
+ COSTA RICA
+ CR
+ CRI
+ 188
+ CTRY_COSTA_RICA
+ 506
+ †
+ †
+ COTE D''IVOIRE
+ CI
+ CIV
+ 384
+ †
+ †
+ †
+ †
+ CROATIA (local name: Hrvatska)
+ HR
+ HRV
+ 191
+ CTRY_CROATIA
+ 385
+ verCroatia, verYugoCroatian
+ 68 (c), 25 (y)
+ CUBA
+ CU
+ CUB
+ 192
+ †
+ †
+ †
+ †
+ CYPRUS
+ CY
+ CYP
+ 196
+ †
+ †
+ verCyprus
+ 23
+ CZECH REPUBLIC
+ CZ
+ CZE
+ 203
+ CTRY_CZECH
+ 420
+ verCzech†
+ 56
+ DENMARK
+ DK
+ DNK
+ 208
+ CTRY_DENMARK
+ 45
+ verDenmark(da), verFaeroeIsl(fo)
+ 9(da), 47(fo)
+ DJIBOUTI
+ DJ
+ DJI
+ 262
+ †
+ †
+ †
+ †
+ DOMINICA
+ DM
+ DMA
+ 212
+ †
+ †
+ †
+ †
+ DOMINICAN REPUBLIC
+ DO
+ DOM
+ 214
+ CTRY_DOMINICAN_REPUBLIC
+ 1
+ †
+ †
+ EAST TIMOR
+ TL
+ TLS
+ 626
+ †
+ †
+ †
+ †
+ ECUADOR
+ EC
+ ECU
+ 218
+ CTRY_ECUADOR
+ 593
+ †
+ †
+ EGYPT
+ EG
+ EGY
+ 818
+ CTRY_EGYPT
+ 20
+ verArabic
+ 16
+ EL SALVADOR
+ SV
+ SLV
+ 222
+ CTRY_EL_SALVADOR
+ 503
+ †
+ †
+ EQUATORIAL GUINEA
+ GQ
+ GNQ
+ 226
+ †
+ †
+ †
+ †
+ ERITREA
+ ER
+ ERI
+ 232
+ †
+ †
+ †
+ †
+ ESTONIA
+ EE
+ EST
+ 233
+ CTRY_ESTONIA
+ 372
+ verEstonia
+ 44
+ ETHIOPIA
+ ET
+ ETH
+ 210
+ †
+ †
+ †
+ †
+ FALKLAND ISLANDS (MALVINAS)
+ FK
+ FLK
+ 238
+ †
+ †
+ †
+ †
+ FAROE ISLANDS
+ FO
+ FRO
+ 234
+ CTRY_FAEROE_ISLANDS
+ 298
+ †
+ †
+ FIJI
+ FJ
+ FJI
+ 242
+ †
+ †
+ †
+ †
+ FINLAND
+ FI
+ FIN
+ 246
+ CTRY_FINLAND
+ 358
+ verFinland
+ 17
+ FRANCE
+ FR
+ FRA
+ 250
+ CTRY_FRANCE
+ 33
+ verFrance
+ 1
+ FRANCE, METROPOLITAN
+ FX
+ FXX
+ 249
+ †
+ †
+ †
+ †
+ FRENCH GUIANA
+ GF
+ GUF
+ 254
+ †
+ †
+ †
+ †
+ FRENCH POLYNESIA
+ PF
+ PYF
+ 258
+ †
+ †
+ †
+ †
+ FRENCH SOUTHERN TERRITORIES
+ TF
+ ATF
+ 260
+ †
+ †
+ †
+ †
+ GABON
+ GA
+ GAB
+ 266
+ †
+ †
+ †
+ †
+ GAMBIA
+ GM
+ GMB
+ 270
+ †
+ †
+ †
+ †
+ GEORGIA
+ GE
+ GEO
+ 268
+ CTRY_GEORGIA
+ 995
+ verGeorgian
+ 85
+ GERMANY
+ DE
+ DEU
+ 276
+ CTRY_GERMANY
+ 49
+ verGermany
+ 3
+ GHANA
+ GH
+ GHA
+ 288
+ †
+ †
+ †
+ †
+ GIBRALTAR
+ GI
+ GIB
+ 292
+ †
+ †
+ †
+ †
+ GREECE
+ GR
+ GRC
+ 300
+ CTRY_GREECE
+ 30
+ verGreece, verGreecePoly
+ 20, 40
+ GREENLAND
+ GL
+ GRL
+ 304
+ †
+ †
+ verGreenland
+ 107
+ GRENADA
+ GD
+ GRD
+ 308
+ †
+ †
+ †
+ †
+ GUADELOUPE
+ GP
+ GLP
+ 312
+ †
+ †
+ †
+ †
+ GUAM
+ GU
+ GUM
+ 316
+ †
+ †
+ †
+ †
+ GUATEMALA
+ GT
+ GTM
+ 320
+ CTRY_GUATEMALA
+ 502
+ †
+ †
+ GUINEA
+ GN
+ GIN
+ 324
+ †
+ †
+ †
+ †
+ GUINEA-BISSAU
+ GW
+ GNB
+ 624
+ †
+ †
+ †
+ †
+ GUYANA
+ GY
+ GUY
+ 328
+ †
+ †
+ †
+ †
+ HAITI
+ HT
+ HTI
+ 332
+ †
+ †
+ †
+ †
+ HEARD ISLAND & MCDONALD ISLANDS
+ HM
+ HMD
+ 334
+ †
+ †
+ †
+ †
+ HONDURAS
+ HN
+ HND
+ 340
+ CTRY_HONDURAS
+ 504
+ †
+ †
+ HONG KONG
+ HK
+ HKG
+ 344
+ CTRY_HONG_KONG
+ 852
+ †
+ †
+ HUNGARY
+ HU
+ HUN
+ 348
+ CTRY_HUNGARY
+ 36
+ verHungary
+ 43
+ ICELAND
+ IS
+ ISL
+ 352
+ CTRY_ICELAND
+ 354
+ verIceland
+ 21
+ INDIA
+ IN
+ IND
+ 356
+ CTRY_INDIA
+ 91
+ verIndiaHindi(hi)
+ 33
+ INDONESIA
+ ID
+ IDN
+ 360
+ CTRY_INDONESIA
+ 62
+ †
+ †
+ IRAN, ISLAMIC REPUBLIC OF
+ IR
+ IRN
+ 364
+ CTRY_IRAN
+ 981
+ verIran
+ 48
+ IRAQ
+ IQ
+ IRQ
+ 368
+ CTRY_IRAQ
+ 964
+ verArabic
+ 16
+ IRELAND
+ IE
+ IRL
+ 372
+ CTRY_IRELAND
+ 353
+ verIreland
+ 50
+ ISRAEL
+ IL
+ ISR
+ 376
+ CTRY_ISRAEL
+ 972
+ verIsrael
+ 13
+ ITALY
+ IT
+ ITA
+ 380
+ CTRY_ITALY
+ 39
+ verItaly
+ 4
+ JAMAICA
+ JM
+ JAM
+ 388
+ CTRY_JAMAICA
+ 1
+ †
+ †
+ JAPAN
+ JP
+ JPN
+ 392
+ CTRY_JAPAN
+ 81
+ verJapan
+ 14
+ JORDAN
+ JO
+ JOR
+ 400
+ CTRY_JORDAN
+ 962
+ †
+ †
+ KAZAKHSTAN
+ KZ
+ KAZ
+ 398
+ CTRY_KAZAKSTAN
+ 7
+ †
+ †
+ KENYA
+ KE
+ KEN
+ 404
+ CTRY_KENYA
+ 254
+ †
+ †
+ KIRIBATI
+ KI
+ KIR
+ 296
+ †
+ †
+ †
+ †
+ KOREA, DEMOCRATIC PEOPLE''S REPUBLIC OF
+ KP
+ PRK
+ 408
+ †
+ †
+ verKorea
+ 51
+ KOREA, REPUBLIC OF
+ KR
+ KOR
+ 410
+ CTRY_SOUTH_KOREA
+ 82
+ verKorea
+ †
+ KUWAIT
+ KW
+ KWT
+ 414
+ CTRY_KUWAIT
+ 965
+ †
+ †
+ KYRGYZSTAN
+ KG
+ KGZ
+ 417
+ CTRY_KYRGYZSTAN
+ 996
+ †
+ †
+ LAO PEOPLE''S DEMOCRATIC REPUBLIC
+ LA
+ LAO
+ 418
+ †
+ †
+ †
+ †
+ LATVIA
+ LV
+ LVA
+ 428
+ CTRY_LATVIA
+ 371
+ verLatvia
+ 45
+ LEBANON
+ LB
+ LBN
+ 422
+ CTRY_LEBANON
+ 961
+ †
+ †
+ LESOTHO
+ LS
+ LSO
+ 426
+ †
+ †
+ †
+ †
+ LIBERIA
+ LR
+ LBR
+ 430
+ †
+ †
+ †
+ †
+ LIBYAN ARAB JAMAHIRIYA
+ LY
+ LBY
+ 434
+ CTRY_LIBYA
+ 218
+ verArabic
+ 16
+ LIECHTENSTEIN
+ LI
+ LIE
+ 438
+ CTRY_LIECHTENSTEIN
+ 41
+ †
+ †
+ LITHUANIA
+ LT
+ LTU
+ 440
+ CTRY_LITHUANIA
+ 370
+ verLithuania
+ 41
+ LUXEMBOURG
+ LU
+ LUX
+ 442
+ CTRY_LUXEMBOURG
+ 352
+ verFrBelgiumLux
+ 6
+ MACAU
+ MO
+ MAC
+ 446
+ CTRY_MACAU
+ 853
+ †
+ †
+ MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF
+ MK
+ MKD
+ 807
+ CTRY_MACEDONIA
+ 389
+ verMacedonian
+ †
+ MADAGASCAR
+ MG
+ MDG
+ 450
+ †
+ †
+ †
+ †
+ MALAWI
+ MW
+ MWI
+ 454
+ †
+ †
+ †
+ †
+ MALAYSIA
+ MY
+ MYS
+ 458
+ CTRY_MALAYSIA
+ 60
+ †
+ †
+ MALDIVES
+ MV
+ MDV
+ 462
+ CTRY_MALDIVES
+ 960
+ †
+ †
+ MALI
+ ML
+ MLI
+ 466
+ †
+ †
+ †
+ †
+ MALTA
+ MT
+ MLT
+ 470
+ †
+ †
+ verMalta
+ 22
+ MARSHALL ISLANDS
+ MH
+ MHL
+ 584
+ †
+ †
+ †
+ †
+ MARTINIQUE
+ MQ
+ MTQ
+ 474
+ †
+ †
+ †
+ †
+ MAURITANIA
+ MR
+ MRT
+ 478
+ †
+ †
+ †
+ †
+ MAURITIUS
+ MU
+ MUS
+ 480
+ †
+ †
+ †
+ †
+ MAYOTTE
+ YT
+ MYT
+ 175
+ †
+ †
+ †
+ †
+ MEXICO
+ MX
+ MEX
+ 484
+ CTRY_MEXICO
+ 52
+ †
+ †
+ MICRONESIA, FEDERATED STATES OF
+ FM
+ FSM
+ 583
+ †
+ †
+ †
+ †
+ MOLDOVA, REPUBLIC OF
+ MD
+ MDA
+ 498
+ †
+ †
+ †
+ †
+ MONACO
+ MC
+ MCO
+ 492
+ CTRY_MONACO
+ 33
+ †
+ †
+ MONGOLIA
+ MN
+ MNG
+ 496
+ CTRY_MONGOLIA
+ 976
+ †
+ †
+ MONTSERRAT
+ MS
+ MSR
+ 500
+ †
+ †
+ †
+ †
+ MOROCCO
+ MA
+ MAR
+ 504
+ CTRY_MOROCCO
+ 212
+ verArabic
+ 16
+ MOZAMBIQUE
+ MZ
+ MOZ
+ 508
+ †
+ †
+ †
+ †
+ MYANMAR
+ MM
+ MMR
+ 104
+ †
+ †
+ †
+ †
+ NAMIBIA
+ NA
+ NAM
+ 516
+ †
+ †
+ †
+ †
+ NAURU
+ NR
+ NRU
+ 520
+ †
+ †
+ †
+ †
+ NEPAL
+ NP
+ NPL
+ 524
+ †
+ †
+ verNepal
+ 106
+ NETHERLANDS
+ NL
+ NLD
+ 528
+ CTRY_NETHERLANDS
+ 31
+ verNetherlands
+ 5
+ NETHERLANDS ANTILLES
+ AN
+ ANT
+ 530
+ †
+ †
+ †
+ †
+ NEW CALEDONIA
+ NC
+ NCL
+ 540
+ †
+ †
+ †
+ †
+ NEW ZEALAND
+ NZ
+ NZL
+ 554
+ CTRY_NEW_ZEALAND
+ 64
+ †
+ †
+ NICARAGUA
+ NI
+ NIC
+ 558
+ CTRY_NICARAGUA
+ 505
+ †
+ †
+ NIGER
+ NE
+ NER
+ 562
+ †
+ †
+ †
+ †
+ NIGERIA
+ NG
+ NGA
+ 566
+ †
+ †
+ †
+ †
+ NIUE
+ NU
+ NIU
+ 570
+ †
+ †
+ †
+ †
+ NORFOLK ISLAND
+ NF
+ NFK
+ 574
+ †
+ †
+ †
+ †
+ NORTHERN MARIANA ISLANDS
+ MP
+ MNP
+ 580
+ †
+ †
+ †
+ †
+ NORWAY
+ NO
+ NOR
+ 578
+ CTRY_NORWAY
+ 47
+ verNorway
+ 12
+ OMAN
+ OM
+ OMN
+ 512
+ CTRY_OMAN
+ 968
+ †
+ †
+ PAKISTAN
+ PK
+ PAK
+ 586
+ CTRY_PAKISTAN
+ 92
+ verPakistanUrdu, verPunjabi
+ 34 (U), 95 (P)
+ PALAU
+ PW
+ PLW
+ 585
+ †
+ †
+ †
+ †
+ PANAMA
+ PA
+ PAN
+ 591
+ CTRY_PANAMA
+ 507
+ †
+ †
+ PALESTINIAN TERRITORY, OCCUPIED
+ PS
+ 
+ 
+ 
+ 
+ †
+ †
+ PAPUA NEW GUINEA
+ PG
+ PNG
+ 598
+ †
+ †
+ †
+ †
+ PARAGUAY
+ PY
+ PRY
+ 600
+ CTRY_PARAGUAY
+ 595
+ †
+ †
+ PERU
+ PE
+ PER
+ 604
+ CTRY_PERU
+ 51
+ †
+ †
+ PHILIPPINES
+ PH
+ PHL
+ 608
+ CTRY_PHILIPPINES
+ 63
+ †
+ †
+ PITCAIRN
+ PN
+ PCN
+ 612
+ †
+ †
+ †
+ †
+ POLAND
+ PL
+ POL
+ 616
+ CTRY_POLAND
+ 48
+ verPoland
+ 42
+ PORTUGAL
+ PT
+ PRT
+ 620
+ CTRY_PORTUGAL
+ 351
+ verPortugal
+ 10
+ PUERTO RICO
+ PR
+ PRI
+ 630
+ CTRY_PUERTO_RICO
+ 1
+ †
+ †
+ QATAR
+ QA
+ QAT
+ 634
+ CTRY_QATAR
+ 974
+ †
+ †
+ REUNION
+ RE
+ REU
+ 638
+ †
+ †
+ †
+ †
+ ROMANIA
+ RO
+ ROU*
+ 642
+ CTRY_ROMANIA
+ 40
+ verRomania
+ 39
+ RUSSIAN FEDERATION
+ RU
+ RUS
+ 643
+ CTRY_RUSSIA
+ 7
+ verRussia
+ 49
+ RWANDA
+ RW
+ RWA
+ 646
+ †
+ †
+ †
+ †
+ SAINT KITTS AND NEVIS
+ KN
+ KNA
+ 659
+ †
+ †
+ †
+ †
+ SAINT LUCIA
+ LC
+ LCA
+ 662
+ †
+ †
+ †
+ †
+ SAINT VINCENT AND THE GRENADINES
+ VC
+ VCT
+ 670
+ †
+ †
+ †
+ †
+ SAMOA
+ WS
+ WSM
+ 882
+ †
+ †
+ †
+ †
+ SAN MARINO
+ SM
+ SMR
+ 674
+ †
+ †
+ †
+ †
+ SAO TOME AND PRINCIPE
+ ST
+ STP
+ 678
+ †
+ †
+ †
+ †
+ SAUDI ARABIA
+ SA
+ SAU
+ 682
+ CTRY_SAUDI_ARABIA
+ 966
+ verArabic
+ 16
+ SENEGAL
+ SN
+ SEN
+ 686
+ †
+ †
+ †
+ †
+ SERBIA AND MONTENEGRO
+ CS
+ †
+ †
+ CTRY_SERBIA
+ 381
+ †
+ †
+ SEYCHELLES
+ SC
+ SYC
+ 690
+ †
+ †
+ †
+ †
+ SIERRA LEONE
+ SL
+ SLE
+ 694
+ †
+ †
+ †
+ †
+ SINGAPORE
+ SG
+ SGP
+ 702
+ CTRY_SINGAPORE
+ 65
+ verSingapore
+ 100
+ SLOVAKIA (Slovak Republic)
+ SK
+ SVK
+ 703
+ CTRY_SLOVAK
+ 421
+ verSlovak
+ 57†
+ SLOVENIA
+ SI
+ SVN
+ 705
+ CTRY_SLOVENIA
+ 386
+ verSlovenian
+ 66
+ SOLOMON ISLANDS
+ SB
+ SLB
+ 90
+ †
+ †
+ †
+ †
+ SOMALIA
+ SO
+ SOM
+ 706
+ †
+ †
+ †
+ †
+ SOUTH AFRICA
+ ZA
+ ZAF
+ 710
+ CTRY_SOUTH_AFRICA
+ 27
+ †
+ †
+ SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
+ GS
+ 
+ 
+ 
+ 
+ †
+ †
+ SPAIN
+ ES
+ ESP
+ 724
+ CTRY_SPAIN
+ 34
+ verSpain
+ 8
+ SRI LANKA
+ LK
+ LKA
+ 144
+ †
+ †
+ †
+ †
+ SAINT HELENA
+ SH
+ SHN
+ 654
+ †
+ †
+ †
+ †
+ SAINT PIERRE AND MIQUELON
+ PM
+ SPM
+ 666
+ †
+ †
+ †
+ †
+ SUDAN
+ SD
+ SDN
+ 736
+ †
+ †
+ †
+ †
+ SURINAME
+ SR
+ SUR
+ 740
+ †
+ †
+ †
+ †
+ SVALBARD AND JAN MAYEN ISLANDS
+ SJ
+ SJM
+ 744
+ †
+ †
+ †
+ †
+ SWAZILAND
+ SZ
+ SWZ
+ 748
+ †
+ †
+ †
+ †
+ SWEDEN
+ SE
+ SWE
+ 752
+ CTRY_SWEDEN
+ 46
+ verSweden
+ 7
+ SWITZERLAND
+ CH
+ CHE
+ 756
+ CTRY_SWITZERLAND
+ 41
+ verFrSwiss(fr), verGrSwiss(de)
+ 18(fr), 19(de)
+ SYRIAN ARAB REPUBLIC
+ SY
+ SYR
+ 760
+ CTRY_SYRIA
+ 963
+ †
+ †
+ TAIWAN, PROVINCE OF CHINA
+ TW
+ TWN
+ 158
+ CTRY_TAIWAN
+ 886
+ verTaiwan
+ 53
+ TAJIKISTAN
+ TJ
+ TJK
+ 762
+ †
+ †
+ †
+ †
+ TANZANIA, UNITED REPUBLIC OF
+ TZ
+ TZA
+ 834
+ †
+ †
+ †
+ †
+ TATARSTAN
+ 
+ 
+ †
+ CTRY_TATARSTAN
+ 7
+ †
+ †
+ THAILAND
+ TH
+ THA
+ 764
+ CTRY_THAILAND
+ 66
+ verThailand
+ 54
+ TIMOR-LESTE
+ TL
+ 
+ 
+ †
+ †
+ †
+ †
+ TOGO
+ TG
+ TGO
+ 768
+ †
+ †
+ †
+ †
+ TOKELAU
+ TK
+ TKL
+ 772
+ †
+ †
+ †
+ †
+ TONGA
+ TO
+ TON
+ 776
+ †
+ †
+ verTonga
+ 88
+ TRINIDAD AND TOBAGO
+ TT
+ TTO
+ 780
+ CTRY_TRINIDAD_Y_TOBAGO
+ 1
+ †
+ †
+ TUNISIA
+ TN
+ TUN
+ 788
+ CTRY_TUNISIA
+ 216
+ verArabic
+ 16
+ TURKEY
+ TR
+ TUR
+ 792
+ CTRY_TURKEY
+ 90
+ verTurkey
+ 24
+ TURKMENISTAN
+ TM
+ TKM
+ 795
+ †
+ †
+ †
+ †
+ TURKS AND CAICOS ISLANDS
+ TC
+ TCA
+ 796
+ †
+ †
+ †
+ †
+ TUVALU
+ TV
+ TUV
+ 798
+ †
+ †
+ †
+ †
+ UGANDA
+ UG
+ UGA
+ 800
+ †
+ †
+ †
+ †
+ UKRAINE
+ UA
+ UKR
+ 804
+ CTRY_UKRAINE
+ 380
+ verUkraine†
+ 62
+ UNITED ARAB EMIRATES
+ AE
+ ARE
+ 784
+ CTRY_UAE
+ 971
+ †
+ †
+ UNITED KINGDOM
+ GB
+ GBR
+ 826
+ CTRY_UNITED_KINGDOM
+ 44
+ verBritain
+ 2
+ UNITED STATES
+ US
+ USA
+ 840
+ CTRY_UNITED_STATES
+ 1
+ verUS
+ 0
+ UNITED STATES MINOR OUTLYING ISLANDS
+ UM
+ UMI
+ 581
+ †
+ †
+ †
+ †
+ URUGUAY
+ UY
+ URY
+ 858
+ CTRY_URUGUAY
+ 598
+ †
+ †
+ UZBEKISTAN
+ UZ
+ UZB
+ 860
+ CTRY_UZBEKISTAN
+ 7
+ †
+ †
+ VANUATU
+ VU
+ VUT
+ 548
+ †
+ †
+ †
+ †
+ VATICAN CITY STATE (HOLY SEE)
+ VA
+ VAT
+ 336
+ †
+ †
+ †
+ †
+ VENEZUELA
+ VE
+ VEN
+ 862
+ CTRY_VENEZUELA
+ 58
+ †
+ †
+ VIET NAM
+ VN
+ VNM
+ 704
+ CTRY_VIET_NAM
+ 84
+ verVietnam
+ †
+ VIRGIN ISLANDS (BRITISH)
+ VG
+ VGB
+ 92
+ †
+ †
+ †
+ †
+ VIRGIN ISLANDS (U.S.)
+ VI
+ VIR
+ 850
+ †
+ †
+ †
+ †
+ WALLIS AND FUTUNA ISLANDS
+ WF
+ WLF
+ 876
+ †
+ †
+ †
+ †
+ WESTERN SAHARA
+ EH
+ ESH
+ 732
+ †
+ †
+ †
+ †
+ YEMEN
+ YE
+ YEM
+ 887
+ CTRY_YEMEN
+ 967
+ †
+ †
+ YUGOSLAVIA
+ YU
+ YUG
+ 891
+ †
+ †
+ †
+ †
+ ZAIRE
+ ZR
+ ZAR
+ 180
+ †
+ †
+ †
+ †
+ ZAMBIA
+ ZM
+ ZMB
+ 894
+ †
+ †
+ †
+ †
+ ZIMBABWE
+ ZW
+ ZWE
+ 716
+ CTRY_ZIMBABWE
+ 263
+ †
+ †
+ '!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso3Countries (in category 'private') -----
+ iso3Countries
+ 	"ISOLanguageDefinition iso3Countries"
+ 	"ISO2Countries := nil. ISO3Countries := nil"
+ 
+ 	ISO3Countries ifNil: [self initISOCountries].
+ 	^ISO3Countries!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso3LanguageDefinition: (in category 'accessing') -----
+ iso3LanguageDefinition: aString
+ 	^self iso3LanguageTable at: aString!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>iso3LanguageTable (in category 'private') -----
+ iso3LanguageTable
+ 	"ISOLanguageDefinition iso3LanguageTable"
+ 
+ 	^ISO3Table ifNil: [ISO3Table := self initISO3LanguageTable]!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>isoLanguages (in category 'private') -----
+ isoLanguages
+ 	"ISO 639: 3-letter codes"
+ 	^'aar	aa	Afar
+ abk	ab	Abkhazian
+ ace		Achinese
+ ach		Acoli
+ ada		Adangme
+ ady		Adyghe; Adygei
+ afa		Afro-Asiatic languages
+ afh		Afrihili
+ afr	af	Afrikaans
+ ain		Ainu
+ aka	ak	Akan
+ akk		Akkadian
+ alb/sqi	sq	Albanian
+ ale		Aleut
+ alg		Algonquian languages
+ alt		Southern Altai
+ amh	am	Amharic
+ ang		English, Old (ca.450-1100)
+ anp		Angika
+ apa		Apache languages
+ ara	ar	Arabic
+ arc		Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)
+ arg	an	Aragonese
+ arm/hye	hy	Armenian
+ arn		Mapudungun; Mapuche
+ arp		Arapaho
+ art		Artificial languages
+ arw		Arawak
+ asm	as	Assamese
+ ast		Asturian; Bable; Leonese; Asturleonese
+ ath		Athapascan languages
+ aus		Australian languages
+ ava	av	Avaric
+ ave	ae	Avestan
+ awa		Awadhi
+ aym	ay	Aymara
+ aze	az	Azerbaijani
+ bad		Banda languages
+ bai		Bamileke languages
+ bak	ba	Bashkir
+ bal		Baluchi
+ bam	bm	Bambara
+ ban		Balinese
+ baq/eus	eu	Basque
+ bas		Basa
+ bat		Baltic languages
+ bej		Beja; Bedawiyet
+ bel	be	Belarusian
+ bem		Bemba
+ ben	bn	Bengali
+ ber		Berber languages)
+ bho		Bhojpuri
+ bih	bh	Bihari
+ bik		Bikol
+ bin		Bini; Edo
+ bis	bi	Bislama
+ bla		Siksika
+ bnt		Bantu languages
+ bos	bs	Bosnian
+ bra		Braj
+ bre	br	Breton
+ btk		Batak languages
+ bua		Buriat
+ bug		Buginese
+ bul	bg	Bulgarian
+ bur/mya	my	Burmese
+ byn		Blin; Bilin
+ cad		Caddo
+ cai		Central American Indian languages
+ car		Galibi Carib
+ cat	ca	Catalan; Valencian
+ cau		Caucasian languages
+ ceb		Cebuano
+ cel		Celtic languages
+ cha	ch	Chamorro
+ chb		Chibcha
+ che	ce	Chechen
+ chg		Chagatai
+ chi/zho	zh	Chinese
+ chk		Chuukese
+ chm		Mari
+ chn		Chinook jargon
+ cho		Choctaw
+ chp		Chipewyan; Dene Suline
+ chr		Cherokee
+ chu	cu	Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic
+ chv	cv	Chuvash
+ chy		Cheyenne
+ cmc		Chamic languages
+ cop		Coptic
+ cor	kw	Cornish
+ cos	co	Corsican
+ cpe		Creoles and pidgins, English based
+ cpf		Creoles and pidgins, French-based
+ cpp		Creoles and pidgins, Portuguese-based
+ cre	cr	Cree
+ crh		Crimean Tatar; Crimean Turkish
+ crp		Creoles and pidgins
+ csb		Kashubian
+ cus		Cushitic languages
+ cze/ces	cs	Czech
+ dak		Dakota
+ dan	da	Danish
+ dar		Dargwa
+ day		Land Dayak languages
+ del		Delaware
+ den		Slave (Athapascan)
+ dgr		Dogrib
+ din		Dinka
+ div	dv	Divehi; Dhivehi; Maldivian
+ doi		Dogri
+ dra		Dravidian languages
+ dsb		Lower Sorbian
+ dua		Duala
+ dum		Dutch, Middle (ca.1050-1350)
+ dut/nld	nl	Dutch; Flemish
+ dyu		Dyula
+ dzo	dz	Dzongkha
+ efi		Efik
+ egy		Egyptian (Ancient)
+ eka		Ekajuk
+ elx		Elamite
+ eng	en	English
+ enm		English, Middle (1100-1500)
+ epo	eo	Esperanto
+ est	et	Estonian
+ ewe	ee	Ewe
+ ewo		Ewondo
+ fan		Fang
+ fao	fo	Faroese
+ fat		Fanti
+ fij	fj	Fijian
+ fil		Filipino; Pilipino
+ fin	fi	Finnish
+ fiu		Finno-Ugrian languages)
+ fon		Fon
+ fre/fra	fr	French
+ frm		French, Middle (ca.1400-1600)
+ fro		French, Old (842-ca.1400)
+ frr		Northern Frisian
+ frs		Eastern Frisian
+ fry	fy	Western Frisian
+ ful	ff	Fulah
+ fur		Friulian
+ gaa		Ga
+ gay		Gayo
+ gba		Gbaya
+ gem		Germanic languages
+ geo/kat	ka	Georgian
+ ger/deu	de	German
+ gez		Geez
+ gil		Gilbertese
+ gla	gd	Gaelic; Scottish Gaelic
+ gle	ga	Irish
+ glg	gl	Galician
+ glv	gv	Manx
+ gmh		German, Middle High (ca.1050-1500)
+ goh		German, Old High (ca.750-1050)
+ gon		Gondi
+ gor		Gorontalo
+ got		Gothic
+ grb		Grebo
+ grc		Greek, Ancient (to 1453)
+ gre/ell	el	Greek, Modern (1453-)
+ grn	gn	Guarani
+ gsw		Swiss German; Alemannic; Alsatian
+ guj	gu	Gujarati
+ gwi		Gwich''in
+ hai		Haida
+ hat	ht	Haitian; Haitian Creole
+ hau	ha	Hausa
+ haw		Hawaiian
+ heb	he	Hebrew
+ her	hz	Herero
+ hil		Hiligaynon
+ him		Himachali
+ hin	hi	Hindi
+ hit		Hittite
+ hmn		Hmong
+ hmo	ho	Hiri Motu
+ hrv	hr	Croatian
+ hsb		Upper Sorbian
+ hun	hu	Hungarian
+ hup		Hupa
+ iba		Iban
+ ibo	ig	Igbo
+ ice/isl	is	Icelandic
+ ido	io	Ido
+ iii	ii	Sichuan Yi; Nuosu
+ ijo		Ijo languages
+ iku	iu	Inuktitut
+ ile	ie	Interlingue; Occidental
+ ilo		Iloko
+ ina	ia	Interlingua (International Auxiliary Language Association)
+ inc		Indic languages
+ ind	id	Indonesian
+ ine		Indo-European languages
+ inh		Ingush
+ ipk	ik	Inupiaq
+ ira		Iranian languages
+ iro		Iroquoian languages
+ ita	it	Italian
+ jav	jv	Javanese
+ jbo		Lojban
+ jpn	ja	Japanese
+ jpr		Judeo-Persian
+ jrb		Judeo-Arabic
+ kaa		Kara-Kalpak
+ kab		Kabyle
+ kac		Kachin; Jingpho
+ kal	kl	Kalaallisut; Greenlandic
+ kam		Kamba
+ kan	kn	Kannada
+ kar		Karen languages
+ kas	ks	Kashmiri
+ kau	kr	Kanuri
+ kaw		Kawi
+ kaz	kk	Kazakh
+ kbd		Kabardian
+ kha		Khasi
+ khi		Khoisan languages
+ khm	km	Central Khmer
+ kho		Khotanese; Sakan
+ kik	ki	Kikuyu; Gikuyu
+ kin	rw	Kinyarwanda
+ kir	ky	Kirghiz; Kyrgyz
+ kmb		Kimbundu
+ kok		Konkani
+ kom	kv	Komi
+ kon	kg	Kongo
+ kor	ko	Korean
+ kos		Kosraean
+ kpe		Kpelle
+ krc		Karachay-Balkar
+ krl		Karelian
+ kro		Kru languages
+ kru		Kurukh
+ kua	kj	Kuanyama; Kwanyama
+ kum		Kumyk
+ kur	ku	Kurdish
+ kut		Kutenai
+ lad		Ladino
+ lah		Lahnda
+ lam		Lamba
+ lao	lo	Lao
+ lat	la	Latin
+ lav	lv	Latvian
+ lez		Lezghian
+ lim	li	Limburgan; Limburger; Limburgish
+ lin	ln	Lingala
+ lit	lt	Lithuanian
+ lol		Mongo
+ loz		Lozi
+ ltz	lb	Luxembourgish; Letzeburgesch
+ lua		Luba-Lulua
+ lub	lu	Luba-Katanga
+ lug	lg	Ganda
+ lui		Luiseno
+ lun		Lunda
+ luo		Luo (Kenya and Tanzania)
+ lus		Lushai
+ mac/mkd	mk	Macedonian
+ mad		Madurese
+ mag		Magahi
+ mah	mh	Marshallese
+ mai		Maithili
+ mak		Makasar
+ mal	ml	Malayalam
+ man		Mandingo
+ mao/mri	mi	Maori
+ map		Austronesian languages
+ mar	mr	Marathi
+ mas		Masai
+ may/msa	ms	Malay
+ mdf		Moksha
+ mdr		Mandar
+ men		Mende
+ mga		Irish, Middle (900-1200)
+ mic		Mi''kmaq; Micmac
+ min		Minangkabau
+ mis		Uncoded languages
+ mkh		Mon-Khmer languages
+ mlg	mg	Malagasy
+ mlt	mt	Maltese
+ mnc		Manchu
+ mni		Manipuri
+ mno		Manobo languages
+ moh		Mohawk
+ mon	mn	Mongolian
+ mos		Mossi
+ mul		Multiple languages
+ mun		Munda languages
+ mus		Creek
+ mwl		Mirandese
+ mwr		Marwari
+ myn		Mayan languages
+ myv		Erzya
+ nah		Nahuatl languages
+ nai		North American Indian languages
+ nap		Neapolitan
+ nau	na	Nauru
+ nav	nv	Navajo; Navaho
+ nbl	nr	Ndebele, South; South Ndebele
+ nde	nd	Ndebele, North; North Ndebele
+ ndo	ng	Ndonga
+ nds		Low German; Low Saxon; German, Low; Saxon, Low
+ nep	ne	Nepali
+ new		Nepal Bhasa; Newari
+ nia		Nias
+ nic		Niger-Kordofanian languages
+ niu		Niuean
+ nno	nn	Norwegian Nynorsk; Nynorsk, Norwegian
+ nob	nb	Bokmal, Norwegian; Norwegian Bokmal
+ nog		Nogai
+ non		Norse, Old
+ nor	no	Norwegian
+ nqo		N''Ko
+ nso		Pedi; Sepedi; Northern Sotho
+ nub		Nubian languages
+ nwc		Classical Newari; Old Newari; Classical Nepal Bhasa
+ nya	ny	Chichewa; Chewa; Nyanja
+ nym		Nyamwezi
+ nyn		Nyankole
+ nyo		Nyoro
+ nzi		Nzima
+ oci	oc	Occitan (post 1500)
+ oji	oj	Ojibwa
+ ori	or	Oriya
+ orm	om	Oromo
+ osa		Osage
+ oss	os	Ossetian; Ossetic
+ ota		Turkish, Ottoman (1500-1928)
+ oto		Otomian languages
+ paa		Papuan languages
+ pag		Pangasinan
+ pal		Pahlavi
+ pam		Pampanga; Kapampangan
+ pan	pa	Panjabi; Punjabi
+ pap		Papiamento
+ pau		Palauan
+ peo		Persian, Old (ca.600-400 B.C.)
+ per/fas	fa	Persian
+ phi		Philippine languages)
+ phn		Phoenician
+ pli	pi	Pali
+ pol	pl	Polish
+ pon		Pohnpeian
+ por	pt	Portuguese
+ pra		Prakrit languages
+ pro		Provencal, Old (to 1500);Occitan, Old (to 1500)
+ pus	ps	Pushto; Pashto
+ qaa-qtz		Reserved for local use
+ que	qu	Quechua
+ raj		Rajasthani
+ rap		Rapanui
+ rar		Rarotongan; Cook Islands Maori
+ roa		Romance languages
+ roh	rm	Romansh
+ rom		Romany
+ rum/ron	ro	Romanian; Moldavian; Moldovan
+ run	rn	Rundi
+ rup		Aromanian; Arumanian; Macedo-Romanian
+ rus	ru	Russian
+ sad		Sandawe
+ sag	sg	Sango
+ sah		Yakut
+ sai		South American Indian languages
+ sal		Salishan languages
+ sam		Samaritan Aramaic
+ san	sa	Sanskrit
+ sas		Sasak
+ sat		Santali
+ scn		Sicilian
+ sco		Scots
+ sel		Selkup
+ sem		Semitic languages
+ sga		Irish, Old (to 900)
+ sgn		Sign Languages
+ shn		Shan
+ sid		Sidamo
+ sin	si	Sinhala; Sinhalese
+ sio		Siouan languages
+ sit		Sino-Tibetan languages
+ sla		Slavic languages
+ slo/slk	sk	Slovak
+ slv	sl	Slovenian
+ sma		Southern Sami
+ sme	se	Northern Sami
+ smi		Sami languages
+ smj		Lule Sami
+ smn		Inari Sami
+ smo	sm	Samoan
+ sms		Skolt Sami
+ sna	sn	Shona
+ snd	sd	Sindhi
+ snk		Soninke
+ sog		Sogdian
+ som	so	Somali
+ son		Songhai languages
+ sot	st	Sotho, Southern
+ spa	es	Spanish; Castilian
+ srd	sc	Sardinian
+ srn		Sranan Tongo
+ srp	sr	Serbian
+ srr		Serer
+ ssa		Nilo-Saharan languages
+ ssw	ss	Swati
+ suk		Sukuma
+ sun	su	Sundanese
+ sus		Susu
+ sux		Sumerian
+ swa	sw	Swahili
+ swe	sv	Swedish
+ syc		Classical Syriac
+ syr		Syriac
+ tah	ty	Tahitian
+ tai		Tai languages
+ tam	ta	Tamil
+ tat	tt	Tatar
+ tel	te	Telugu
+ tem		Timne
+ ter		Tereno
+ tet		Tetum
+ tgk	tg	Tajik
+ tgl	tl	Tagalog
+ tha	th	Thai
+ tib/bod	bo	Tibetan
+ tig		Tigre
+ tir	ti	Tigrinya
+ tiv		Tiv
+ tkl		Tokelau
+ tlh		Klingon; tlhIngan-Hol
+ tli		Tlingit
+ tmh		Tamashek
+ tog		Tonga (Nyasa)
+ ton	to	Tonga (Tonga Islands)
+ tpi		Tok Pisin
+ tsi		Tsimshian
+ tsn	tn	Tswana
+ tso	ts	Tsonga
+ tuk	tk	Turkmen
+ tum		Tumbuka
+ tup		Tupi languages
+ tur	tr	Turkish
+ tut		Altaic languages
+ tvl		Tuvalu
+ twi	tw	Twi
+ tyv		Tuvinian
+ udm		Udmurt
+ uga		Ugaritic
+ uig	ug	Uighur; Uyghur
+ ukr	uk	Ukrainian
+ umb		Umbundu
+ und		Undetermined
+ urd	ur	Urdu
+ uzb	uz	Uzbek
+ vai		Vai
+ ven	ve	Venda
+ vie	vi	Vietnamese
+ vol	vo	Volapuk
+ vot		Votic
+ wak		Wakashan languages
+ wal		Wolaitta; Wolaytta
+ war		Waray
+ was		Washo
+ wel/cym	cy	Welsh
+ wen		Sorbian languages
+ wln	wa	Walloon
+ wol	wo	Wolof
+ xal		Kalmyk; Oirat
+ xho	xh	Xhosa
+ yao		Yao
+ yap		Yapese
+ yid	yi	Yiddish
+ yor	yo	Yoruba
+ ypk		Yupik languages
+ zap		Zapotec
+ zbl		Blissymbols; Blissymbolics; Bliss
+ zen		Zenaga
+ zha	za	Zhuang; Chuang
+ znd		Zande languages
+ zul	zu	Zulu
+ zun		Zuni
+ zxx		No linguistic content; Not applicable
+ zza		Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki'!

Item was added:
+ ----- Method: ISOLanguageDefinition class>>readISOLanguagesFrom: (in category 'private') -----
+ readISOLanguagesFrom: stream
+ 	"ISOLanguageDefinition readISOLanguagesFrom: ISOLanguageDefinition isoLanguages readStream "
+ 	| languages language code3 index line |
+ 	languages := Dictionary new.
+ 	[stream atEnd
+ 		or: [(line := stream nextLine readStream) atEnd]]
+ 		whileFalse: [
+ 			language := ISOLanguageDefinition new.
+ 			code3 := line upTo: Character tab.
+ 			(index := code3 indexOf: $/) > 0
+ 				ifTrue: [
+ 					language iso3: (code3 copyFrom: 1 to: index-1).
+ 					language iso3Alternate: (code3 copyFrom: index+1 to: code3 size)]
+ 				ifFalse: [language iso3: code3].
+ 			language
+ 				iso2: (line upTo: Character tab);
+ 				language: line upToEnd.
+ 			languages at: language iso3 put: language].
+ 	^languages!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso2 (in category 'accessing') -----
+ iso2
+ 	^iso2 ifNil: [self iso3]!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso2: (in category 'initialize') -----
+ iso2: aString
+ 	iso2 := aString ifEmpty: [nil] ifNotEmpty: [aString]!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso3 (in category 'accessing') -----
+ iso3
+ 	^iso3 ifNil: ['']!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso3: (in category 'initialize') -----
+ iso3: aString
+ 	iso3 := aString ifEmpty: [nil] ifNotEmpty: [aString]!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso3Alternate (in category 'accessing') -----
+ iso3Alternate
+ 	^iso3Alternate ifNil: ['']!

Item was added:
+ ----- Method: ISOLanguageDefinition>>iso3Alternate: (in category 'initialize') -----
+ iso3Alternate: aString
+ 	iso3Alternate := aString ifEmpty: [nil] ifNotEmpty: [aString]!

Item was added:
+ ----- Method: ISOLanguageDefinition>>language (in category 'accessing') -----
+ language
+ 	^language!

Item was added:
+ ----- Method: ISOLanguageDefinition>>language: (in category 'initialize') -----
+ language: aString
+ 	language := aString!

Item was added:
+ NaturalLanguageTranslator subclass: #InternalTranslator
+ 	instanceVariableNames: 'generics'
+ 	classVariableNames: 'AllKnownPhrases CachedTranslations'
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!
+ 
+ !InternalTranslator commentStamp: 'tak 10/19/2007 11:12' prior: 0!
+ An InternalTranslator is used a translation dictionary in a image.
+ You can use it without any external translation file.
+ 
+ Structure:
+  generics		Dictionary -- msgid -> msgstr
+ !

Item was added:
+ ----- Method: InternalTranslator class>>allKnownPhrases (in category 'private') -----
+ allKnownPhrases
+ 	^AllKnownPhrases ifNil: [AllKnownPhrases := Dictionary new: 2051]!

Item was added:
+ ----- Method: InternalTranslator class>>availableLanguageLocaleIDs (in category 'accessing') -----
+ availableLanguageLocaleIDs
+ 	"Return locale ids for the internal translation dictionary."
+ 	"InternalTranslator availableLanguageLocaleIDs"
+ 	^ self cachedTranslations values collect:[:each | each localeID]!

Item was added:
+ ----- Method: InternalTranslator class>>cachedTranslations (in category 'private') -----
+ cachedTranslations
+ 	"CachedTranslations := nil" 
+ 	^CachedTranslations ifNil: [CachedTranslations := Dictionary new]!

Item was added:
+ ----- Method: InternalTranslator class>>directoryForLanguage:country:create: (in category 'private loading') -----
+ directoryForLanguage: isoLanguage country: isoCountry create: createDir
+ 	"Try to locate the <prefs>/locale/<language>{/<country>} folder.
+ 	If createDir is set, create the path down to country or language, depending on wether it's specified..
+ 	Return the directory for country or language depending on specification.
+ 	If neither exists, nil"
+ 
+ 	"NaturalLanguageTranslator directoryForLanguage: 'es' country: nil create: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: 'DE' create: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: 'US' create: false"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: nil create: true"
+ 
+ 	"If this fails, there is nothing we can do about it here"
+ 	| localeDir  countryDir languageDir |
+ 	localeDir := self localeDirCreate: createDir.
+ 	localeDir ifNil: [^nil].
+ 
+ 	isoCountry ifNil: [
+ 		languageDir := localeDir directoryNamed: isoLanguage.
+ 		createDir
+ 			ifTrue: [languageDir assureExistence].
+ 		^languageDir exists
+ 			ifTrue: [languageDir]
+ 			ifFalse: [nil]].
+ 
+ 	countryDir := languageDir directoryNamed: isoCountry.
+ 	createDir
+ 		ifTrue: [countryDir assureExistence].
+ 
+ 	^countryDir exists
+ 		ifTrue: [countryDir]
+ 		ifFalse: [nil]!

Item was added:
+ ----- Method: InternalTranslator class>>directoryForLocaleID:create: (in category 'private loading') -----
+ directoryForLocaleID: localeID create: createDir
+ 	"Try to locate the <prefs>/locale/<language>{/<country>} folder.
+ 	If createDir is set, create the path down to country or language, depending on locale.
+ 	Return the directory for country or language depending on locale.
+ 	If neither exists, nil"
+ 
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: nil readOnly: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: 'DE' readOnly: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: 'US' readOnly: false"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: nil readOnly: true"
+ 
+ 	^self directoryForLanguage: localeID isoLanguage country: localeID isoCountry create: createDir!

Item was added:
+ ----- Method: InternalTranslator class>>discardAllTranslations (in category 'class initialization') -----
+ discardAllTranslations
+ 	AllKnownPhrases := nil.
+ 	self resetCaches.!

Item was added:
+ ----- Method: InternalTranslator class>>fileReaderServicesForFile:suffix: (in category 'file-services') -----
+ fileReaderServicesForFile: fullName suffix: suffix 
+ 	"Answer the file services associated with given file"
+ 	^ (suffix = self translationSuffix) | (suffix = '*')
+ 		ifTrue: [{self serviceMergeLanguageTranslations}]
+ 		ifFalse: [#()]!

Item was added:
+ ----- Method: InternalTranslator class>>loadAvailableExternalLocales (in category 'private loading') -----
+ loadAvailableExternalLocales
+ 	"private - register locales IDs based on the content of the <prefs>/locale/ directory"
+ 	| localeDir |
+ 	localeDir := self localeDirCreate: false.
+ 	localeDir ifNil: [^ #()].
+ 
+ 	localeDir directoryNames
+ 		do: [:langDirName | 
+ 			| langDir | 
+ 			langDir := localeDir directoryNamed: langDirName.
+ 
+ 			(langDir fileNamesMatching: '*.' , self translationSuffix)
+ 				ifNotEmpty: [self loadTranslatorForIsoLanguage: langDirName isoCountry: nil].
+ 
+ 			langDir directoryNames
+ 				do: [:countryDirName | 
+ 					| countryDir | 
+ 					countryDir := langDir directoryNamed: countryDirName.
+ 					(countryDir fileNamesMatching: '*.' , self translationSuffix)
+ 						ifNotEmpty: [self loadTranslatorForIsoLanguage: langDirName isoCountry: countryDirName]
+ 			]
+ 		].
+ !

Item was added:
+ ----- Method: InternalTranslator class>>loadExternalTranslationsFor: (in category 'private loading') -----
+ loadExternalTranslationsFor: translator
+ 	"Try to load translations from external external files.
+ 	The files are located in the <prefs>/locale/<language>{/<country>} folder.
+ 	There can be more than one file for each location, so applications can install their own partial translation tables. All files in the specific folder are loaded."
+ 
+ 	| translationDir |
+ 	translationDir := self directoryForLocaleID: translator localeID create: false.
+ 	translationDir ifNil: [ ^nil ]. 
+ 	(translationDir fileNamesMatching: '*.' , self translationSuffix)
+ 		do: [:fileName | translator loadFromFileNamed: (translationDir fullNameFor: fileName)]!

Item was added:
+ ----- Method: InternalTranslator class>>loadForLocaleIsoString:fromGzippedMimeLiteral: (in category 'file-services') -----
+ loadForLocaleIsoString: localeString fromGzippedMimeLiteral: mimeString 
+ 	"merge the translation from the mime literal."
+ 	| stream localeID translator gs rbStream s currentPlatform |
+ 	s := Base64MimeConverter mimeDecodeToBytes: mimeString readStream.
+ 	s reset.
+ 	gs := GZipReadStream on: s.
+ 	rbStream := MultiByteBinaryOrTextStream with: gs contents asString.
+ 	rbStream converter: UTF8TextConverter new.
+ 	rbStream reset.
+ 	localeID := LocaleID isoString: localeString.
+ 	currentPlatform := Locale currentPlatform.
+ 	[Locale
+ 		currentPlatform: (Locale localeID: localeID).
+ 	stream := ReadStream on: rbStream contents]
+ 		ensure: [Locale currentPlatform: currentPlatform].
+ 	translator := self localeID: localeID.
+ 	translator loadFromStream: stream.
+ 	LanguageEnvironment resetKnownEnvironments!

Item was added:
+ ----- Method: InternalTranslator class>>loadTranslatorForIsoLanguage:isoCountry: (in category 'private loading') -----
+ loadTranslatorForIsoLanguage: isoLanguage isoCountry: isoCountry 
+ 	"private - load the translations from <prefs>/locale/ directory  
+ 	the procedure is to assure the existence of a translator for the  
+ 	given language/country and then load the external translations for this translator"
+ 
+ 	| translator |
+ 	translator := self newLocaleID: (LocaleID isoLanguage: isoLanguage isoCountry: isoCountry).
+ 
+ 	self loadExternalTranslationsFor: translator!

Item was added:
+ ----- Method: InternalTranslator class>>localeDirCreate: (in category 'private loading') -----
+ localeDirCreate: createDir
+ 	"Try to locate the <prefs>/locale/ folder.
+ 	If createDir is set, try to create the path.
+ 	If it doesn't exist, return nil"
+ 
+ 	"If this fails, there is nothing we can do about it here"
+ 	| prefDir  localeDir |
+ 	(createDir not
+ 			and: [ExternalSettings preferenceDirectory isNil])
+ 		ifTrue: [^ nil].
+ 
+ 	prefDir := ExternalSettings assuredPreferenceDirectory.
+ 	prefDir exists
+ 		ifFalse: [^nil].
+ 
+ 
+ 	localeDir := prefDir directoryNamed: 'locale'.
+ 	createDir
+ 		ifTrue: [localeDir assureExistence].
+ 	^localeDir exists
+ 		ifTrue: [localeDir]
+ 		ifFalse: [nil]!

Item was added:
+ ----- Method: InternalTranslator class>>localeID: (in category 'accessing') -----
+ localeID: localeID 
+ 	"For backward compatibility, see NaturalLanguageTranslator >> fileOutHeaderOn:."
+ 	^ self newLocaleID: localeID!

Item was added:
+ ----- Method: InternalTranslator class>>mergeLegacyTranslators (in category 'accessing') -----
+ mergeLegacyTranslators
+ 	self availableLanguageLocaleIDs
+ 		do: [:localeID | (NaturalLanguageTranslator translators includesKey: localeID)
+ 				ifFalse: [NaturalLanguageTranslator translators
+ 						at: localeID
+ 						put: (self newLocaleID: localeID)]]!

Item was added:
+ ----- Method: InternalTranslator class>>mergeTranslationFileNamed: (in category 'file-services') -----
+ mergeTranslationFileNamed: fileFullNameString 
+ 	"merge the translation in the file named fileFullNameString"
+ 
+ 	| stream localeID translator |
+ 	stream := FileStream readOnlyFileNamed: fileFullNameString.
+ 	[localeID := LocaleID isoString: stream localName sansPeriodSuffix.
+ 	translator := self localeID: localeID.
+ 	translator loadFromStream: stream]
+ 		ensure: [stream close].
+ 	LanguageEnvironment resetKnownEnvironments.
+ 
+ !

Item was added:
+ ----- Method: InternalTranslator class>>newLocaleID: (in category 'accessing') -----
+ newLocaleID: localeID 
+ 	^ self cachedTranslations
+ 		at: localeID
+ 		ifAbsentPut: [self new localeID: localeID]!

Item was added:
+ ----- Method: InternalTranslator class>>privateStartUp (in category 'class initialization') -----
+ privateStartUp
+ 	self loadAvailableExternalLocales.
+ 	self mergeLegacyTranslators.
+ !

Item was added:
+ ----- Method: InternalTranslator class>>registerPhrase: (in category 'private') -----
+ registerPhrase: phrase
+ 	"Using a Dictionary so we can lookup existing string instead of creating needless copies when loading a translation."
+ 	self allKnownPhrases at: phrase put: phrase!

Item was added:
+ ----- Method: InternalTranslator class>>registeredPhraseFor: (in category 'private') -----
+ registeredPhraseFor: phrase
+ 	"Using a Dictionary so we can lookup existing string instead of creating needless copies when loading a translation."
+ 	^self allKnownPhrases at: phrase ifAbsentPut: [phrase]!

Item was added:
+ ----- Method: InternalTranslator class>>removeLocaleID: (in category 'accessing') -----
+ removeLocaleID: localeID 
+ 	"self removeLocaleID: (LocaleID isoString: 'ja-kids')"
+ 	self cachedTranslations
+ 		removeKey: localeID
+ 		ifAbsent: [].
+ 	NaturalLanguageTranslator privateStartUp!

Item was added:
+ ----- Method: InternalTranslator class>>resetCaches (in category 'class initialization') -----
+ resetCaches
+ 	CachedTranslations := nil.
+ !

Item was added:
+ ----- Method: InternalTranslator class>>serviceMergeLanguageTranslations (in category 'file-services') -----
+ serviceMergeLanguageTranslations
+ 	"Answer a service for merging of translation files"
+ 	^ SimpleServiceEntry
+ 		provider: self
+ 		label: 'merge the translation file' translatedNoop
+ 		selector: #mergeTranslationFileNamed:
+ 		description: 'merge the translation file into the language named like the file' translatedNoop
+ 		buttonLabel: 'merge' translatedNoop!

Item was added:
+ ----- Method: InternalTranslator class>>services (in category 'file-services') -----
+ services
+ 	"Answer potential file services associated with this class"
+ 	^ {self serviceMergeLanguageTranslations}!

Item was added:
+ ----- Method: InternalTranslator class>>translationSuffix (in category 'private') -----
+ translationSuffix
+ 	^'translation'!

Item was added:
+ ----- Method: InternalTranslator>>atRandom (in category 'accessing') -----
+ atRandom
+ 
+ 	^ generics atRandom value.
+ !

Item was added:
+ ----- Method: InternalTranslator>>checkPhrase:translation: (in category 'translation') -----
+ checkPhrase: phrase translation: translation!

Item was added:
+ ----- Method: InternalTranslator>>defaultBackgroundColor (in category 'user interface') -----
+ defaultBackgroundColor
+ 	"answer the receiver's defaultBackgroundColor for views"
+ 	^ Color cyan!

Item was added:
+ ----- Method: InternalTranslator>>fileOutHeader (in category 'fileIn/fileOut') -----
+ fileOutHeader
+ 	^ '''Translation dictionary'''!

Item was added:
+ ----- Method: InternalTranslator>>fileOutHeaderOn: (in category 'user interface') -----
+ fileOutHeaderOn: aStream 
+ 	aStream binary.
+ 	UTF8TextConverter writeBOMOn: aStream.
+ 	aStream text.
+ 	aStream nextChunkPut: self fileOutHeader;
+ 		 cr.
+ 	aStream timeStamp; cr.
+ 	aStream nextPut: $!!.
+ 	aStream nextChunkPut: '(' , self class name , ' localeID: ' , id storeString , ')'.
+ 	aStream cr!

Item was added:
+ ----- Method: InternalTranslator>>fileOutHeaderOn:withBOM: (in category 'user interface') -----
+ fileOutHeaderOn: aStream withBOM: bomFlag
+ 	bomFlag ifTrue: [
+ 		aStream binary.
+ 		UTF8TextConverter writeBOMOn: aStream.
+ 		aStream text.
+ 	].
+ 	aStream nextChunkPut: self fileOutHeader;
+ 		 cr.
+ 	aStream timeStamp; cr.
+ 	aStream nextPut: $!!.
+ 	aStream nextChunkPut: '(' , self class name , ' localeID: ' , id storeString , ')'.
+ 	aStream cr!

Item was added:
+ ----- Method: InternalTranslator>>fileOutOn: (in category 'fileIn/fileOut') -----
+ fileOutOn: aStream 
+ 	"self current fileOutOn: Transcript. Transcript endEntry"
+ 	self fileOutOn: aStream keys: nil withBOM: true.
+ !

Item was added:
+ ----- Method: InternalTranslator>>fileOutOn:keys:withBOM: (in category 'fileIn/fileOut') -----
+ fileOutOn: aStream keys: keys withBOM: bomFlag
+ 	"self current fileOutOn: Transcript. Transcript endEntry"
+ 	self fileOutHeaderOn: aStream withBOM: bomFlag.
+ 	(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!

Item was added:
+ ----- Method: InternalTranslator>>generics (in category 'private') -----
+ generics
+ 	^generics ifNil: [generics := Dictionary new]!

Item was added:
+ ----- Method: InternalTranslator>>isDomainLoaded: (in category 'accessing') -----
+ isDomainLoaded: aDomainName
+ 	^true
+ !

Item was added:
+ ----- Method: InternalTranslator>>loadFromFileNamed: (in category 'private store-retrieve') -----
+ 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.
+ !

Item was added:
+ ----- Method: InternalTranslator>>loadFromRefStream: (in category 'private store-retrieve') -----
+ loadFromRefStream: stream 
+ 	"Load translations from an external file"
+ 	| loadedArray refStream |
+ 	refStream := ReferenceStream on: stream.
+ 	[loadedArray := refStream next]
+ 		ensure: [refStream close].
+ 	self processExternalObject: loadedArray !

Item was added:
+ ----- Method: InternalTranslator>>loadFromStream: (in category 'private store-retrieve') -----
+ 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 ' translated, stream localName]
+ 		ifFalse: [self loadFromRefStream: stream]!

Item was added:
+ ----- Method: InternalTranslator>>mergeTranslations: (in category 'private store-retrieve') -----
+ 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.!

Item was added:
+ ----- Method: InternalTranslator>>nextChunkPut:on: (in category 'fileIn/fileOut') -----
+ 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.!

Item was added:
+ ----- Method: InternalTranslator>>phrase:translation: (in category 'translation') -----
+ phrase: phraseString translation: translationString 
+ 	self generics at: phraseString put: translationString asString.
+ 	self changed: #translations.
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: InternalTranslator>>processExternalObject: (in category 'private store-retrieve') -----
+ processExternalObject: anArray 
+ 	"pivate - process the external object"
+ 
+ 	"new format -> {translations. untranslated}"
+ 
+ 	anArray second do: [:each | self class registerPhrase: each].
+ 
+ 	self mergeTranslations: anArray first!

Item was added:
+ ----- Method: InternalTranslator>>rawPhrase:translation: (in category 'translation') -----
+ rawPhrase: phraseString translation: translationString 
+ 	self generics at: phraseString put: translationString asString.
+ !

Item was added:
+ ----- Method: InternalTranslator>>rawRemoveUntranslated: (in category 'translation') -----
+ rawRemoveUntranslated: untranslated
+ 
+ 	self class allKnownPhrases removeKey: untranslated ifAbsent: [].
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: InternalTranslator>>removeTranslationFor: (in category 'translation') -----
+ removeTranslationFor: phraseString
+ 	self generics removeKey: phraseString ifAbsent: [].
+ 	self changed: #translations.
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: InternalTranslator>>removeUntranslated: (in category 'translation') -----
+ removeUntranslated: untranslated
+ 
+ 	self class allKnownPhrases removeKey: untranslated ifAbsent: [].
+ !

Item was added:
+ ----- Method: InternalTranslator>>saveToFileNamed: (in category 'private store-retrieve') -----
+ 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.
+ 			^ self].
+ 	stream := FileStream fileNamed: fileNameString.
+ 	[self fileOutOn: stream]
+ 		ensure: [stream close]!

Item was added:
+ ----- Method: InternalTranslator>>scanFrom: (in category 'fileIn/fileOut') -----
+ 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!

Item was added:
+ ----- Method: InternalTranslator>>translate:inDomain: (in category 'translation') -----
+ translate: aString inDomain: aDomainName 
+ 	| translator |
+ 	^ self generics
+ 		at: aString
+ 		ifAbsent: [self localeID hasParent
+ 				ifTrue: [translator := self class cachedTranslations
+ 								at: self localeID parent
+ 								ifAbsent: [^ aString].
+ 					translator translate: aString inDomain: aDomainName]
+ 				ifFalse: [aString]]!

Item was added:
+ ----- Method: InternalTranslator>>translations (in category 'accessing') -----
+ translations
+ 	^self generics!

Item was added:
+ ----- Method: InternalTranslator>>untranslated (in category 'accessing') -----
+ untranslated
+ 	| translations |
+ 	translations := self translations.
+ 	^self class allKnownPhrases reject: [:each | translations includesKey: each]!

Item was added:
+ Object subclass: #Locale
+ 	instanceVariableNames: 'id shortDate longDate time decimalSymbol digitGrouping currencySymbol currencyNotation measurement offsetLocalToUTC offsetVMToUTC dstActive'
+ 	classVariableNames: 'Current CurrentPlatform KnownLocales LanguageSymbols LocaleChangeListeners PlatformEncodings Previous'
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!
+ 
+ !Locale commentStamp: '<historical>' prior: 0!
+ Main comment stating the purpose of this class and relevant relationship to other classes.
+ 
+ 
+ 
+ 	http://www.w3.org/WAI/ER/IG/ert/iso639.htm
+ 	http://www.oasis-open.org/cover/iso639a.html
+ 	See also
+ 	http://oss.software.ibm.com/cvs/icu/~checkout~/icuhtml/design/language_code_issues.html
+ 	http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.10
+ 	
+ ISO 3166
+ http://mitglied.lycos.de/buran/knowhow/codes/locales/
+ !

Item was added:
+ ----- Method: Locale class>>addLocalChangedListener: (in category 'notification') -----
+ addLocalChangedListener: anObjectOrClass
+ 	self localeChangedListeners add: anObjectOrClass!

Item was added:
+ ----- Method: Locale class>>clipboadInterpreter (in category 'accessing') -----
+ clipboadInterpreter
+ 	^NoConversionClipboardInterpreter new!

Item was added:
+ ----- Method: Locale class>>current (in category 'accessing') -----
+ current
+ 	"Current := nil"
+ 	Current ifNil: [
+ 		Current := self determineCurrentLocale.
+ 		"Transcript show: 'Current locale: ' , Current localeID asString; cr"].
+ 	^Current!

Item was added:
+ ----- Method: Locale class>>currentPlatform (in category 'accessing') -----
+ currentPlatform
+ 	"CurrentPlatform := nil"
+ 	CurrentPlatform ifNil: [CurrentPlatform := self determineCurrentLocale].
+ 	^CurrentPlatform!

Item was added:
+ ----- Method: Locale class>>currentPlatform: (in category 'accessing') -----
+ currentPlatform: locale
+ 	CurrentPlatform := locale.
+ 	LanguageEnvironment startUp.
+ !

Item was added:
+ ----- Method: Locale class>>currentPlatform:during: (in category 'accessing') -----
+ currentPlatform: locale during: aBlock 
+ 	"Alter current language platform during a block"
+ 	| backupPlatform |
+ 	backupPlatform := self currentPlatform.
+ 	[self currentPlatform: locale.
+ 	aBlock value]
+ 		ensure: [self currentPlatform: backupPlatform]!

Item was added:
+ ----- Method: Locale class>>defaultEncodingName: (in category 'platform specific') -----
+ defaultEncodingName: languageSymbol 
+ 	| encodings platformName osVersion |
+ 	platformName := SmalltalkImage current platformName.
+ 	osVersion := SmalltalkImage current getSystemAttribute: 1002.
+ 	encodings := self platformEncodings at: languageSymbol
+ 				ifAbsent: [self platformEncodings at: #default].
+ 	encodings at: platformName ifPresent: [:encoding | ^encoding].
+ 	encodings at: platformName , ' ' , osVersion
+ 		ifPresent: [:encoding | ^encoding].
+ 	^encodings at: #default!

Item was added:
+ ----- Method: Locale class>>defaultInputInterpreter (in category 'platform specific') -----
+ defaultInputInterpreter
+ 	| platformName osVersion |
+ 	platformName := SmalltalkImage current platformName.
+ 	osVersion := SmalltalkImage current getSystemAttribute: 1002.
+ 	(platformName = 'Win32' and: [osVersion = 'CE']) 
+ 		ifTrue: [^NoInputInterpreter new].
+ 	platformName = 'Win32' ifTrue: [^MacRomanInputInterpreter new].
+ 	^NoInputInterpreter new!

Item was added:
+ ----- Method: Locale class>>determineCurrentLocale (in category 'private') -----
+ determineCurrentLocale
+ 	"For now just return the default locale.
+ 	A smarter way would be to determine the current platforms default locale."
+ 	"Locale determineCurrentLocale"
+ 
+ 	^self new determineLocale!

Item was added:
+ ----- Method: Locale class>>initKnownLocales (in category 'private') -----
+ initKnownLocales
+ 	| locales |
+ 	locales := Dictionary new.
+ 
+ 	"Init the locales for which we have translations"
+ 	InternalTranslator availableLanguageLocaleIDs do: [:id |
+ 		locales at: id put: (Locale new localeID: id)].
+ 	^locales!

Item was added:
+ ----- Method: Locale class>>initialize (in category 'class initialization') -----
+ initialize
+ 	"Locale initialize"
+ 
+ 	Smalltalk addToStartUpList: Locale.
+ 	Preferences addPreference: #useLocale
+ 		categories: #('general') default: false 
+ 		balloonHelp: 'Use the system locale to set the system language etc at startup'.!

Item was added:
+ ----- Method: Locale class>>initializePlatformEncodings (in category 'class initialization') -----
+ initializePlatformEncodings
+ 	"Locale initializePlatformEncodings"
+ 
+ 	| platform |
+ 	PlatformEncodings isNil ifTrue: [ PlatformEncodings := Dictionary new ].
+ 
+ 	platform := PlatformEncodings at: 'default' ifAbsentPut: Dictionary new.
+ 	platform
+ 		at: 'default' put: 'iso8859-1';
+ 		at: 'Win32 CE' put: 'utf-8';
+ 		yourself.
+ 
+ 	platform := PlatformEncodings at: 'ja' ifAbsentPut: Dictionary new.
+ 	platform
+ 		at: 'default' put: 'shift-jis';
+ 		at: 'unix' put: 'euc-jp';
+ 		at: 'Win32 CE' put: 'utf-8';
+ 		yourself.
+ 
+ 	platform := PlatformEncodings at: 'ko' ifAbsentPut: Dictionary new.
+ 	platform
+ 		at: 'default' put: 'euc-kr';
+ 		at: 'Win32 CE' put: 'utf-8';
+ 		yourself.
+ 
+ 	platform := PlatformEncodings at: 'zh' ifAbsentPut: Dictionary new.
+ 	platform
+ 		at: 'default' put: 'gb2312';
+ 		at: 'unix' put: 'euc-cn';
+ 		at: 'Win32 CE' put: 'utf-8';
+ 		yourself.
+ !

Item was added:
+ ----- Method: Locale class>>isoLanguage: (in category 'accessing') -----
+ isoLanguage: isoLanguage
+ 	^self isoLanguage: isoLanguage isoCountry: nil!

Item was added:
+ ----- Method: Locale class>>isoLanguage:isoCountry: (in category 'accessing') -----
+ isoLanguage: isoLanguage isoCountry: isoCountry
+ 	^self localeID: (LocaleID  isoLanguage: isoLanguage isoCountry: isoCountry)!

Item was added:
+ ----- Method: Locale class>>isoLocale: (in category 'accessing') -----
+ isoLocale: aString
+ 	!

Item was added:
+ ----- Method: Locale class>>knownLocales (in category 'private') -----
+ knownLocales
+ 	"KnownLocales := nil"
+ 	^KnownLocales ifNil: [KnownLocales := self initKnownLocales]!

Item was added:
+ ----- Method: Locale class>>languageSymbol: (in category 'accessing') -----
+ languageSymbol: languageSymbol
+ 	"Locale languageSymbol: #Deutsch"
+ 
+ 	^self isoLanguage: (LanguageSymbols at: languageSymbol)!

Item was added:
+ ----- Method: Locale class>>localeChanged (in category 'notification') -----
+ localeChanged
+ 
+ 	#(#ParagraphEditor #BitEditor #FormEditor #StandardSystemController )
+ 		do: [:key | Smalltalk
+ 				at: key
+ 				ifPresent: [:class | class initialize]].
+ 	PartsBin localeChanged.
+ 	Project localeChanged.
+ 	PaintBoxMorph localeChanged.
+ 	ColorPickerMorph localeChanged.
+ 	Preferences localeChanged!

Item was added:
+ ----- Method: Locale class>>localeChangedGently (in category 'notification') -----
+ localeChangedGently
+ 
+ 	#(#ParagraphEditor #BitEditor #FormEditor #StandardSystemController )
+ 		do: [:key | Smalltalk
+ 				at: key
+ 				ifPresent: [:class | class initialize]].
+ 	PartsBin localeChangedGently.
+ 	Project localeChangedGently.
+ 	PaintBoxMorph localeChangedGently.
+ 	ColorPickerMorph localeChangedGently.
+ 	Preferences localeChangedGently.
+ !

Item was added:
+ ----- Method: Locale class>>localeChangedListeners (in category 'notification') -----
+ localeChangedListeners
+ 	^LocaleChangeListeners ifNil: [LocaleChangeListeners := OrderedCollection new]!

Item was added:
+ ----- Method: Locale class>>localeID: (in category 'accessing') -----
+ localeID: id
+ 	^self knownLocales at: id ifAbsentPut: [Locale new localeID: id]!

Item was added:
+ ----- Method: Locale class>>migrateSystem (in category 'private') -----
+ migrateSystem
+ 	"Locale migrateSystem"
+ 	"Do all the necessary operations to switch to the new Locale environment."
+ 
+ 	LocaleChangeListeners := nil.
+ 	self
+ 		addLocalChangedListener: HandMorph;
+ 		addLocalChangedListener: Clipboard;
+ 		addLocalChangedListener: Vocabulary;
+ 		addLocalChangedListener: PartsBin;
+ 		addLocalChangedListener: Project;
+ 		addLocalChangedListener: PaintBoxMorph;
+ 		yourself!

Item was added:
+ ----- Method: Locale class>>platformEncodings (in category 'class initialization') -----
+ platformEncodings
+ 	PlatformEncodings isEmptyOrNil ifTrue: [ self initializePlatformEncodings ].
+ 	^PlatformEncodings
+ !

Item was added:
+ ----- Method: Locale class>>previous (in category 'accessing') -----
+ previous
+ 
+ 	^ Previous
+ !

Item was added:
+ ----- Method: Locale class>>resetKnownLocales (in category 'private') -----
+ resetKnownLocales
+ 
+ 	KnownLocales := nil
+ !

Item was added:
+ ----- Method: Locale class>>startUp: (in category 'system startUp') -----
+ startUp: resuming
+ 	| newID |
+ 	resuming ifFalse: [^self].
+ 	(Preferences valueOfFlag: #useLocale)
+ 		ifTrue: [
+ 			DateAndTime localTimeZone: (TimeZone
+ 				offset:  (Duration minutes: Locale current offsetLocalToUTC)
+ 				name: 'Local Time'
+ 				abbreviation: 'LT').
+ 			newID := self current determineLocaleID.
+ 			newID ~= LocaleID current
+ 				ifTrue: [self switchAndInstallFontToID: newID gently: true]]!

Item was added:
+ ----- Method: Locale class>>stringForLanguageNameIs: (in category 'accessing') -----
+ stringForLanguageNameIs: localeID 
+ 	"Answer a string for a menu determining whether the given  
+ 	symbol is the project's natural language"
+ 	^ (self current localeID = localeID
+ 		ifTrue: ['<yes>']
+ 		ifFalse: ['<no>'])
+ 		, localeID displayName!

Item was added:
+ ----- Method: Locale class>>switchAndInstallFontToID: (in category 'accessing') -----
+ switchAndInstallFontToID: localeID 
+ 	"Locale switchAndInstallFontToID: (LocaleID isoLanguage: 'de')"
+ 	| locale |
+ 	locale := Locale localeID: localeID.
+ 	locale languageEnvironment isFontAvailable
+ 		ifFalse: [(self confirm: 'This language needs additional fonts.
+ Do you want to install the fonts?' translated)
+ 				ifTrue: [locale languageEnvironment installFont]
+ 				ifFalse: [^ self]].
+ 	self
+ 		switchTo: locale!

Item was added:
+ ----- Method: Locale class>>switchAndInstallFontToID:gently: (in category 'accessing') -----
+ switchAndInstallFontToID: localeID gently: gentlyFlag
+ 	| locale result env envFound ret fontInImage menu |
+ 	"Logic:
+ 		- not in Rainbow, 
+ 			- if the font is in the image, use the font.
+ 			- if the font is not in the image,
+ 				- ask to choose:
+ 					- load font
+ 					- try to enable pango, if pango is available
+ 					- or cancel.
+ 			- if the previous step fails, notify the user that you cannot switch to the language.
+ 	Details:
+ 		- how to check non-pango font is available:
+ 			- if the language environment for the locale doesn't exist, the font is not available.
+ 			- if font loading fails, it is not available.
+ 		- how to check if the language environment doesn't exist:
+ 			- if the locales languageEnvironment is Latin1 but the locale isn't it is not available.
+ 	"	
+ 	locale := Locale localeID: localeID.
+ 	env := locale languageEnvironment.
+ 	result := true.
+ 	envFound := (Latin1Environment supportedLanguages includes: locale isoLanguage) or: [(env isMemberOf: Latin1Environment) not].
+ 	fontInImage := envFound and: [env isFontAvailable].
+ 	fontInImage ifFalse: [
+ 		menu := MenuMorph new.
+ 		menu defaultTarget: menu.
+ 		envFound ifTrue: [menu add: 'load font' translated selector: #modalSelection: argument: #loadFont].
+ 		menu add:  'cancel' translated selector: #modalSelection: argument: #cancel.
+ 		menu addTitle: 'This language needs additional fonts.
+ Do you want to install the fonts?' translated.
+ 		ret := menu invokeModal.
+ 		ret = #loadFont ifTrue: [result := env installFont. result ifTrue: [StrikeFont setupDefaultFallbackTextStyle]].
+ 		(ret ~~ #loadFont and: [ret ~~ #enablePango]) ifTrue: [result := false]].
+ 	result ifFalse: [self inform: 'Cannot load additional fonts' translated] ifTrue: [self switchTo: locale gently: gentlyFlag].
+ !

Item was added:
+ ----- Method: Locale class>>switchTo: (in category 'accessing') -----
+ switchTo: locale
+ 	self switchTo: locale gently: false.
+ !

Item was added:
+ ----- 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.
+ 				CurrentPlatform := Current := Locale localeID: availableID.
+ 				NaturalLanguageTranslator localeChanged.
+ 				gentlyFlag ifTrue: [self localeChangedGently] ifFalse: [self localeChanged]]!

Item was added:
+ ----- Method: Locale class>>switchToID: (in category 'accessing') -----
+ switchToID: localeID
+ 	"Locale switchToID: (LocaleID isoLanguage: 'de') "
+ 
+ 	self switchTo: (Locale localeID: localeID)!

Item was added:
+ ----- Method: Locale>>determineLocale (in category 'accessing') -----
+ determineLocale
+ 	self localeID: self determineLocaleID!

Item was added:
+ ----- Method: Locale>>determineLocaleID (in category 'accessing') -----
+ determineLocaleID
+ 	"Locale current determineLocaleID"
+ 	| isoLang isoCountry |
+ 	isoLang := self fetchISO2Language
+ 				ifNil: [^ self localeID].
+ 	isoCountry := self fetchISOCountry
+ 				ifNil: [^ LocaleID isoLanguage: isoLang].
+ 	^ LocaleID isoLanguage: isoLang isoCountry: isoCountry!

Item was added:
+ ----- Method: Locale>>fetchISO2Language (in category 'private') -----
+ fetchISO2Language
+ 	"Locale current fetchISO2Language"
+ 	| lang isoLang |
+ 	lang := self primLanguage.
+ 	lang ifNil: [^nil].
+ 	lang := lang copyUpTo: 0 asCharacter.
+ 	lang size == 2
+ 		ifTrue: [^lang].
+ 	isoLang := ISOLanguageDefinition iso3LanguageDefinition: lang.
+ 	^isoLang
+ 		ifNil: [nil]
+ 		ifNotNil: [isoLang iso2]!

Item was added:
+ ----- Method: Locale>>fetchISOCountry (in category 'private') -----
+ fetchISOCountry
+ 	"Locale current fetchISOCountry"
+ 	| countryCode |
+ 	countryCode := self primCountry
+ 				ifNil: [^ nil].
+ 	^ countryCode copyUpTo: 0 asCharacter!

Item was added:
+ ----- Method: Locale>>iconForNativeLanguage (in category 'accessing') -----
+ iconForNativeLanguage
+ 
+ 	^ (NaturalLanguageFormTranslator localeID: self localeID) translate: 'LanguageNameInNativeLanguage'.
+ !

Item was added:
+ ----- Method: Locale>>isoCountry (in category 'accessing') -----
+ isoCountry
+ 	^self localeID isoCountry!

Item was added:
+ ----- Method: Locale>>isoLanguage (in category 'accessing') -----
+ isoLanguage
+ 	^self localeID isoLanguage!

Item was added:
+ ----- Method: Locale>>isoLocale (in category 'accessing') -----
+ isoLocale
+ 	"<language>-<country>"
+ 	^self isoCountry
+ 		ifNil: [self isoLanguage]
+ 		ifNotNil: [self isoLanguage , '-' , self isoCountry]!

Item was added:
+ ----- Method: Locale>>languageEnvironment (in category 'accessing') -----
+ languageEnvironment
+ 	^LanguageEnvironment localeID: self localeID!

Item was added:
+ ----- Method: Locale>>localeID (in category 'accessing') -----
+ localeID
+ 	^id!

Item was added:
+ ----- Method: Locale>>localeID: (in category 'accessing') -----
+ localeID: anID
+ 	id := anID!

Item was added:
+ ----- Method: Locale>>offsetLocalToUTC (in category 'accessing') -----
+ offsetLocalToUTC
+ 	^self primTimezone!

Item was added:
+ ----- Method: Locale>>primCountry (in category 'system primitives') -----
+ primCountry
+ 	"Returns string with country tag according to ISO 639"
+ 	<primitive: 'primitiveCountry' module: 'LocalePlugin'>
+ 	^'US'!

Item was added:
+ ----- Method: Locale>>primCurrencyNotation (in category 'system primitives') -----
+ primCurrencyNotation
+ 	"Returns boolean if symbol is pre- (true) or post-fix (false)"
+ 	<primitive: 'primitiveCurrencyNotation' module: 'LocalePlugin'>
+ 	^true!

Item was added:
+ ----- Method: Locale>>primCurrencySymbol (in category 'system primitives') -----
+ primCurrencySymbol
+ 	"Returns string with currency symbol"
+ 	<primitive: 'primitiveCurrencySymbol' module:'LocalePlugin'>
+ 	^'$'!

Item was added:
+ ----- Method: Locale>>primDST (in category 'system primitives') -----
+ primDST
+ 	"Returns boolean if DST  (daylight saving time) is active or not"
+ 	<primitive:'primitiveDaylightSavings' module: 'LocalePlugin'>
+ 	^false!

Item was added:
+ ----- Method: Locale>>primDecimalSymbol (in category 'system primitives') -----
+ primDecimalSymbol
+ 	"Returns string with e.g. '.' or ','"
+ 	<primitive:'primitiveDecimalSymbol' module: 'LocalePlugin'>
+ 	^'.'!

Item was added:
+ ----- Method: Locale>>primDigitGrouping (in category 'system primitives') -----
+ primDigitGrouping
+ 	"Returns string with e.g. '.' or ',' (thousands etc)"
+ 	<primitive:'primitiveDigitGroupingSymbol' module: 'LocalePlugin'>
+ 	^','!

Item was added:
+ ----- Method: Locale>>primLanguage (in category 'system primitives') -----
+ primLanguage
+ 	"returns string with language tag according to ISO 639"
+ 	<primitive:'primitiveLanguage' module: 'LocalePlugin'>
+ 	^'en'
+ 
+ !

Item was added:
+ ----- Method: Locale>>primLongDateFormat (in category 'system primitives') -----
+ primLongDateFormat
+ 	"Returns the long date format
+ 	d day, m month, y year,
+ 	double symbol is null padded, single not padded (m=6, mm=06)
+ 	dddd weekday
+ 	mmmm month name"
+ 	<primitive:'primitiveLongDateFormat' module: 'LocalePlugin'>
+ 	^'dddd, mmmm d, yyyy'!

Item was added:
+ ----- Method: Locale>>primMeasurement (in category 'system primitives') -----
+ primMeasurement
+ 	"Returns boolean denoting metric(true) or imperial(false)."
+ 	<primitive:'primitiveMeasurementMetric' module: 'LocalePlugin'>
+ 	^true
+ !

Item was added:
+ ----- Method: Locale>>primShortDateFormat (in category 'system primitives') -----
+ primShortDateFormat
+ 	"Returns the short date format
+ 	d day, m month, y year,
+ 	double symbol is null padded, single not padded (m=6, mm=06)
+ 	dddd weekday
+ 	mmmm month name"
+ 	<primitive:'primitiveShortDateFormat' module: 'LocalePlugin'>
+ 	^'m/d/yy'!

Item was added:
+ ----- Method: Locale>>primTimeFormat (in category 'system primitives') -----
+ primTimeFormat
+ 	"Returns string time format
+ 	Format is made up of 
+ 	h hour (h 12, H 24), m minute, s seconds, x (am/pm String)
+ 	double symbol is null padded, single not padded (h=6, hh=06)"
+ 	<primitive:'primitiveTimeFormat' module: 'LocalePlugin'>
+ 	^'h:mmx'!

Item was added:
+ ----- Method: Locale>>primTimezone (in category 'system primitives') -----
+ primTimezone
+ 	"The offset from UTC in minutes, with positive offsets being towards the east.
+ 	(San Francisco is in UTC -07*60 and Paris is in UTC +02*60 when daylight savings is in effect)."
+ 	<primitive:'primitiveTimezoneOffset' module: 'LocalePlugin'>
+ 	^0!

Item was added:
+ ----- Method: Locale>>primVMOffsetToUTC (in category 'system primitives') -----
+ primVMOffsetToUTC
+ 	"Returns the offset in minutes between the VM and UTC.
+ 	If the VM does not support UTC times, this is 0.
+ 	Also gives us backward compatibility with old VMs as the primitive will fail and we then can return 0."
+ 	<primitive:'primitiveVMOffsetToUTC' module: 'LocalePlugin'>
+ 	^0!

Item was added:
+ ----- Method: Locale>>printOn: (in category 'accessing') -----
+ printOn: aStream 
+ 	super printOn: aStream.
+ 	aStream nextPutAll: '(' , id printString , ')'!

Item was added:
+ Object subclass: #LocaleID
+ 	instanceVariableNames: 'isoLanguage isoCountry'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!

Item was added:
+ ----- Method: LocaleID class>>current (in category 'accessing') -----
+ current
+ 	^Locale current localeID!

Item was added:
+ ----- Method: LocaleID class>>isoLanguage: (in category 'instance creation') -----
+ isoLanguage: langString
+ 	^self isoLanguage: langString isoCountry: nil!

Item was added:
+ ----- Method: LocaleID class>>isoLanguage:isoCountry: (in category 'instance creation') -----
+ isoLanguage: langString isoCountry: countryStringOrNil
+ 	^self new isoLanguage: langString isoCountry: countryStringOrNil!

Item was added:
+ ----- Method: LocaleID class>>isoString: (in category 'instance creation') -----
+ isoString: isoString
+ 	"Parse the isoString (<language>-<country>) into its components and return the matching LocaleID"
+ 	"LocaleID isoString: 'en' "
+ 	"LocaleID isoString: 'en-us' "
+ 
+ 	| parts language country |
+ 	parts := isoString findTokens: #($- ).
+ 	language := parts first.
+ 	parts size > 1
+ 		ifTrue: [country := parts second].
+ 	^self isoLanguage: language isoCountry: country!

Item was added:
+ ----- Method: LocaleID class>>posixName: (in category 'instance creation') -----
+ posixName: aString 
+ 	^ self
+ 		isoString: (aString copyReplaceAll: ':=' with: '-')!

Item was added:
+ ----- Method: LocaleID class>>previous (in category 'accessing') -----
+ previous
+ 	^Locale previous localeID!

Item was added:
+ ----- Method: LocaleID>>= (in category 'comparing') -----
+ = anotherObject
+ 	self class == anotherObject class
+ 		ifFalse: [^false].
+ 	^self isoLanguage = anotherObject isoLanguage
+ 		and: [self isoCountry = anotherObject isoCountry]!

Item was added:
+ ----- Method: LocaleID>>displayCountry (in category 'accessing') -----
+ displayCountry
+ 	^(ISOLanguageDefinition iso2Countries at: self isoCountry asUppercase ifAbsent: [ self isoCountry ]) !

Item was added:
+ ----- Method: LocaleID>>displayLanguage (in category 'accessing') -----
+ displayLanguage
+ 	| language |
+ 	language := (ISOLanguageDefinition iso2LanguageTable
+ 				at: self isoLanguage
+ 				ifAbsent: [^ self isoLanguage]) language.
+ 	^ self isoCountry
+ 		ifNil: [language]
+ 		ifNotNil: [language , ' (' , self displayCountry , ')']!

Item was added:
+ ----- 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 display name>'.
+ 	translatedMagicPhrase := GetTextTranslator translateWithoutLoading: magicPhrase toLocaleID: self.
+ 	^ translatedMagicPhrase = magicPhrase
+ 		ifTrue: [self displayLanguage]
+ 		ifFalse: [translatedMagicPhrase]!

Item was added:
+ ----- Method: LocaleID>>hasParent (in category 'testing') -----
+ hasParent
+ 	^self isoCountry notNil!

Item was added:
+ ----- Method: LocaleID>>hash (in category 'comparing') -----
+ hash
+ 	^self isoLanguage hash bitXor: self isoCountry hash!

Item was added:
+ ----- Method: LocaleID>>isoCountry (in category 'accessing') -----
+ isoCountry
+ 	^isoCountry!

Item was added:
+ ----- Method: LocaleID>>isoLanguage (in category 'accessing') -----
+ isoLanguage
+ 	^isoLanguage!

Item was added:
+ ----- Method: LocaleID>>isoLanguage:isoCountry: (in category 'initialize') -----
+ isoLanguage: langString isoCountry: countryStringOrNil
+ 	isoLanguage := langString.
+ 	isoCountry := countryStringOrNil!

Item was added:
+ ----- Method: LocaleID>>isoString (in category 'accessing') -----
+ isoString
+ 	^self asString!

Item was added:
+ ----- Method: LocaleID>>parent (in category 'accessing') -----
+ parent
+ 	^self class isoLanguage: self isoLanguage!

Item was added:
+ ----- 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]!

Item was added:
+ ----- Method: LocaleID>>printOn: (in category 'printing') -----
+ printOn: stream
+ 	"<language>-<country>"
+ 	stream nextPutAll: self isoLanguage.
+ 	self isoCountry
+ 		ifNotNil: [stream nextPut: $-; nextPutAll: self isoCountry]!

Item was added:
+ ----- Method: LocaleID>>storeOn: (in category 'printing') -----
+ storeOn: aStream 
+ 	aStream nextPut: $(.
+ 	aStream nextPutAll: self class name.
+ 	aStream nextPutAll: ' isoString: '.
+ 	aStream nextPutAll: '''' , self printString , ''''.
+ 	aStream nextPut: $).
+ !

Item was added:
+ ----- Method: LocaleID>>translator (in category 'accessing') -----
+ translator
+ 	^ InternalTranslator localeID: self !

Item was added:
+ Object subclass: #NaturalLanguageFormTranslator
+ 	instanceVariableNames: 'id generics'
+ 	classVariableNames: 'CachedTranslations'
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>bitmapForJapanese (in category 'as yet unclassified') -----
+ bitmapForJapanese
+ 
+ 	^ (Form
+ 	extent: 54 at 17
+ 	depth: 16
+ 	fromArray: #( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65536 0 1 65537 65537 65537 65537 0 0 0 0 1 0 0 0 0 65537 65537 1 65537 65537 65536 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 65536 0 0 65536 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 65537 65537 65536 1 0 0 0 1 0 0 65536 0 0 1 0 0 0 1 0 1 65537 65537 65537 65537 65537 65537 0 0 0 1 65537 65537 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 65537 65536 0 0 0 65537 65537 0 65536 1 0 0 0 65536 1 0 0 0 1 65537 65537 65537 65537 0 0 0 1 1 1 0 0 0 0 0 0 65536 1 0 0 0 65536 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 65537 65537 65537 65537 65537 65537 0 0 65536 1 0 0 0 1 0 0 0 1 0 0 0 65536 1 0 65536 0 0 0 0 0 0 0 0 0 0 65536 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 65537 65537 1 65537 65537 65536 0 0 65536 1 0 0 0 1 0 0 0 1 0 0 65536 65537 65537 65537 65536 65536 0 65536 1 1 0 0 65536 0 0 65536 0 65536 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 65536 1 1 0 0 65536 0 1 0 0 65536 0 0 1 65537 65537 65537 65537 0 0 0 0 1 0 0 0 0 65537 65537 1 65537 65537 65536 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 65536 0 0 0 65536 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0)
+ 	offset: 0 at 0)!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>cachedTranslations (in category 'accessing') -----
+ cachedTranslations
+ 	"CachedTranslations := nil" 
+ 	^CachedTranslations ifNil: [CachedTranslations := Dictionary new]!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>cleanUp (in category 'class initialization') -----
+ cleanUp
+ 	"Flush caches"
+ 
+ 	CachedTranslations := nil!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>initializeJapaneseBitmap (in category 'as yet unclassified') -----
+ initializeJapaneseBitmap
+ 
+ 	(self localeID: (LocaleID isoString: 'ja')) name: 'LanguageNameInNativeLanguage' form: self bitmapForJapanese.
+ !

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>isoLanguage: (in category 'accessing') -----
+ isoLanguage: isoLanguage
+ 	"Return the generic language translator as there is no information about the country code"
+ 
+ 	^self isoLanguage: isoLanguage isoCountry: nil!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>isoLanguage:isoCountry: (in category 'accessing') -----
+ isoLanguage: isoLanguage isoCountry: isoCountry
+ 	^self localeID: (LocaleID  isoLanguage: isoLanguage isoCountry: isoCountry)!

Item was added:
+ ----- 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).
+ 	pair second associationsDo: [:assoc |
+ 		inst name: assoc key form: assoc value.
+ 	].
+ 	^ inst.
+ !

Item was added:
+ ----- Method: NaturalLanguageFormTranslator class>>localeID: (in category 'accessing') -----
+ localeID: localeID 
+ 	^ self cachedTranslations
+ 		at: localeID
+ 		ifAbsentPut: [self new localeID: localeID]!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>generics (in category 'accessing') -----
+ generics
+ 	^generics ifNil: [generics := Dictionary new]!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>localeID (in category 'accessing') -----
+ localeID
+ 	^id!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>localeID: (in category 'accessing') -----
+ localeID: anID
+ 	id := anID!

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>name:form: (in category 'accessing') -----
+ name: formName form: translatedForm 
+ 	self generics at: formName put: translatedForm.
+ !

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>saveFormsOn: (in category 'i/o') -----
+ saveFormsOn: aStream
+ 
+ 	| rr |
+ 	rr := ReferenceStream on: aStream.
+ 	rr nextPut: {id isoString. generics}.
+ 	rr close.
+ !

Item was added:
+ ----- Method: NaturalLanguageFormTranslator>>translate: (in category 'utilities') -----
+ translate: aString
+ 
+ 	^ (self generics
+ 		at: aString ifAbsent: [nil]) deepCopy.
+ 
+ 	"Do you like to write 'form ifNotNil: [form deepCopy]'?"
+ !

Item was added:
+ Object subclass: #NaturalLanguageTranslator
+ 	instanceVariableNames: 'id'
+ 	classVariableNames: 'Translators'
+ 	poolDictionaries: ''
+ 	category: 'System-Localization'!
+ 
+ !NaturalLanguageTranslator commentStamp: '<historical>' prior: 0!
+ abstract class of natural language translator.
+ Class side manages and holds loaded instances of concrete classes.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>allKnownPhrases (in category 'private') -----
+ allKnownPhrases
+ 	^AllKnownPhrases ifNil: [AllKnownPhrases := Dictionary new: 2051]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>availableForLocaleID: (in category 'accessing') -----
+ availableForLocaleID: localeID 
+ 	"Answer available locale ID.
+ 	If translator is not found for correct locale ID, then isoLanguage is
+ 	attempted for the key."
+ 	^ self translators
+ 		at: localeID
+ 		ifAbsent: [localeID hasParent
+ 				ifTrue: [self translators
+ 						at: localeID parent
+ 						ifAbsent: [self default]]
+ 				ifFalse: [self default]]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>availableLanguageLocaleIDs (in category 'accessing') -----
+ availableLanguageLocaleIDs
+ 	"Return the locale ids for the currently available languages.  
+ 	Meaning those which either internally or externally have  
+ 	translations available."
+ 	"NaturalLanguageTranslator availableLanguageLocaleIDs"
+ 	^ self translators values collect:[:each | each localeID]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>cachedTranslations (in category 'private') -----
+ cachedTranslations
+ 	"CachedTranslations := nil" 
+ 	^CachedTranslations ifNil: [CachedTranslations := Dictionary new]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>cleanUp (in category 'class initialization') -----
+ cleanUp
+ 	"Flush caches"
+ 
+ 	CachedTranslations := nil.
+ 	AllKnownPhrases := nil.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>cleanUpCache (in category 'private') -----
+ cleanUpCache
+ 	"NaturalLanguageTranslator cleanUpCache"
+ 
+ 	self cachedTranslations keys do: [:key |
+ 		key isoLanguage size > 2 ifTrue: [self cachedTranslations removeKey: key]]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>current (in category 'accessing') -----
+ current
+ 	^ self availableForLocaleID: LocaleID current!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>default (in category 'accessing') -----
+ default
+ 	"Answer translator for backstop"
+ 	"self default translate: 'test'"
+ 	^ self new
+ 		localeID: (LocaleID isoLanguage: 'en')!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>directoryForLanguage:country:create: (in category 'private loading') -----
+ directoryForLanguage: isoLanguage country: isoCountry create: createDir
+ 	"Try to locate the <prefs>/locale/<language>{/<country>} folder.
+ 	If createDir is set, create the path down to country or language, depending on wether it's specified..
+ 	Return the directory for country or language depending on specification.
+ 	If neither exists, nil"
+ 
+ 	"NaturalLanguageTranslator directoryForLanguage: 'es' country: nil create: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: 'DE' create: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: 'US' create: false"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: nil create: true"
+ 
+ 	"If this fails, there is nothing we can do about it here"
+ 	| localeDir  countryDir languageDir |
+ 	localeDir := self localeDirCreate: createDir.
+ 	localeDir ifNil: [^nil].
+ 
+ 	isoCountry ifNil: [
+ 		languageDir := localeDir directoryNamed: isoLanguage.
+ 		createDir
+ 			ifTrue: [languageDir assureExistence].
+ 		^languageDir exists
+ 			ifTrue: [languageDir]
+ 			ifFalse: [nil]].
+ 
+ 	countryDir := languageDir directoryNamed: isoCountry.
+ 	createDir
+ 		ifTrue: [countryDir assureExistence].
+ 
+ 	^countryDir exists
+ 		ifTrue: [countryDir]
+ 		ifFalse: [nil]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>directoryForLocaleID:create: (in category 'private loading') -----
+ directoryForLocaleID: localeID create: createDir
+ 	"Try to locate the <prefs>/locale/<language>{/<country>} folder.
+ 	If createDir is set, create the path down to country or language, depending on locale.
+ 	Return the directory for country or language depending on locale.
+ 	If neither exists, nil"
+ 
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: nil readOnly: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'de' country: 'DE' readOnly: true"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: 'US' readOnly: false"
+ 	"NaturalLanguageTranslator directoryForLanguage: 'en' country: nil readOnly: true"
+ 
+ 	^self directoryForLanguage: localeID isoLanguage country: localeID isoCountry create: createDir!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>domainRegistered: (in category 'accessing') -----
+ domainRegistered: aDomainName
+ 	"notify that new TextDomain is registered"
+ 	self translators do: [:each | each domainRegistered: aDomainName]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>domainUnregistered: (in category 'accessing') -----
+ domainUnregistered: aDomainName
+ 	"notify that new TextDomain is unregistered"
+ 	self translators do: [:each | each domainUnregistered: aDomainName]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>fileReaderServicesForFile:suffix: (in category 'file-services') -----
+ fileReaderServicesForFile: fullName suffix: suffix 
+ 	"Answer the file services associated with given file"
+ 	^ (suffix = self translationSuffix) | (suffix = '*')
+ 		ifTrue: [{self serviceMergeLanguageTranslations}]
+ 		ifFalse: [#()]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>initialize (in category 'class initialization') -----
+ initialize
+ 	Smalltalk addToStartUpList: NaturalLanguageTranslator after: FileDirectory.
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>isoLanguage: (in category 'accessing') -----
+ isoLanguage: isoLanguage
+ 	"Return the generic language translator as there is no information about the country code"
+ 
+ 	^self isoLanguage: isoLanguage isoCountry: nil!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>isoLanguage:isoCountry: (in category 'accessing') -----
+ isoLanguage: isoLanguage isoCountry: isoCountry
+ 	^self localeID: (LocaleID  isoLanguage: isoLanguage isoCountry: isoCountry)!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>loadAvailableExternalLocales (in category 'private loading') -----
+ loadAvailableExternalLocales
+ 	"private - register locales IDs based on the content of the <prefs>/locale/ directory"
+ 	| localeDir |
+ 	localeDir := self localeDirCreate: false.
+ 	localeDir ifNil: [^ #()].
+ 	localeDir directoryNames
+ 		do: [:langDirName | 
+ 			| langDir | 
+ 			langDir := localeDir directoryNamed: langDirName.
+ 			(langDir fileNamesMatching: '*.' , self translationSuffix)
+ 				ifNotEmpty: [self loadTranslatorForIsoLanguage: langDirName isoCountry: nil].
+ 			langDir directoryNames
+ 				do: [:countryDirName | 
+ 					| countryDir | 
+ 					countryDir := langDir directoryNamed: countryDirName.
+ 					(countryDir fileNamesMatching: '*.' , self translationSuffix)
+ 						ifNotEmpty: [self loadTranslatorForIsoLanguage: langDirName isoCountry: countryDirName]
+ 			]
+ 		].
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>loadAvailableLocales (in category 'private loading') -----
+ loadAvailableLocales
+ 	"This loads the default locale and all external locales"
+ 
+ 	| defaultID |
+ 	defaultID := LocaleID current.
+ 	self cachedTranslations at: defaultID ifAbsent: [self localeID: defaultID].
+ 	self loadAvailableExternalLocales.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>loadExternalTranslationsFor: (in category 'private loading') -----
+ loadExternalTranslationsFor: translator
+ 	"Try to load translations from external external files.
+ 	The files are located in the <prefs>/locale/<language>{/<country>} folder.
+ 	There can be more than one file for each location, so applications can install their own partial translation tables. All files in the specific folder are loaded."
+ 
+ 	| translationDir |
+ 	translationDir := self directoryForLocaleID: translator localeID create: false.
+ 	translationDir ifNil: [ ^nil ]. 
+ 	(translationDir fileNamesMatching: '*.' , self translationSuffix)
+ 		do: [:fileName | translator loadFromFileNamed: (translationDir fullNameFor: fileName)]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>loadForLocaleIsoString:fromGzippedMimeLiteral: (in category 'file-services') -----
+ loadForLocaleIsoString: localeString fromGzippedMimeLiteral: mimeString 
+ 	"merge the translation from the mime literal."
+ 	| stream localeID translator gs rbStream s currentPlatform |
+ 	s := Base64MimeConverter mimeDecodeToBytes: mimeString readStream.
+ 	s reset.
+ 	gs := GZipReadStream on: s.
+ 	rbStream := MultiByteBinaryOrTextStream with: gs contents asString.
+ 	rbStream converter: UTF8TextConverter new.
+ 	rbStream reset.
+ 	localeID := LocaleID isoString: localeString.
+ 	currentPlatform := Locale currentPlatform.
+ 	[Locale
+ 		currentPlatform: (Locale localeID: localeID).
+ 	stream := ReadStream on: rbStream contents]
+ 		ensure: [Locale currentPlatform: currentPlatform].
+ 	translator := self localeID: localeID.
+ 	translator loadFromStream: stream.
+ 	LanguageEnvironment resetKnownEnvironments!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>loadTranslatorForIsoLanguage:isoCountry: (in category 'private loading') -----
+ loadTranslatorForIsoLanguage: isoLanguage isoCountry: isoCountry 
+ 	"private - load the translations from <prefs>/locale/ directory  
+ 	the procedure is to assure the existence of a translator for the  
+ 	given language/country and then load the external translations for this translator"
+ 
+ 	| translator |
+ 	translator := self localeID: (LocaleID isoLanguage: isoLanguage isoCountry: isoCountry).
+ 
+ 	self loadExternalTranslationsFor: translator!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>localeChanged (in category 'accessing') -----
+ localeChanged
+ 	"notify some project starts to use this locale.
+ 	 this facility may use the event to load translation data dynamically" 
+ 	self current setCurrent
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>localeDirCreate: (in category 'private loading') -----
+ localeDirCreate: createDir
+ 	"Try to locate the <prefs>/locale/ folder.
+ 	If createDir is set, try to create the path.
+ 	If it doesn't exist, return nil"
+ 
+ 	"If this fails, there is nothing we can do about it here"
+ 	| prefDir  localeDir |
+ 	(createDir not
+ 			and: [ExternalSettings preferenceDirectory isNil])
+ 		ifTrue: [^ nil].
+ 
+ 	prefDir := ExternalSettings assuredPreferenceDirectory.
+ 	prefDir exists
+ 		ifFalse: [^nil].
+ 
+ 
+ 	localeDir := prefDir directoryNamed: 'locale'.
+ 	createDir
+ 		ifTrue: [localeDir assureExistence].
+ 	^localeDir exists
+ 		ifTrue: [localeDir]
+ 		ifFalse: [nil]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>localeID: (in category 'accessing') -----
+ localeID: localeID 
+ 	^ self cachedTranslations
+ 		at: localeID
+ 		ifAbsentPut: [self new localeID: localeID]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>mergeTranslationFileNamed: (in category 'file-services') -----
+ mergeTranslationFileNamed: fileFullNameString 
+ 	"merge the translation in the file named fileFullNameString"
+ 
+ 	FileStream readOnlyFileNamed: fileFullNameString do: [:stream |
+ 		| localeID translator |
+ 		localeID := LocaleID isoString: stream localName sansPeriodSuffix.
+ 		translator := self localeID: localeID.
+ 		translator loadFromStream: stream].
+ 	LanguageEnvironment resetKnownEnvironments.
+ 
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>privateStartUp (in category 'class initialization') -----
+ privateStartUp
+ 	self resetCaches.
+ 	GetTextTranslator privateStartUp.
+ 	InternalTranslator privateStartUp.
+ 	self localeChanged.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>registerPhrase: (in category 'private') -----
+ registerPhrase: phrase
+ 	"Using a Dictionary so we can lookup existing string instead of creating needless copies when loading a translation."
+ 	self allKnownPhrases at: phrase put: phrase!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>registeredPhraseFor: (in category 'private') -----
+ registeredPhraseFor: phrase
+ 	"Using a Dictionary so we can lookup existing string instead of creating needless copies when loading a translation."
+ 	^self allKnownPhrases at: phrase ifAbsentPut: [phrase]!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>removeLocaleID: (in category 'accessing') -----
+ removeLocaleID: localeID 
+ 	"self removeLocaleID: (LocaleID isoString: 'ja-kids')"
+ 	^ self translators
+ 		removeKey: localeID
+ 		ifAbsent: []!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>resetCaches (in category 'class initialization') -----
+ resetCaches
+ 	Translators := nil.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>serviceMergeLanguageTranslations (in category 'file-services') -----
+ serviceMergeLanguageTranslations
+ 	"Answer a service for merging of translation files"
+ 	^ SimpleServiceEntry
+ 		provider: self
+ 		label: 'merge the translation file'
+ 		selector: #mergeTranslationFileNamed:
+ 		description: 'merge the translation file into the language named like the file'
+ 		buttonLabel: 'merge'!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>services (in category 'file-services') -----
+ services
+ 	"Answer potential file services associated with this class"
+ 	^ {self serviceMergeLanguageTranslations}!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>startUp: (in category 'class initialization') -----
+ startUp: resuming 
+ 	resuming
+ 		ifFalse: [^ self].
+ 	self privateStartUp.!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>translate:toLocaleID: (in category 'translation') -----
+ translate: aString toLocaleID: localeID
+ 	"translate for default domain"
+ 	^ (self availableForLocaleID: localeID)
+ 		translate: aString!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>translate:toLocaleID:inDomain: (in category 'translation') -----
+ translate: aString toLocaleID: localeID inDomain: aDomainName
+ 	^ (self availableForLocaleID: localeID)
+ 		translate: aString inDomain: aDomainName!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>translateWithoutLoading:toLocaleID: (in category 'translation') -----
+ translateWithoutLoading: aString toLocaleID: localeID
+ 	"translate for default domain"
+ 	^self translateWithoutLoading: aString toLocaleID: localeID inDomain: TextDomainManager defaultDomain.
+ !

Item was added:
+ ----- 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 isDomainLoaded: aDomainName) ifFalse: [
+ 		(InternalTranslator availableLanguageLocaleIDs includes: localeID)
+ 			ifTrue:  [translator := InternalTranslator localeID: localeID].
+ 	].
+ 	^translator translate: aString inDomain: aDomainName!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>translationSuffix (in category 'private') -----
+ translationSuffix
+ 	^'translation'!

Item was added:
+ ----- Method: NaturalLanguageTranslator class>>translators (in category 'accessing') -----
+ translators
+ 	^ Translators ifNil: [Translators := Dictionary new]	!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>atRandom (in category 'accessing') -----
+ atRandom
+ 
+ 	self subclassResponsibility.
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>checkPhrase:translation: (in category 'translation') -----
+ checkPhrase: phrase translation: translation!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>defaultBackgroundColor (in category 'user interface') -----
+ defaultBackgroundColor
+ 	"answer the receiver's defaultBackgroundColor for views"
+ 	^ Color cyan!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>displayLanguage (in category 'accessing') -----
+ displayLanguage
+ 	^ id displayLanguage!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>displayName (in category 'accessing') -----
+ displayName
+ 	^ id displayName!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>domainRegistered: (in category 'accessing') -----
+ domainRegistered: aDomainName
+ 	"notify that new TextDomain is registered.  Concrete subclass can responds to this event if needed"!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>domainUnregistered: (in category 'accessing') -----
+ domainUnregistered: aDomainName
+ 	"notify that new TextDomain is unregistered.  Concrete subclass can responds to this event if needed"!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>fileOutHeader (in category 'fileIn/fileOut') -----
+ fileOutHeader
+ 	^ '''Translation dictionary'''!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>fileOutHeaderOn: (in category 'fileIn/fileOut') -----
+ fileOutHeaderOn: aStream 
+ 	aStream nextChunkPut: self fileOutHeader;
+ 		 cr.
+ 	aStream timeStamp; cr.
+ 	aStream nextPut: $!!.
+ 	aStream nextChunkPut: '(' , self class name , ' localeID: ' , id storeString , ')'.
+ 	aStream cr!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>fileOutOn: (in category 'fileIn/fileOut') -----
+ fileOutOn: aStream 
+ 	"self current fileOutOn: Transcript. Transcript endEntry"
+ 	self fileOutHeaderOn: aStream.
+ 	self fileOutOn: aStream keys: nil!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>fileOutOn:keys: (in category 'fileIn/fileOut') -----
+ fileOutOn: aStream keys: keys 
+ 	"self current fileOutOn: Transcript. Transcript endEntry"
+ 	(keys
+ 		ifNil: [generics keys asArray sort])
+ 		do: [:key | self
+ 				nextChunkPut: (generics associationAt: key)
+ 				on: aStream].
+ 	keys
+ 		ifNil: [self untranslated
+ 				do: [:each | self nextChunkPut: each -> '' on: aStream]].
+ 	aStream nextPut: $!!;
+ 		 cr!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>generics (in category 'private') -----
+ generics
+ 	^generics ifNil: [generics := Dictionary new]!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>isDomainLoaded: (in category 'accessing') -----
+ isDomainLoaded: aDomainName
+ 	"ask if translation dictionary for the domain has been loaded and available now for use"
+ 	self subclassResponsibility.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>isoCountry (in category 'accessing') -----
+ isoCountry
+ 	^self localeID isoCountry!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>isoLanguage (in category 'accessing') -----
+ isoLanguage
+ 	^self localeID isoLanguage!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>loadFromFileNamed: (in category 'private store-retrieve') -----
+ loadFromFileNamed: fileNameString 
+ 	"Load translations from an external file"
+ 
+ 	FileStream readOnlyFileNamed: fileNameString do: [ :file |
+ 		self loadFromStream: file ].
+ 	self changed: #translations.
+ 	self changed: #untranslated.
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>loadFromRefStream: (in category 'private store-retrieve') -----
+ loadFromRefStream: stream 
+ 	"Load translations from an external file"
+ 	| loadedArray refStream |
+ 	refStream := ReferenceStream on: stream.
+ 	[loadedArray := refStream next]
+ 		ensure: [refStream close].
+ 	self processExternalObject: loadedArray !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>loadFromStream: (in category 'private store-retrieve') -----
+ 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 ' translated, stream localName]
+ 		ifFalse: [self loadFromRefStream: stream]!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>localeID (in category 'accessing') -----
+ localeID
+ 	^id!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>localeID: (in category 'initialize-release') -----
+ localeID: anID
+ 	id := anID!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>mergeTranslations: (in category 'private store-retrieve') -----
+ 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.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>nextChunkPut:on: (in category 'fileIn/fileOut') -----
+ 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.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>phrase:translation: (in category 'translation') -----
+ phrase: phraseString translation: translationString 
+ 	self generics at: phraseString put: translationString asString.
+ 	self changed: #translations.
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>printOn: (in category 'printing') -----
+ printOn: aStream
+ 	aStream nextPutAll: self class name; nextPut: $(; print: self localeID; nextPut: $)!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>processExternalObject: (in category 'private store-retrieve') -----
+ processExternalObject: anArray 
+ 	"pivate - process the external object"
+ 
+ 	"new format -> {translations. untranslated}"
+ 
+ 	anArray second do: [:each | self class registerPhrase: each].
+ 
+ 	self mergeTranslations: anArray first!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>rawPhrase:translation: (in category 'translation') -----
+ rawPhrase: phraseString translation: translationString 
+ 	self generics at: phraseString put: translationString asString.
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>rawRemoveUntranslated: (in category 'translation') -----
+ rawRemoveUntranslated: untranslated
+ 
+ 	self class allKnownPhrases removeKey: untranslated ifAbsent: [].
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>removeTranslationFor: (in category 'translation') -----
+ removeTranslationFor: phraseString
+ 	self generics removeKey: phraseString ifAbsent: [].
+ 	self changed: #translations.
+ 	self changed: #untranslated.!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>removeUntranslated: (in category 'translation') -----
+ removeUntranslated: untranslated
+ 
+ 	self class allKnownPhrases removeKey: untranslated ifAbsent: [].
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>saveToFileNamed: (in category 'private store-retrieve') -----
+ 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.
+ 			^ self].
+ 	stream := FileStream fileNamed: fileNameString.
+ 	[self fileOutOn: stream]
+ 		ensure: [stream close]!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>scanFrom: (in category 'fileIn/fileOut') -----
+ scanFrom: aStream 
+ 	"Read a definition of dictionary.  
+ 	Make sure current locale corresponds my locale id"
+ 	| newTranslations currentPlatform |
+ 	newTranslations := Dictionary new.
+ 	currentPlatform := Locale currentPlatform.
+ 	[ | aString assoc |
+ 	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!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>setCurrent (in category 'language switching') -----
+ setCurrent
+ 	"notify locale of the translator become current"
+ !

Item was added:
+ ----- Method: NaturalLanguageTranslator>>translate: (in category 'translation') -----
+ translate: aString
+ 	^self translate: aString 
+ 		inDomain: TextDomainManager defaultDomain!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>translate:in: (in category 'translation') -----
+ translate: aString in: aContext!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>translate:inDomain: (in category 'translation') -----
+ translate: aString inDomain: aDomainName
+ 	^ aString!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>translationFor: (in category 'translation') -----
+ translationFor: aString
+ 	^self translate: aString!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>translations (in category 'accessing') -----
+ translations
+ 	^self generics!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>untranslated (in category 'accessing') -----
+ untranslated
+ 	| translations |
+ 	translations := self translations.
+ 	^self class allKnownPhrases reject: [:each | translations includesKey: each]!

Item was added:
+ ----- Method: NaturalLanguageTranslator>>writeAsMimeString (in category 'fileIn/fileOut') -----
+ writeAsMimeString
+ 
+ 	| fileName fileStream tmpStream s2 gzs |
+ 	tmpStream := MultiByteBinaryOrTextStream on: ''.
+ 	tmpStream converter: UTF8TextConverter new.
+ 	self fileOutOn: tmpStream.
+ 	s2 := RWBinaryOrTextStream on: ''.
+ 	gzs := GZipWriteStream on: s2.
+ 	tmpStream reset.
+ 	gzs nextPutAll: (tmpStream binary contentsOfEntireFile asString) contents.
+ 	gzs close.
+ 	s2 reset.
+ 
+ 	fileName := id isoString, '.translation.gz.mime'.
+ 	fileStream := FileStream newFileNamed: fileName.
+ 	fileStream nextPutAll: (Base64MimeConverter mimeEncode: s2) contents.
+ 	fileStream close.
+ !



More information about the Packages mailing list