Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2013-05-03 00:11:37 (GMT)
committer Ajay Garg <ajay@activitycentral.com>2013-05-28 04:57:51 (GMT)
commitbaa6c0759dc06c73ca6e66fc768d42c8b5eabffa (patch)
tree4867d79213b05bc9e218ce064295c7024b5c8c58
parentc0b998b6f49068d6e648ded0566a41f8c5de617f (diff)
Complete port to introspection; fix problem with language setting
This series of patches completes the conversion to intropection for the keyboard section of the Sugar control panel. The issues were: (1) conversion to XKL (import xklavier was causing Sugar to crash); (2) work-around for the problem with gconf get_list and set_list (dnarvaez added a Sugar extention to enable set_list to save a list of keyboard layouts); and (3) fixing a problem with setting the proper default languages in the UI. Part 3 requires a conversion from ISO-639 2-character codes to ISO-639 3-character codes. This is accomplished by making use of a table available at: http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt A snapshot of this table is now included in sugar/data. Signed-off-by: Ajay Garg <ajay@activitycentral.com>
-rw-r--r--data/ISO-639-2_utf-8.txt486
-rw-r--r--data/Makefile.am1
-rw-r--r--extensions/cpsection/keyboard/model.py70
-rw-r--r--extensions/cpsection/keyboard/view.py121
4 files changed, 614 insertions, 64 deletions
diff --git a/data/ISO-639-2_utf-8.txt b/data/ISO-639-2_utf-8.txt
new file mode 100644
index 0000000..e2ba0be
--- /dev/null
+++ b/data/ISO-639-2_utf-8.txt
@@ -0,0 +1,486 @@
+aar||aa|Afar|afar
+abk||ab|Abkhazian|abkhaze
+ace|||Achinese|aceh
+ach|||Acoli|acoli
+ada|||Adangme|adangme
+ady|||Adyghe; Adygei|adyghé
+afa|||Afro-Asiatic languages|afro-asiatiques, langues
+afh|||Afrihili|afrihili
+afr||af|Afrikaans|afrikaans
+ain|||Ainu|aïnou
+aka||ak|Akan|akan
+akk|||Akkadian|akkadien
+alb|sqi|sq|Albanian|albanais
+ale|||Aleut|aléoute
+alg|||Algonquian languages|algonquines, langues
+alt|||Southern Altai|altai du Sud
+amh||am|Amharic|amharique
+ang|||English, Old (ca.450-1100)|anglo-saxon (ca.450-1100)
+anp|||Angika|angika
+apa|||Apache languages|apaches, langues
+ara||ar|Arabic|arabe
+arc|||Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)|araméen d'empire (700-300 BCE)
+arg||an|Aragonese|aragonais
+arm|hye|hy|Armenian|arménien
+arn|||Mapudungun; Mapuche|mapudungun; mapuche; mapuce
+arp|||Arapaho|arapaho
+art|||Artificial languages|artificielles, langues
+arw|||Arawak|arawak
+asm||as|Assamese|assamais
+ast|||Asturian; Bable; Leonese; Asturleonese|asturien; bable; léonais; asturoléonais
+ath|||Athapascan languages|athapascanes, langues
+aus|||Australian languages|australiennes, langues
+ava||av|Avaric|avar
+ave||ae|Avestan|avestique
+awa|||Awadhi|awadhi
+aym||ay|Aymara|aymara
+aze||az|Azerbaijani|azéri
+bad|||Banda languages|banda, langues
+bai|||Bamileke languages|bamiléké, langues
+bak||ba|Bashkir|bachkir
+bal|||Baluchi|baloutchi
+bam||bm|Bambara|bambara
+ban|||Balinese|balinais
+baq|eus|eu|Basque|basque
+bas|||Basa|basa
+bat|||Baltic languages|baltes, langues
+bej|||Beja; Bedawiyet|bedja
+bel||be|Belarusian|biélorusse
+bem|||Bemba|bemba
+ben||bn|Bengali|bengali
+ber|||Berber languages|berbères, langues
+bho|||Bhojpuri|bhojpuri
+bih||bh|Bihari languages|langues biharis
+bik|||Bikol|bikol
+bin|||Bini; Edo|bini; edo
+bis||bi|Bislama|bichlamar
+bla|||Siksika|blackfoot
+bnt|||Bantu (Other)|bantoues, autres langues
+bos||bs|Bosnian|bosniaque
+bra|||Braj|braj
+bre||br|Breton|breton
+btk|||Batak languages|batak, langues
+bua|||Buriat|bouriate
+bug|||Buginese|bugi
+bul||bg|Bulgarian|bulgare
+bur|mya|my|Burmese|birman
+byn|||Blin; Bilin|blin; bilen
+cad|||Caddo|caddo
+cai|||Central American Indian languages|amérindiennes de L'Amérique centrale, langues
+car|||Galibi Carib|karib; galibi; carib
+cat||ca|Catalan; Valencian|catalan; valencien
+cau|||Caucasian languages|caucasiennes, langues
+ceb|||Cebuano|cebuano
+cel|||Celtic languages|celtiques, langues; celtes, langues
+cha||ch|Chamorro|chamorro
+chb|||Chibcha|chibcha
+che||ce|Chechen|tchétchène
+chg|||Chagatai|djaghataï
+chi|zho|zh|Chinese|chinois
+chk|||Chuukese|chuuk
+chm|||Mari|mari
+chn|||Chinook jargon|chinook, jargon
+cho|||Choctaw|choctaw
+chp|||Chipewyan; Dene Suline|chipewyan
+chr|||Cherokee|cherokee
+chu||cu|Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic|slavon d'église; vieux slave; slavon liturgique; vieux bulgare
+chv||cv|Chuvash|tchouvache
+chy|||Cheyenne|cheyenne
+cmc|||Chamic languages|chames, langues
+cop|||Coptic|copte
+cor||kw|Cornish|cornique
+cos||co|Corsican|corse
+cpe|||Creoles and pidgins, English based|créoles et pidgins basés sur l'anglais
+cpf|||Creoles and pidgins, French-based |créoles et pidgins basés sur le français
+cpp|||Creoles and pidgins, Portuguese-based |créoles et pidgins basés sur le portugais
+cre||cr|Cree|cree
+crh|||Crimean Tatar; Crimean Turkish|tatar de Crimé
+crp|||Creoles and pidgins |créoles et pidgins
+csb|||Kashubian|kachoube
+cus|||Cushitic languages|couchitiques, langues
+cze|ces|cs|Czech|tchèque
+dak|||Dakota|dakota
+dan||da|Danish|danois
+dar|||Dargwa|dargwa
+day|||Land Dayak languages|dayak, langues
+del|||Delaware|delaware
+den|||Slave (Athapascan)|esclave (athapascan)
+dgr|||Dogrib|dogrib
+din|||Dinka|dinka
+div||dv|Divehi; Dhivehi; Maldivian|maldivien
+doi|||Dogri|dogri
+dra|||Dravidian languages|dravidiennes, langues
+dsb|||Lower Sorbian|bas-sorabe
+dua|||Duala|douala
+dum|||Dutch, Middle (ca.1050-1350)|néerlandais moyen (ca. 1050-1350)
+dut|nld|nl|Dutch; Flemish|néerlandais; flamand
+dyu|||Dyula|dioula
+dzo||dz|Dzongkha|dzongkha
+efi|||Efik|efik
+egy|||Egyptian (Ancient)|égyptien
+eka|||Ekajuk|ekajuk
+elx|||Elamite|élamite
+eng||en|English|anglais
+enm|||English, Middle (1100-1500)|anglais moyen (1100-1500)
+epo||eo|Esperanto|espéranto
+est||et|Estonian|estonien
+ewe||ee|Ewe|éwé
+ewo|||Ewondo|éwondo
+fan|||Fang|fang
+fao||fo|Faroese|féroïen
+fat|||Fanti|fanti
+fij||fj|Fijian|fidjien
+fil|||Filipino; Pilipino|filipino; pilipino
+fin||fi|Finnish|finnois
+fiu|||Finno-Ugrian languages|finno-ougriennes, langues
+fon|||Fon|fon
+fre|fra|fr|French|français
+frm|||French, Middle (ca.1400-1600)|français moyen (1400-1600)
+fro|||French, Old (842-ca.1400)|français ancien (842-ca.1400)
+frr|||Northern Frisian|frison septentrional
+frs|||Eastern Frisian|frison oriental
+fry||fy|Western Frisian|frison occidental
+ful||ff|Fulah|peul
+fur|||Friulian|frioulan
+gaa|||Ga|ga
+gay|||Gayo|gayo
+gba|||Gbaya|gbaya
+gem|||Germanic languages|germaniques, langues
+geo|kat|ka|Georgian|géorgien
+ger|deu|de|German|allemand
+gez|||Geez|guèze
+gil|||Gilbertese|kiribati
+gla||gd|Gaelic; Scottish Gaelic|gaélique; gaélique écossais
+gle||ga|Irish|irlandais
+glg||gl|Galician|galicien
+glv||gv|Manx|manx; mannois
+gmh|||German, Middle High (ca.1050-1500)|allemand, moyen haut (ca. 1050-1500)
+goh|||German, Old High (ca.750-1050)|allemand, vieux haut (ca. 750-1050)
+gon|||Gondi|gond
+gor|||Gorontalo|gorontalo
+got|||Gothic|gothique
+grb|||Grebo|grebo
+grc|||Greek, Ancient (to 1453)|grec ancien (jusqu'à 1453)
+gre|ell|el|Greek, Modern (1453-)|grec moderne (après 1453)
+grn||gn|Guarani|guarani
+gsw|||Swiss German; Alemannic; Alsatian|suisse alémanique; alémanique; alsacien
+guj||gu|Gujarati|goudjrati
+gwi|||Gwich'in|gwich'in
+hai|||Haida|haida
+hat||ht|Haitian; Haitian Creole|haïtien; créole haïtien
+hau||ha|Hausa|haoussa
+haw|||Hawaiian|hawaïen
+heb||he|Hebrew|hébreu
+her||hz|Herero|herero
+hil|||Hiligaynon|hiligaynon
+him|||Himachali languages; Western Pahari languages|langues himachalis; langues paharis occidentales
+hin||hi|Hindi|hindi
+hit|||Hittite|hittite
+hmn|||Hmong; Mong|hmong
+hmo||ho|Hiri Motu|hiri motu
+hrv||hr|Croatian|croate
+hsb|||Upper Sorbian|haut-sorabe
+hun||hu|Hungarian|hongrois
+hup|||Hupa|hupa
+iba|||Iban|iban
+ibo||ig|Igbo|igbo
+ice|isl|is|Icelandic|islandais
+ido||io|Ido|ido
+iii||ii|Sichuan Yi; Nuosu|yi de Sichuan
+ijo|||Ijo languages|ijo, langues
+iku||iu|Inuktitut|inuktitut
+ile||ie|Interlingue; Occidental|interlingue
+ilo|||Iloko|ilocano
+ina||ia|Interlingua (International Auxiliary Language Association)|interlingua (langue auxiliaire internationale)
+inc|||Indic languages|indo-aryennes, langues
+ind||id|Indonesian|indonésien
+ine|||Indo-European languages|indo-européennes, langues
+inh|||Ingush|ingouche
+ipk||ik|Inupiaq|inupiaq
+ira|||Iranian languages|iraniennes, langues
+iro|||Iroquoian languages|iroquoises, langues
+ita||it|Italian|italien
+jav||jv|Javanese|javanais
+jbo|||Lojban|lojban
+jpn||ja|Japanese|japonais
+jpr|||Judeo-Persian|judéo-persan
+jrb|||Judeo-Arabic|judéo-arabe
+kaa|||Kara-Kalpak|karakalpak
+kab|||Kabyle|kabyle
+kac|||Kachin; Jingpho|kachin; jingpho
+kal||kl|Kalaallisut; Greenlandic|groenlandais
+kam|||Kamba|kamba
+kan||kn|Kannada|kannada
+kar|||Karen languages|karen, langues
+kas||ks|Kashmiri|kashmiri
+kau||kr|Kanuri|kanouri
+kaw|||Kawi|kawi
+kaz||kk|Kazakh|kazakh
+kbd|||Kabardian|kabardien
+kha|||Khasi|khasi
+khi|||Khoisan languages|khoïsan, langues
+khm||km|Central Khmer|khmer central
+kho|||Khotanese; Sakan|khotanais; sakan
+kik||ki|Kikuyu; Gikuyu|kikuyu
+kin||rw|Kinyarwanda|rwanda
+kir||ky|Kirghiz; Kyrgyz|kirghiz
+kmb|||Kimbundu|kimbundu
+kok|||Konkani|konkani
+kom||kv|Komi|kom
+kon||kg|Kongo|kongo
+kor||ko|Korean|coréen
+kos|||Kosraean|kosrae
+kpe|||Kpelle|kpellé
+krc|||Karachay-Balkar|karatchai balkar
+krl|||Karelian|carélien
+kro|||Kru languages|krou, langues
+kru|||Kurukh|kurukh
+kua||kj|Kuanyama; Kwanyama|kuanyama; kwanyama
+kum|||Kumyk|koumyk
+kur||ku|Kurdish|kurde
+kut|||Kutenai|kutenai
+lad|||Ladino|judéo-espagnol
+lah|||Lahnda|lahnda
+lam|||Lamba|lamba
+lao||lo|Lao|lao
+lat||la|Latin|latin
+lav||lv|Latvian|letton
+lez|||Lezghian|lezghien
+lim||li|Limburgan; Limburger; Limburgish|limbourgeois
+lin||ln|Lingala|lingala
+lit||lt|Lithuanian|lituanien
+lol|||Mongo|mongo
+loz|||Lozi|lozi
+ltz||lb|Luxembourgish; Letzeburgesch|luxembourgeois
+lua|||Luba-Lulua|luba-lulua
+lub||lu|Luba-Katanga|luba-katanga
+lug||lg|Ganda|ganda
+lui|||Luiseno|luiseno
+lun|||Lunda|lunda
+luo|||Luo (Kenya and Tanzania)|luo (Kenya et Tanzanie)
+lus|||Lushai|lushai
+mac|mkd|mk|Macedonian|macédonien
+mad|||Madurese|madourais
+mag|||Magahi|magahi
+mah||mh|Marshallese|marshall
+mai|||Maithili|maithili
+mak|||Makasar|makassar
+mal||ml|Malayalam|malayalam
+man|||Mandingo|mandingue
+mao|mri|mi|Maori|maori
+map|||Austronesian languages|austronésiennes, langues
+mar||mr|Marathi|marathe
+mas|||Masai|massaï
+may|msa|ms|Malay|malais
+mdf|||Moksha|moksa
+mdr|||Mandar|mandar
+men|||Mende|mendé
+mga|||Irish, Middle (900-1200)|irlandais moyen (900-1200)
+mic|||Mi'kmaq; Micmac|mi'kmaq; micmac
+min|||Minangkabau|minangkabau
+mis|||Uncoded languages|langues non codées
+mkh|||Mon-Khmer languages|môn-khmer, langues
+mlg||mg|Malagasy|malgache
+mlt||mt|Maltese|maltais
+mnc|||Manchu|mandchou
+mni|||Manipuri|manipuri
+mno|||Manobo languages|manobo, langues
+moh|||Mohawk|mohawk
+mon||mn|Mongolian|mongol
+mos|||Mossi|moré
+mul|||Multiple languages|multilingue
+mun|||Munda languages|mounda, langues
+mus|||Creek|muskogee
+mwl|||Mirandese|mirandais
+mwr|||Marwari|marvari
+myn|||Mayan languages|maya, langues
+myv|||Erzya|erza
+nah|||Nahuatl languages|nahuatl, langues
+nai|||North American Indian languages|nord-amérindiennes, langues
+nap|||Neapolitan|napolitain
+nau||na|Nauru|nauruan
+nav||nv|Navajo; Navaho|navaho
+nbl||nr|Ndebele, South; South Ndebele|ndébélé du Sud
+nde||nd|Ndebele, North; North Ndebele|ndébélé du Nord
+ndo||ng|Ndonga|ndonga
+nds|||Low German; Low Saxon; German, Low; Saxon, Low|bas allemand; bas saxon; allemand, bas; saxon, bas
+nep||ne|Nepali|népalais
+new|||Nepal Bhasa; Newari|nepal bhasa; newari
+nia|||Nias|nias
+nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
+niu|||Niuean|niué
+nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvégien nynorsk; nynorsk, norvégien
+nob||nb|Bokmål, Norwegian; Norwegian Bokmål|norvégien bokmål
+nog|||Nogai|nogaï; nogay
+non|||Norse, Old|norrois, vieux
+nor||no|Norwegian|norvégien
+nqo|||N'Ko|n'ko
+nso|||Pedi; Sepedi; Northern Sotho|pedi; sepedi; sotho du Nord
+nub|||Nubian languages|nubiennes, langues
+nwc|||Classical Newari; Old Newari; Classical Nepal Bhasa|newari classique
+nya||ny|Chichewa; Chewa; Nyanja|chichewa; chewa; nyanja
+nym|||Nyamwezi|nyamwezi
+nyn|||Nyankole|nyankolé
+nyo|||Nyoro|nyoro
+nzi|||Nzima|nzema
+oci||oc|Occitan (post 1500); Provençal|occitan (après 1500); provençal
+oji||oj|Ojibwa|ojibwa
+ori||or|Oriya|oriya
+orm||om|Oromo|galla
+osa|||Osage|osage
+oss||os|Ossetian; Ossetic|ossète
+ota|||Turkish, Ottoman (1500-1928)|turc ottoman (1500-1928)
+oto|||Otomian languages|otomi, langues
+paa|||Papuan languages|papoues, langues
+pag|||Pangasinan|pangasinan
+pal|||Pahlavi|pahlavi
+pam|||Pampanga; Kapampangan|pampangan
+pan||pa|Panjabi; Punjabi|pendjabi
+pap|||Papiamento|papiamento
+pau|||Palauan|palau
+peo|||Persian, Old (ca.600-400 B.C.)|perse, vieux (ca. 600-400 av. J.-C.)
+per|fas|fa|Persian|persan
+phi|||Philippine languages|philippines, langues
+phn|||Phoenician|phénicien
+pli||pi|Pali|pali
+pol||pl|Polish|polonais
+pon|||Pohnpeian|pohnpei
+por||pt|Portuguese|portugais
+pra|||Prakrit languages|prâkrit, langues
+pro|||Provençal, Old (to 1500)|provençal ancien (jusqu'à 1500)
+pus||ps|Pushto; Pashto|pachto
+qaa-qtz|||Reserved for local use|réservée à l'usage local
+que||qu|Quechua|quechua
+raj|||Rajasthani|rajasthani
+rap|||Rapanui|rapanui
+rar|||Rarotongan; Cook Islands Maori|rarotonga; maori des îles Cook
+roa|||Romance languages|romanes, langues
+roh||rm|Romansh|romanche
+rom|||Romany|tsigane
+rum|ron|ro|Romanian; Moldavian; Moldovan|roumain; moldave
+run||rn|Rundi|rundi
+rup|||Aromanian; Arumanian; Macedo-Romanian|aroumain; macédo-roumain
+rus||ru|Russian|russe
+sad|||Sandawe|sandawe
+sag||sg|Sango|sango
+sah|||Yakut|iakoute
+sai|||South American Indian (Other)|indiennes d'Amérique du Sud, autres langues
+sal|||Salishan languages|salishennes, langues
+sam|||Samaritan Aramaic|samaritain
+san||sa|Sanskrit|sanskrit
+sas|||Sasak|sasak
+sat|||Santali|santal
+scn|||Sicilian|sicilien
+sco|||Scots|écossais
+sel|||Selkup|selkoupe
+sem|||Semitic languages|sémitiques, langues
+sga|||Irish, Old (to 900)|irlandais ancien (jusqu'à 900)
+sgn|||Sign Languages|langues des signes
+shn|||Shan|chan
+sid|||Sidamo|sidamo
+sin||si|Sinhala; Sinhalese|singhalais
+sio|||Siouan languages|sioux, langues
+sit|||Sino-Tibetan languages|sino-tibétaines, langues
+sla|||Slavic languages|slaves, langues
+slo|slk|sk|Slovak|slovaque
+slv||sl|Slovenian|slovène
+sma|||Southern Sami|sami du Sud
+sme||se|Northern Sami|sami du Nord
+smi|||Sami languages|sames, langues
+smj|||Lule Sami|sami de Lule
+smn|||Inari Sami|sami d'Inari
+smo||sm|Samoan|samoan
+sms|||Skolt Sami|sami skolt
+sna||sn|Shona|shona
+snd||sd|Sindhi|sindhi
+snk|||Soninke|soninké
+sog|||Sogdian|sogdien
+som||so|Somali|somali
+son|||Songhai languages|songhai, langues
+sot||st|Sotho, Southern|sotho du Sud
+spa||es|Spanish; Castilian|espagnol; castillan
+srd||sc|Sardinian|sarde
+srn|||Sranan Tongo|sranan tongo
+srp||sr|Serbian|serbe
+srr|||Serer|sérère
+ssa|||Nilo-Saharan languages|nilo-sahariennes, langues
+ssw||ss|Swati|swati
+suk|||Sukuma|sukuma
+sun||su|Sundanese|soundanais
+sus|||Susu|soussou
+sux|||Sumerian|sumérien
+swa||sw|Swahili|swahili
+swe||sv|Swedish|suédois
+syc|||Classical Syriac|syriaque classique
+syr|||Syriac|syriaque
+tah||ty|Tahitian|tahitien
+tai|||Tai languages|tai, langues
+tam||ta|Tamil|tamoul
+tat||tt|Tatar|tatar
+tel||te|Telugu|télougou
+tem|||Timne|temne
+ter|||Tereno|tereno
+tet|||Tetum|tetum
+tgk||tg|Tajik|tadjik
+tgl||tl|Tagalog|tagalog
+tha||th|Thai|thaï
+tib|bod|bo|Tibetan|tibétain
+tig|||Tigre|tigré
+tir||ti|Tigrinya|tigrigna
+tiv|||Tiv|tiv
+tkl|||Tokelau|tokelau
+tlh|||Klingon; tlhIngan-Hol|klingon
+tli|||Tlingit|tlingit
+tmh|||Tamashek|tamacheq
+tog|||Tonga (Nyasa)|tonga (Nyasa)
+ton||to|Tonga (Tonga Islands)|tongan (Îles Tonga)
+tpi|||Tok Pisin|tok pisin
+tsi|||Tsimshian|tsimshian
+tsn||tn|Tswana|tswana
+tso||ts|Tsonga|tsonga
+tuk||tk|Turkmen|turkmène
+tum|||Tumbuka|tumbuka
+tup|||Tupi languages|tupi, langues
+tur||tr|Turkish|turc
+tut|||Altaic languages|altaïques, langues
+tvl|||Tuvalu|tuvalu
+twi||tw|Twi|twi
+tyv|||Tuvinian|touva
+udm|||Udmurt|oudmourte
+uga|||Ugaritic|ougaritique
+uig||ug|Uighur; Uyghur|ouïgour
+ukr||uk|Ukrainian|ukrainien
+umb|||Umbundu|umbundu
+und|||Undetermined|indéterminée
+urd||ur|Urdu|ourdou
+uzb||uz|Uzbek|ouszbek
+vai|||Vai|vaï
+ven||ve|Venda|venda
+vie||vi|Vietnamese|vietnamien
+vol||vo|Volapük|volapük
+vot|||Votic|vote
+wak|||Wakashan languages|wakashanes, langues
+wal|||Walamo|walamo
+war|||Waray|waray
+was|||Washo|washo
+wel|cym|cy|Welsh|gallois
+wen|||Sorbian languages|sorabes, langues
+wln||wa|Walloon|wallon
+wol||wo|Wolof|wolof
+xal|||Kalmyk; Oirat|kalmouk; oïrat
+xho||xh|Xhosa|xhosa
+yao|||Yao|yao
+yap|||Yapese|yapois
+yid||yi|Yiddish|yiddish
+yor||yo|Yoruba|yoruba
+ypk|||Yupik languages|yupik, langues
+zap|||Zapotec|zapotèque
+zbl|||Blissymbols; Blissymbolics; Bliss|symboles Bliss; Bliss
+zen|||Zenaga|zenaga
+zgh|||Standard Moroccan Tamazight|amazighe standard marocain
+zha||za|Zhuang; Chuang|zhuang; chuang
+znd|||Zande languages|zandé, langues
+zul||zu|Zulu|zoulou
+zun|||Zuni|zuni
+zxx|||No linguistic content; Not applicable|pas de contenu linguistique; non applicable
+zza|||Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki|zaza; dimili; dimli; kirdki; kirmanjki; zazaki \ No newline at end of file
diff --git a/data/Makefile.am b/data/Makefile.am
index 2a92ce1..b8f1c67 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -19,6 +19,7 @@ sugar-72-contrast.gtkrc: gtkrc-contrast.em
sugardir = $(pkgdatadir)/data
sugar_DATA = \
activities.defaults \
+ ISO-639-2_utf-8.txt \
kbdconfig \
mime.defaults \
GPLv2 \
diff --git a/extensions/cpsection/keyboard/model.py b/extensions/cpsection/keyboard/model.py
index bfd7e31..16f6a01 100644
--- a/extensions/cpsection/keyboard/model.py
+++ b/extensions/cpsection/keyboard/model.py
@@ -1,3 +1,4 @@
+# Copyright (C) 2013 Sugar Labs
# Copyright (C) 2009 OLPC
# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
#
@@ -16,9 +17,11 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-import xklavier
+from gi.repository import Xkl
from gi.repository import GConf
+from gi.repository import SugarExt
+import logging
_GROUP_NAME = 'grp' # The XKB name for group switch options
@@ -27,29 +30,35 @@ _OPTIONS_KEY = '/desktop/sugar/peripherals/keyboard/options'
_MODEL_KEY = '/desktop/sugar/peripherals/keyboard/model'
+def _item_str(s):
+ '''Convert a zero-terminated byte array to a proper str'''
+
+ i = s.find(b'\x00')
+ return s[:i].decode("utf-8")
+
+
class KeyboardManager(object):
def __init__(self, display):
- self._engine = xklavier.Engine(display)
- self._configregistry = xklavier.ConfigRegistry(self._engine)
+ self._engine = Xkl.Engine.get_instance(display)
+ self._configregistry = Xkl.ConfigRegistry.get_instance(self._engine)
self._configregistry.load(False)
- self._configrec = xklavier.ConfigRec()
+ self._configrec = Xkl.ConfigRec()
self._configrec.get_from_server(self._engine)
self._gconf_client = GConf.Client.get_default()
def _populate_one(self, config_registry, item, store):
- store.append([item.get_description(), item.get_name()])
+ store.append([_item_str(item.description), _item_str(item.name)])
def _populate_two(self, config_registry, item, subitem, store):
- layout = item.get_name()
+ layout = _item_str(item.name)
if subitem:
- description = '%s, %s' % (subitem.get_description(), \
- item.get_description())
- variant = subitem.get_name()
+ description = '%s, %s' % (_item_str(subitem.description),
+ _item_str(item.description))
+ variant = _item_str(subitem.name)
else:
- description = 'Default layout, %s' % item.get_description()
+ description = 'Default layout, %s' % _item_str(item.description)
variant = ''
-
store.append([description, ('%s(%s)' % (layout, variant))])
def get_models(self):
@@ -69,8 +78,9 @@ class KeyboardManager(object):
def get_layouts_for_language(self, language):
"""Return list of supported keyboard layouts for a given language"""
layouts = []
- self._configregistry.foreach_language_variant(language, \
- self._populate_two, layouts)
+ self._configregistry.foreach_language_variant(language,
+ self._populate_two,
+ layouts)
layouts.sort()
return layouts
@@ -85,18 +95,15 @@ class KeyboardManager(object):
def get_current_model(self):
"""Return the enabled keyboard model"""
model = self._gconf_client.get_string(_MODEL_KEY)
- if model:
- return model
- else:
- model = self._configrec.get_model()
+ if not model:
+ model = self._configrec.model
self.set_model(model)
- return model
+ return model
def get_current_layouts(self):
"""Return the enabled keyboard layouts with variants"""
# FIXME, gconf_client_get_list not introspectable #681433
- layouts_from_gconf = self._gconf_client.get(
- '/desktop/sugar/peripherals/keyboard/layouts')
+ layouts_from_gconf = self._gconf_client.get(_LAYOUTS_KEY)
layouts = []
if layouts_from_gconf:
for gval in layouts_from_gconf.get_list():
@@ -105,8 +112,8 @@ class KeyboardManager(object):
if layouts:
return layouts
- layouts = self._configrec.get_layouts()
- variants = self._configrec.get_variants()
+ layouts = self._configrec.layouts
+ variants = self._configrec.variants
layout_list = []
i = 0
@@ -118,22 +125,20 @@ class KeyboardManager(object):
i += 1
self.set_layouts(layout_list)
-
return layout_list
def get_current_option_group(self):
"""Return the enabled option for switching keyboard group"""
options = []
# FIXME, gconf_client_get_list not introspectable #681433
- options_from_gconf = gconf_client.get(\
- '/desktop/sugar/peripherals/keyboard/options')
+ options_from_gconf = self._gconf_client.get(_OPTIONS_KEY)
if options_from_gconf:
for gval in options_from_gconf.get_list():
option = gval.get_string()
options.append(option)
if not options:
- options = self._configrec.get_options()
+ options = self._configrec.options
self.set_option_group(options)
for option in options:
@@ -163,7 +168,11 @@ class KeyboardManager(object):
options = option_group
else:
options = [option_group]
- self._gconf_client.set_list(_OPTIONS_KEY, GConf.ValueType.STRING, options)
+ # FIXME, gconf_client_set_list not introspectable #681433
+ # self._gconf_client.set_list(_OPTIONS_KEY, GConf.ValueType.STRING,
+ # options)
+ SugarExt.gconf_client_set_string_list(self._gconf_client,
+ _OPTIONS_KEY, options)
self._configrec.set_options(options)
self._configrec.activate(self._engine)
@@ -171,13 +180,16 @@ class KeyboardManager(object):
"""Sets the supplied keyboard layouts (with variants)"""
if layouts is None or not layouts:
return
- self._gconf_client.set_list(_LAYOUTS_KEY, GConf.ValueType.STRING, layouts)
+ # FIXME, gconf_client_set_list not introspectable #681433
+ # self._gconf_client.set_list(_LAYOUTS_KEY, GConf.ValueType.STRING,
+ # layouts)
+ SugarExt.gconf_client_set_string_list(self._gconf_client,
+ _LAYOUTS_KEY, layouts)
layouts_list = []
variants_list = []
for layout in layouts:
layouts_list.append(layout.split('(')[0])
variants_list.append(layout.split('(')[1][:-1])
-
self._configrec.set_layouts(layouts_list)
self._configrec.set_variants(variants_list)
self._configrec.activate(self._engine)
diff --git a/extensions/cpsection/keyboard/view.py b/extensions/cpsection/keyboard/view.py
index 085ec10..46e508f 100644
--- a/extensions/cpsection/keyboard/view.py
+++ b/extensions/cpsection/keyboard/view.py
@@ -1,3 +1,4 @@
+# Copyright (C) 2013, Sugar Labs
# Copyright (C) 2009, OLPC
# Author: Sayamindu Dasgupta <sayamindu@laptop.org>
#
@@ -15,9 +16,14 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import os
+import locale
+
from gi.repository import Gtk
+from gi.repository import GdkX11
from gi.repository import GObject
from gi.repository import Pango
+
import logging
from gettext import gettext as _
@@ -25,7 +31,7 @@ from sugar3.graphics import style
from sugar3.graphics.icon import Icon
from jarabe.controlpanel.sectionview import SectionView
-
+from jarabe.config import data_path
CLASS = 'Language'
ICON = 'module-keyboard'
@@ -33,14 +39,35 @@ TITLE = _('Keyboard')
_APPLY_TIMEOUT = 500
+_iso_639_1_to_2 = {}
+
#TODO: This cpsection adds checks for xklavier in bin/sugar-session and
# src/jarabe/controlpanel/gui.py. We should get rid of these checks
# once python-xklavier has been packaged for all major distributions
# For more information, see: http://dev.sugarlabs.org/ticket/407
-class LayoutCombo(Gtk.HBox):
+def _build_ISO_639_dictionary():
+ """ The keyboard section of the control panel requires a conversion
+ between ISO 639 two-character codes and three-character code. This
+ method uses the table available at:
+ http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt
+ """
+
+ ISO_DATA_FILE = 'ISO-639-2_utf-8.txt'
+
+ path = os.path.join(data_path, ISO_DATA_FILE)
+ if os.path.exists(path):
+ f = open(path, 'r')
+ for line in f:
+ codes = line.split('|')
+ if codes[2] != '':
+ _iso_639_1_to_2[codes[2]] = codes[0]
+ else:
+ logging.error('%s not found' % (ISO_DATA_FILE))
+
+class LayoutCombo(Gtk.HBox):
"""
Custom GTK widget with two comboboxes side by side, one for layout, and
the other for variants for the selected layout.
@@ -62,12 +89,12 @@ class LayoutCombo(Gtk.HBox):
label = Gtk.Label(label=' <b>%s</b> ' % str(n + 1))
label.set_use_markup(True)
label.modify_fg(Gtk.StateType.NORMAL,
- style.COLOR_SELECTION_GREY.get_gdk_color())
+ style.COLOR_SELECTION_GREY.get_gdk_color())
label.set_alignment(0.5, 0.5)
self.pack_start(label, False, True, 0)
- self._klang_store = Gtk.ListStore(GObject.TYPE_STRING, \
- GObject.TYPE_STRING)
+ self._klang_store = Gtk.ListStore(GObject.TYPE_STRING,
+ GObject.TYPE_STRING)
for description, name in self._keyboard_manager.get_languages():
self._klang_store.append([name, description])
@@ -84,33 +111,52 @@ class LayoutCombo(Gtk.HBox):
self._kvariant_store = None
self._kvariant_combo = Gtk.ComboBox(model=None)
self._kvariant_combo_changed_id = \
- self._kvariant_combo.connect('changed', \
- self._kvariant_combo_changed_cb)
+ self._kvariant_combo.connect('changed',
+ self._kvariant_combo_changed_cb)
cell = Gtk.CellRendererText()
cell.props.ellipsize = Pango.EllipsizeMode.MIDDLE
cell.props.ellipsize_set = True
self._kvariant_combo.pack_start(cell, True)
self._kvariant_combo.add_attribute(cell, 'text', 1)
- self.pack_start(self._kvariant_combo, expand=True, fill=True, padding=0)
+ self.pack_start(self._kvariant_combo, expand=True, fill=True,
+ padding=0)
self._klang_combo.set_active(self._index)
def select_layout(self, layout):
"""Select a given keyboard layout and show appropriate variants"""
+
self._kvariant_combo.handler_block(self._kvariant_combo_changed_id)
- for i in range(0, len(self._klang_store)):
- self._klang_combo.set_active(i)
- for j in range(0, len(self._kvariant_store)):
- if self._kvariant_store[j][0] == layout:
- self._kvariant_combo.set_active(j)
- self._kvariant_combo.handler_unblock(\
- self._kvariant_combo_changed_id)
+
+ # Look for $LANG first
+ for lang in os.environ.get('LANG',
+ locale.getdefaultlocale()[0]).split(':'):
+ if lang[0:2] in _iso_639_1_to_2:
+ if self._look_for_lang_and_layout(_iso_639_1_to_2[lang[0:2]],
+ layout):
return True
+ # Then look for any language
+ if self._look_for_lang_and_layout(None, layout):
+ return True
+
+ # Finally, select a default
self._kvariant_combo.handler_unblock(self._kvariant_combo_changed_id)
self._klang_combo.set_active(0)
return False
+ def _look_for_lang_and_layout(self, lang, layout):
+ for i in range(0, len(self._klang_store)):
+ if lang == self._klang_store[i][0] or lang is None:
+ self._klang_combo.set_active(i)
+ for j in range(0, len(self._kvariant_store)):
+ if self._kvariant_store[j][0] == layout:
+ self._kvariant_combo.set_active(j)
+ self._kvariant_combo.handler_unblock(
+ self._kvariant_combo_changed_id)
+ return True
+ return False
+
def get_layout(self):
"""Gets the selected layout (with variant)"""
it = self._kvariant_combo.get_active_iter()
@@ -118,8 +164,8 @@ class LayoutCombo(Gtk.HBox):
return model.get(it, 0)[0]
def _set_kvariant_store(self, lang):
- self._kvariant_store = Gtk.ListStore(GObject.TYPE_STRING, \
- GObject.TYPE_STRING)
+ self._kvariant_store = Gtk.ListStore(GObject.TYPE_STRING,
+ GObject.TYPE_STRING)
layouts = self._keyboard_manager.get_layouts_for_language(lang)
for description, name in layouts:
self._kvariant_store.append([name, description])
@@ -159,7 +205,11 @@ class Keyboard(SectionView):
self._layout_table = Gtk.Table(rows=4, columns=2, homogeneous=False)
- self._keyboard_manager = model.KeyboardManager(self.get_display())
+ _build_ISO_639_dictionary()
+
+ self._keyboard_manager = model.KeyboardManager(
+ GdkX11.x11_get_default_xdisplay())
+
self._layout_combo_list = []
self._layout_addremovebox_list = []
@@ -196,8 +246,8 @@ class Keyboard(SectionView):
box_kmodel.set_border_width(style.DEFAULT_SPACING * 2)
box_kmodel.set_spacing(style.DEFAULT_SPACING)
- kmodel_store = Gtk.ListStore(GObject.TYPE_STRING, \
- GObject.TYPE_STRING)
+ kmodel_store = Gtk.ListStore(GObject.TYPE_STRING,
+ GObject.TYPE_STRING)
for description, name in self._keyboard_manager.get_models():
kmodel_store.append([name, description])
@@ -225,7 +275,8 @@ class Keyboard(SectionView):
if self.__kmodel_sid is not None:
GObject.source_remove(self.__kmodel_sid)
self.__kmodel_sid = GObject.timeout_add(_APPLY_TIMEOUT,
- self.__kmodel_timeout_cb, combobox)
+ self.__kmodel_timeout_cb,
+ combobox)
def __kmodel_timeout_cb(self, combobox):
it = combobox.get_active_iter()
@@ -256,8 +307,8 @@ class Keyboard(SectionView):
box_group_option.set_border_width(style.DEFAULT_SPACING * 2)
box_group_option.set_spacing(style.DEFAULT_SPACING)
- group_option_store = Gtk.ListStore(GObject.TYPE_STRING, \
- GObject.TYPE_STRING)
+ group_option_store = Gtk.ListStore(GObject.TYPE_STRING,
+ GObject.TYPE_STRING)
for description, name in self._keyboard_manager.get_options_group():
group_option_store.append([name, description])
@@ -269,7 +320,7 @@ class Keyboard(SectionView):
group_option_combo.add_attribute(cell, 'text', 1)
self._group_switch_option = \
- self._keyboard_manager.get_current_option_group()
+ self._keyboard_manager.get_current_option_group()
if not self._group_switch_option:
group_option_combo.set_active(0)
else:
@@ -286,14 +337,13 @@ class Keyboard(SectionView):
self._vbox.pack_start(box_group_option, False, True, 0)
box_group_option.show_all()
- group_option_combo.connect('changed', \
- self.__group_switch_changed_cb)
+ group_option_combo.connect('changed', self.__group_switch_changed_cb)
def __group_switch_changed_cb(self, combobox):
if self.__group_switch_sid is not None:
GObject.source_remove(self.__group_switch_sid)
- self.__group_switch_sid = GObject.timeout_add(_APPLY_TIMEOUT,
- self.__group_switch_timeout_cb, combobox)
+ self.__group_switch_sid = GObject.timeout_add(
+ _APPLY_TIMEOUT, self.__group_switch_timeout_cb, combobox)
def __group_switch_timeout_cb(self, combobox):
it = combobox.get_active_iter()
@@ -303,7 +353,7 @@ class Keyboard(SectionView):
self._keyboard_manager.get_current_option_group():
return
try:
- self._keyboard_manager.set_option_group(\
+ self._keyboard_manager.set_option_group(
self._selected_group_switch_option)
except Exception:
logging.exception('Could not set new keyboard group switch option')
@@ -328,8 +378,8 @@ class Keyboard(SectionView):
self._layout_table.attach(add_remove_box, 1, 2, i, i + 1)
layout_combo = LayoutCombo(self._keyboard_manager, i)
- layout_combo.connect('selection-changed', \
- self.__layout_combo_selection_changed_cb)
+ layout_combo.connect('selection-changed',
+ self.__layout_combo_selection_changed_cb)
self._layout_combo_list.append(layout_combo)
self._layout_table.attach(layout_combo, 0, 1, i, i + 1)
@@ -338,7 +388,8 @@ class Keyboard(SectionView):
layout_combo.select_layout(self._klayouts[i])
self._vbox.pack_start(self._layout_table, False, True, 0)
- self._layout_table.set_size_request(self._vbox.size_request()[0], -1)
+ self._layout_table.set_size_request(
+ self._vbox.get_size_request()[0], -1)
self._layout_table.show()
self._update_klayouts()
@@ -366,13 +417,13 @@ class Keyboard(SectionView):
add_button = Gtk.Button()
add_button.set_image(add_icon)
add_button.connect('clicked',
- self.__add_button_clicked_cb)
+ self.__add_button_clicked_cb)
remove_icon = Icon(icon_name='list-remove')
remove_button = Gtk.Button()
remove_button.set_image(remove_icon)
remove_button.connect('clicked',
- self.__remove_button_clicked_cb)
+ self.__remove_button_clicked_cb)
add_remove_box = Gtk.HButtonBox()
add_remove_box.set_layout(Gtk.ButtonBoxStyle.START)
@@ -405,7 +456,7 @@ class Keyboard(SectionView):
if self.__layout_sid is not None:
GObject.source_remove(self.__layout_sid)
self.__layout_sid = GObject.timeout_add(_APPLY_TIMEOUT,
- self.__layout_timeout_cb)
+ self.__layout_timeout_cb)
def __layout_timeout_cb(self):
if self._selected_klayouts == \