From 310fb5c67b278fe06851f82a1d1dbbc5546ec63f Mon Sep 17 00:00:00 2001 From: Stafford Mitchell Horne Date: Thu, 21 Sep 2006 10:58:42 +0000 Subject: [PATCH] Add language selection dialog, A bit of work still required but this is a good start. SVN revision: 25996 --- src/bin/Makefile.am | 2 + src/bin/e_configure.c | 2 + src/bin/e_includes.h | 1 + src/bin/e_int_config_intl.c | 1063 +++++++++++++++++++++++++++++++++++ src/bin/e_int_config_intl.h | 12 + src/bin/e_intl.c | 16 +- 6 files changed, 1089 insertions(+), 7 deletions(-) create mode 100644 src/bin/e_int_config_intl.c create mode 100644 src/bin/e_int_config_intl.h diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index b756589b2..c0ff8c8b5 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -99,6 +99,7 @@ e_widget_image.h \ e_config_dialog.h \ e_int_config_focus.h \ e_int_config_desks.h \ +e_int_config_intl.h \ e_configure.h \ e_int_border_locks.h \ e_thumb.h \ @@ -278,6 +279,7 @@ e_int_config_desklock.c \ e_int_config_exebuf.c \ e_int_config_apps.c \ e_int_config_cfgdialogs.c \ +e_int_config_intl.c \ e_deskpreview.c \ e_exebuf.c \ e_desklock.c \ diff --git a/src/bin/e_configure.c b/src/bin/e_configure.c index 53d400c26..4189179d3 100644 --- a/src/bin/e_configure.c +++ b/src/bin/e_configure.c @@ -88,6 +88,8 @@ e_configure_show(E_Container *con) e_configure_standard_item_add(eco, "enlightenment/applications", _("Applications"), e_int_config_apps); e_configure_standard_item_add(eco, "enlightenment/performance", _("Performance"), e_int_config_performance); e_configure_standard_item_add(eco, "enlightenment/configuration", _("Configuration Dialogs"), e_int_config_cfgdialogs); + e_configure_standard_item_add(eco, "enlightenment/intl", _("Internationalization"), e_int_config_intl); + e_configure_header_item_add(eco, "enlightenment/advanced", _("Advanced")); e_configure_standard_item_add(eco, "enlightenment/startup", _("Startup"), e_int_config_startup); diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 110da7dc6..9591349c1 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -105,6 +105,7 @@ #include "e_int_config_exebuf.h" #include "e_int_config_apps.h" #include "e_int_config_cfgdialogs.h" +#include "e_int_config_intl.h" #include "e_deskpreview.h" #include "e_exebuf.h" #include "e_desklock.h" diff --git a/src/bin/e_int_config_intl.c b/src/bin/e_int_config_intl.c new file mode 100644 index 000000000..1b7b43a80 --- /dev/null +++ b/src/bin/e_int_config_intl.c @@ -0,0 +1,1063 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "e.h" + +typedef struct _E_Intl_Pair E_Intl_Pair; +typedef struct _E_Intl_Langauge_Node E_Intl_Language_Node; +typedef struct _E_Intl_Region_Node E_Intl_Region_Node; + +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); + +static void _ilist_basic_language_cb_change(void *data, Evas_Object *obj); + +static void _ilist_language_cb_change(void *data, Evas_Object *obj); +static void _ilist_region_cb_change(void *data, Evas_Object *obj); +static void _ilist_codeset_cb_change(void *data, Evas_Object *obj); +static void _ilist_modifier_cb_change(void *data, Evas_Object *obj); + +/* Fill the clear lists, fill with language, select */ +/* Update lanague */ +static void _cfdata_language_go(const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata); +static Evas_Bool _lang_hash_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_Bool _region_hash_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); + +struct _E_Intl_Pair +{ + const char *locale_key; + const char *locale_translation; +}; + +/* We need to store a map of languages -> Countries -> Extra + * + * Extra: + * Each region has its own Encodings + * Each region has its own Modifiers + */ + +struct _E_Intl_Langauge_Node +{ + const char *lang_code; /* en */ + const char *lang_name; /* English (trans in ilist) */ + int lang_available; /* defined in e translation */ + Evas_Hash *region_hash; /* US->utf8 */ +}; + +struct _E_Intl_Region_Node +{ + const char *region_code; /* US */ + const char *region_name; /* United States */ + Evas_List *available_codesets; + Evas_List *available_modifiers; +}; + +struct _E_Config_Dialog_Data +{ + E_Config_Dialog *cfd; + Evas *evas; + + /* Current data */ + char *cur_language; + + char *cur_blang; + + char *cur_lang; + char *cur_reg; + char *cur_cs; + char *cur_mod; + + Evas_Hash *locale_hash; + + struct + { + Evas_Object *blang_list; + + Evas_Object *lang_list; + Evas_Object *reg_list; + Evas_Object *cs_list; + Evas_Object *mod_list; + + Evas_Object *locale_entry; + } + gui; +}; + +const E_Intl_Pair basic_language_predefined_pairs[ ] = { + {"en_US.UTF-8", N_("English")}, + {"ja_JP.UTF-8", N_("Japanese")}, + {"fr_FR.UTF-8", N_("French")}, + {"es_AR.UTF-8", N_("Spanish")}, + {"pt_BR.UTF-8", N_("Portuguese")}, + {"fi_FI.UTF-8", N_("Finnish")}, + {"ru_RU.UTF-8", N_("Russian")}, + {"bg_BG.UTF-8", N_("Bulgarian")}, + {"de_DE.UTF-8", N_("German")}, + {"pl_PL.UTF-8", N_("Polish")}, + {"zh_CN.UTF-8", N_("Simplified Chinese")}, + {"zh_TW.UTF-8", N_("Traditional Chinese")}, + {"hu_HU.UTF-8", N_("Hungarian")}, + {"sl_SI.UTF-8", N_("Slovenian")}, + {"it_IT.UTF-8", N_("Italian")}, + {"cs_CS.UTF-8", N_("Czech")}, + {"da_DK.UTF-8", N_("Danish")}, + {"sk_SK.UTF-8", N_("Slovak")}, + {"sv_SV.UTF-8", N_("Swedish")}, + {"nb_NO.UTF-8", N_("Norwegian Bokmål")}, + {"nl_NL.UTF-8", N_("Dutch")}, + {"ko_KR.UTF-8", N_("Korean")}, + { NULL, NULL } +}; + +const E_Intl_Pair language_predefined_pairs[ ] = { + {"aa", N_("Afar")}, + {"af", N_("Afrikaans")}, + {"ak", N_("Akan")}, + {"am", N_("Amharic")}, + {"an", N_("Aragonese")}, + {"ar", N_("Arabic")}, + {"as", N_("Assamese")}, + {"az", N_("Azerbaijani")}, + {"be", N_("Belarusian")}, + {"bg", N_("Bulgarian")}, + {"bn", N_("Bengali")}, + {"br", N_("Breton")}, + {"bs", N_("Bosnian")}, + {"byn", N_("Blin")}, + {"ca", N_("Catalan")}, + {"cch", N_("Atsam")}, + {"cs", N_("Czech")}, + {"cy", N_("Welsh")}, + {"da", N_("Danish")}, + {"de", N_("German")}, + {"dv", N_("Divehi")}, + {"dz", N_("Dzongkha")}, + {"ee", N_("Ewe")}, + {"el", N_("Greek")}, + {"en", N_("English")}, + {"eo", N_("Esperanto")}, + {"es", N_("Spanish")}, + {"et", N_("Estonian")}, + {"eu", N_("Basque")}, + {"fa", N_("Persian")}, + {"fi", N_("Finnish")}, + {"fo", N_("Faroese")}, + {"fr", N_("French")}, + {"fur", N_("Friulian")}, + {"ga", N_("Irish")}, + {"gaa", N_("Ga")}, + {"gez", N_("Geez")}, + {"gl", N_("Galician")}, + {"gu", N_("Gujarati")}, + {"gv", N_("Manx")}, + {"ha", N_("Hausa")}, + {"haw", N_("Hawaiian")}, + {"he", N_("Hebrew")}, + {"hi", N_("Hindi")}, + {"hr", N_("Croatian")}, + {"hu", N_("Hungarian")}, + {"hy", N_("Armenian")}, + {"ia", N_("Interlingua")}, + {"id", N_("Indonesian")}, + {"ig", N_("Igbo")}, + {"is", N_("Icelandic")}, + {"it", N_("Italian")}, + {"iu", N_("Inuktitut")}, + {"iw", N_("Hebrew")}, + {"ja", N_("Japanese")}, + {"ka", N_("Georgian")}, + {"kaj", N_("Jju")}, + {"kam", N_("Kamba")}, + {"kcg", N_("Tyap")}, + {"kfo", N_("Koro")}, + {"kk", N_("Kazakh")}, + {"kl", N_("Kalaallisut")}, + {"km", N_("Khmer")}, + {"kn", N_("Kannada")}, + {"ko", N_("Korean")}, + {"kok", N_("Konkani")}, + {"ku", N_("Kurdish")}, + {"kw", N_("Cornish")}, + {"ky", N_("Kirghiz")}, + {"ln", N_("Lingala")}, + {"lo", N_("Lao")}, + {"lt", N_("Lithuanian")}, + {"lv", N_("Latvian")}, + {"mi", N_("Maori")}, + {"mk", N_("Macedonian")}, + {"ml", N_("Malayalam")}, + {"mn", N_("Mongolian")}, + {"mr", N_("Marathi")}, + {"ms", N_("Malay")}, + {"mt", N_("Maltese")}, + {"nb", N_("Norwegian Bokmål")}, + {"ne", N_("Nepali")}, + {"nl", N_("Dutch")}, + {"nn", N_("Norwegian Nynorsk")}, + {"no", N_("Norwegian")}, + {"nr", N_("South Ndebele")}, + {"nso", N_("Northern Sotho")}, + {"ny", N_("Nyanja; Chichewa; Chewa")}, + {"oc", N_("Occitan")}, + {"om", N_("Oromo")}, + {"or", N_("Oriya")}, + {"pa", N_("Punjabi")}, + {"pl", N_("Polish")}, + {"ps", N_("Pashto")}, + {"pt", N_("Portuguese")}, + {"ro", N_("Romanian")}, + {"ru", N_("Russian")}, + {"rw", N_("Kinyarwanda")}, + {"sa", N_("Sanskrit")}, + {"se", N_("Northern Sami")}, + {"sh", N_("Serbo-Croatian")}, + {"sid", N_("Sidamo")}, + {"sk", N_("Slovak")}, + {"sl", N_("Slovenian")}, + {"so", N_("Somali")}, + {"sq", N_("Albanian")}, + {"sr", N_("Serbian")}, + {"ss", N_("Swati")}, + {"st", N_("Southern Sotho")}, + {"sv", N_("Swedish")}, + {"sw", N_("Swahili")}, + {"syr", N_("Syriac")}, + {"ta", N_("Tamil")}, + {"te", N_("Telugu")}, + {"tg", N_("Tajik")}, + {"th", N_("Thai")}, + {"ti", N_("Tigrinya")}, + {"tig", N_("Tigre")}, + {"tl", N_("Tagalog")}, + {"tn", N_("Tswana")}, + {"tr", N_("Turkish")}, + {"ts", N_("Tsonga")}, + {"tt", N_("Tatar")}, + {"uk", N_("Ukrainian")}, + {"ur", N_("Urdu")}, + {"uz", N_("Uzbek")}, + {"ve", N_("Venda")}, + {"vi", N_("Vietnamese")}, + {"wa", N_("Walloon")}, + {"wal", N_("Walamo")}, + {"xh", N_("Xhosa")}, + {"yi", N_("Yiddish")}, + {"yo", N_("Yoruba")}, + {"zh", N_("Chinese")}, + {"zu", N_("Zulu")}, + { NULL, NULL} +}; + +const E_Intl_Pair region_predefined_pairs[ ] = { + { "AF", N_("Afghanistan")}, + { "AX", N_("Åland Islands")}, + { "AL", N_("Albania")}, + { "DZ", N_("Algeria")}, + { "AS", N_("American Samoa")}, + { "AD", N_("Andorra")}, + { "AO", N_("Angola")}, + { "AI", N_("Anguilla")}, + { "AQ", N_("Antarctica")}, + { "AG", N_("Antigua and Barbuda")}, + { "AR", N_("Argentina")}, + { "AM", N_("Armenia")}, + { "AW", N_("Aruba")}, + { "AU", N_("Australia")}, + { "AT", N_("Austria")}, + { "AZ", N_("Azerbaijan")}, + { "BS", N_("Bahamas")}, + { "BH", N_("Bahrain")}, + { "BD", N_("Bangladesh")}, + { "BB", N_("Barbados")}, + { "BY", N_("Belarus")}, + { "BE", N_("Belgium")}, + { "BZ", N_("Belize")}, + { "BJ", N_("Benin")}, + { "BM", N_("Bermuda")}, + { "BT", N_("Bhutan")}, + { "BO", N_("Bolivia")}, + { "BA", N_("Bosnia and Herzegovina")}, + { "BW", N_("Botswana")}, + { "BV", N_("Bouvet Island")}, + { "BR", N_("Brazil")}, + { "IO", N_("British Indian Ocean Territory")}, + { "BN", N_("Brunei Darussalam")}, + { "BG", N_("Bulgaria")}, + { "BF", N_("Burkina Faso")}, + { "BI", N_("Burundi")}, + { "KH", N_("Cambodia")}, + { "CM", N_("Cameroon")}, + { "CA", N_("Canada")}, + { "CV", N_("Cape Verde")}, + { "KY", N_("Cayman Islands")}, + { "CF", N_("Central African Republic")}, + { "TD", N_("Chad")}, + { "CL", N_("Chile")}, + { "CN", N_("China")}, + { "CX", N_("Christmas Island")}, + { "CC", N_("Cocos (keeling) Islands")}, + { "CO", N_("Colombia")}, + { "KM", N_("Comoros")}, + { "CG", N_("Congo")}, + { "CD", N_("Congo")}, + { "CK", N_("Cook Islands")}, + { "CR", N_("Costa Rica")}, + { "CI", N_("Cote D'ivoire")}, + { "HR", N_("Croatia")}, + { "CU", N_("Cuba")}, + { "CY", N_("Cyprus")}, + { "CZ", N_("Czech Republic")}, + { "DK", N_("Denmark")}, + { "DJ", N_("Djibouti")}, + { "DM", N_("Dominica")}, + { "DO", N_("Dominican Republic")}, + { "EC", N_("Ecuador")}, + { "EG", N_("Egypt")}, + { "SV", N_("El Salvador")}, + { "GQ", N_("Equatorial Guinea")}, + { "ER", N_("Eritrea")}, + { "EE", N_("Estonia")}, + { "ET", N_("Ethiopia")}, + { "FK", N_("Falkland Islands (malvinas)")}, + { "FO", N_("Faroe Islands")}, + { "FJ", N_("Fiji")}, + { "FI", N_("Finland")}, + { "FR", N_("France")}, + { "GF", N_("French Guiana")}, + { "PF", N_("French Polynesia")}, + { "TF", N_("French Southern Territories")}, + { "GA", N_("Gabon")}, + { "GM", N_("Gambia")}, + { "GE", N_("Georgia")}, + { "DE", N_("Germany")}, + { "GH", N_("Ghana")}, + { "GI", N_("Gibraltar")}, + { "GR", N_("Greece")}, + { "GL", N_("Greenland")}, + { "GD", N_("Grenada")}, + { "GP", N_("Guadeloupe")}, + { "GU", N_("Guam")}, + { "GT", N_("Guatemala")}, + { " GG", N_("Guernsey")}, + { "GN", N_("Guinea")}, + { "GW", N_("Guinea-bissau")}, + { "GY", N_("Guyana")}, + { "HT", N_("Haiti")}, + { "HM", N_("Heard Island and Mcdonald Islands")}, + { "VA", N_("Holy See (vatican City State)")}, + { "HN", N_("Honduras")}, + { "HK", N_("Hong Kong")}, + { "HU", N_("Hungary")}, + { "IS", N_("Iceland")}, + { "IN", N_("India")}, + { "ID", N_("Indonesia")}, + { "IR", N_("Iran")}, + { "IQ", N_("Iraq")}, + { "IE", N_("Ireland")}, + { "IM", N_("Isle Of Man")}, + { "IL", N_("Israel")}, + { "IT", N_("Italy")}, + { "JM", N_("Jamaica")}, + { "JP", N_("Japan")}, + { "JE", N_("Jersey")}, + { "JO", N_("Jordan")}, + { "KZ", N_("Kazakhstan")}, + { "KE", N_("Kenya")}, + { "KI", N_("Kiribati")}, + { "KP", N_("Korea")}, + { "KR", N_("Korea")}, + { "KW", N_("Kuwait")}, + { "KG", N_("Kyrgyzstan")}, + { "LA", N_("Lao People's Democratic Republic")}, + { "LV", N_("Latvia")}, + { "LB", N_("Lebanon")}, + { "LS", N_("Lesotho")}, + { "LR", N_("Liberia")}, + { "LY", N_("Libyan Arab Jamahiriya")}, + { "LI", N_("Liechtenstein")}, + { "LT", N_("Lithuania")}, + { "LU", N_("Luxembourg")}, + { "MO", N_("Macao")}, + { "MK", N_("Macedonia")}, + { "MG", N_("Madagascar")}, + { "MW", N_("Malawi")}, + { "MY", N_("Malaysia")}, + { "MV", N_("Maldives")}, + { "ML", N_("Mali")}, + { "MT", N_("Malta")}, + { "MH", N_("Marshall Islands")}, + { "MQ", N_("Martinique")}, + { "MR", N_("Mauritania")}, + { "MU", N_("Mauritius")}, + { "YT", N_("Mayotte")}, + { "MX", N_("Mexico")}, + { "FM", N_("Micronesia")}, + { "MD", N_("Moldova")}, + { "MC", N_("Monaco")}, + { "MN", N_("Mongolia")}, + { "MS", N_("Montserrat")}, + { "MA", N_("Morocco")}, + { "MZ", N_("Mozambique")}, + { "MM", N_("Myanmar")}, + { "NA", N_("Namibia")}, + { "NR", N_("Nauru")}, + { "NP", N_("Nepal")}, + { "NL", N_("Netherlands")}, + { "AN", N_("Netherlands Antilles")}, + { "NC", N_("New Caledonia")}, + { "NZ", N_("New Zealand")}, + { "NI", N_("Nicaragua")}, + { "NE", N_("Niger")}, + { "NG", N_("Nigeria")}, + { "NU", N_("Niue")}, + { "NF", N_("Norfolk Island")}, + { "MP", N_("Northern Mariana Islands")}, + { "NO", N_("Norway")}, + { "OM", N_("Oman")}, + { "PK", N_("Pakistan")}, + { "PW", N_("Palau")}, + { "PS", N_("Palestinian Territory")}, + { "PA", N_("Panama")}, + { "PG", N_("Papua New Guinea")}, + { "PY", N_("Paraguay")}, + { "PE", N_("Peru")}, + { "PH", N_("Philippines")}, + { "PN", N_("Pitcairn")}, + { "PL", N_("Poland")}, + { "PT", N_("Portugal")}, + { "PR", N_("Puerto Rico")}, + { "QA", N_("Qatar")}, + { "RE", N_("Reunion")}, + { "RO", N_("Romania")}, + { "RU", N_("Russian Federation")}, + { "RW", N_("Rwanda")}, + { "SH", N_("Saint Helena")}, + { "KN", N_("Saint Kitts and Nevis")}, + { "LC", N_("Saint Lucia")}, + { "PM", N_("Saint Pierre and Miquelon")}, + { "VC", N_("Saint Vincent and the Grenadines")}, + { "WS", N_("Samoa")}, + { "SM", N_("San Marino")}, + { "ST", N_("Sao Tome and Principe")}, + { "SA", N_("Saudi Arabia")}, + { "SN", N_("Senegal")}, + { "CS", N_("Serbia and Montenegro")}, + { "SC", N_("Seychelles")}, + { "SL", N_("Sierra Leone")}, + { "SG", N_("Singapore")}, + { "SK", N_("Slovakia")}, + { "SI", N_("Slovenia")}, + { "SB", N_("Solomon Islands")}, + { "SO", N_("Somalia")}, + { "ZA", N_("South Africa")}, + { "GS", N_("South Georgia and the South Sandwich Islands")}, + { "ES", N_("Spain")}, + { "LK", N_("Sri Lanka")}, + { "SD", N_("Sudan")}, + { "SR", N_("Suriname")}, + { "SJ", N_("Svalbard and Jan Mayen")}, + { "SZ", N_("Swaziland")}, + { "SE", N_("Sweden")}, + { "CH", N_("Switzerland")}, + { "SY", N_("Syrian Arab Republic")}, + { "TW", N_("Taiwan")}, + { "TJ", N_("Tajikistan")}, + { "TZ", N_("Tanzania")}, + { "TH", N_("Thailand")}, + { "TL", N_("Timor-leste")}, + { "TG", N_("Togo")}, + { "TK", N_("Tokelau")}, + { "TO", N_("Tonga")}, + { "TT", N_("Trinidad and Tobago")}, + { "TN", N_("Tunisia")}, + { "TR", N_("Turkey")}, + { "TM", N_("Turkmenistan")}, + { "TC", N_("Turks and Caicos Islands")}, + { "TV", N_("Tuvalu")}, + { "UG", N_("Uganda")}, + { "UA", N_("Ukraine")}, + { "AE", N_("United Arab Emirates")}, + { "GB", N_("United Kingdom")}, + { "US", N_("United States")}, + { "UM", N_("United States Minor Outlying Islands")}, + { "UY", N_("Uruguay")}, + { "UZ", N_("Uzbekistan")}, + { "VU", N_("Vanuatu")}, + { "VE", N_("Venezuela")}, + { "VN", N_("Viet Nam")}, + { "VG", N_("Virgin Islands")}, + { "VI", N_("Virgin Islands")}, + { "WF", N_("Wallis and Futuna")}, + { "EH", N_("Western Sahara")}, + { "YE", N_("Yemen")}, + { "ZM", N_("Zambia")}, + { "ZW", N_("Zimbabwe")}, + { NULL, NULL} +}; + +EAPI E_Config_Dialog * +e_int_config_intl(E_Container *con) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + v = E_NEW(E_Config_Dialog_View, 1); + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->advanced.create_widgets = _advanced_create_widgets; + v->advanced.apply_cfdata = _advanced_apply_data; + v->basic.create_widgets = _basic_create_widgets; + v->basic.apply_cfdata = _basic_apply_data; + + cfd = e_config_dialog_new(con, + _("Language Configuration"), + "E", "_config_intl_dialog", + "enlightenment/intl", 0, v, NULL); + return cfd; +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + Evas_List *e_lang_list; + FILE *output; + + e_lang_list = e_intl_language_list(); + + /* Get list of all locales and start making map */ + output = popen("locale -a", "r"); + if ( output ) + { + char line[32]; + while ( fscanf(output, "%[^\n]\n", line) == 1) + { + char *language; + + language = e_intl_locale_canonic_get(line, E_INTL_LOC_LANG); + + if (language && (language[0] == 0)) + { + free(language); + language = NULL; + } + + if (language) + { + E_Intl_Language_Node *lang_node; + E_Intl_Region_Node *region_node; + char *region; + char *codeset; + char *modifier; + + region = e_intl_locale_canonic_get(line, E_INTL_LOC_REGION); + codeset = e_intl_locale_canonic_get(line, E_INTL_LOC_CODESET); + modifier = e_intl_locale_canonic_get(line, E_INTL_LOC_MODIFIER); + + lang_node = evas_hash_find(cfdata->locale_hash, language); + if (lang_node == NULL) + { + Evas_List *next; + int i; + + /* create new node */ + lang_node = E_NEW(E_Intl_Language_Node, 1); + + lang_node->lang_code = evas_stringshare_add(language); + + for (next = e_lang_list; next; next = next->next) + { + char *e_lang; + + e_lang = next->data; + if (!strncmp(e_lang, language, 2) || !strcmp("en", language)) + { + lang_node->lang_available = 1; + break; + } + } + + i = 0; + while (language_predefined_pairs[i].locale_key) + { + if (!strcmp(language_predefined_pairs[i].locale_key, language)) + lang_node->lang_name = _(language_predefined_pairs[i].locale_translation); + + i++; + } + cfdata->locale_hash = evas_hash_add(cfdata->locale_hash, language, lang_node); + } + + if (region && (region[0] == 0)) + { + free(region); + region = NULL; + } + + if (region) + { + region_node = evas_hash_find(lang_node->region_hash, region); + + if (region_node == NULL) + { + int i; + + /* create new node */ + region_node = E_NEW(E_Intl_Region_Node, 1); + region_node->region_code = evas_stringshare_add(region); + + i = 0; + while (region_predefined_pairs[i].locale_key) + { + if (!strcmp(region_predefined_pairs[i].locale_key, region)) + region_node->region_name = _(region_predefined_pairs[i].locale_translation); + i++; + } + lang_node->region_hash = evas_hash_add(lang_node->region_hash, region, region_node); + } + + if (codeset && (codeset[0] != 0)) + { + const char * cs; + + cs = evas_stringshare_add(codeset); + if (!evas_list_find(region_node->available_codesets, cs)) + region_node->available_codesets = evas_list_append(region_node->available_codesets, cs); + } + + if (modifier && (modifier[0] != 0)) + { + const char * mod; + + /* Find only works here because we are using stringshare*/ + mod = evas_stringshare_add(modifier); + if (!evas_list_find(region_node->available_modifiers, mod)) + region_node->available_modifiers = evas_list_append(region_node->available_modifiers, mod); + } + free(region); + } + + E_FREE(codeset); + E_FREE(modifier); + free(language); + } + } + + while (e_lang_list) + { + free(e_lang_list->data); + e_lang_list = evas_list_remove_list(e_lang_list, e_lang_list); + } + pclose(output); + } + + cfdata->cur_language = strdup(e_config->language); + + return; +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->cfd = cfd; + _fill_data(cfdata); + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + E_FREE(cfdata->cur_language); + + free(cfdata); +} + +static int +_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + if (cfdata->cur_language != NULL) + { + e_config->language = evas_stringshare_add(cfdata->cur_language); + e_intl_language_set(e_config->language); + } + + e_config_save_queue(); + + return 1; +} + +static int +_advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + if (cfdata->cur_language != NULL) + { + e_config->language = evas_stringshare_add(cfdata->cur_language); + e_intl_language_set(e_config->language); + } + + e_config_save_queue(); + + return 1; +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *of, *ob; + int i; + + cfdata->evas = evas; + + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_frametable_add(evas, _("Language Selector"), 1); + + /* Language List */ + ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_blang)); + e_widget_on_change_hook_set(ob, _ilist_basic_language_cb_change, cfdata); + cfdata->gui.blang_list = ob; + + i = 0; + while (basic_language_predefined_pairs[i].locale_key) + { + const char *key; + const char *trans; + + key = basic_language_predefined_pairs[i].locale_key; + trans = basic_language_predefined_pairs[i].locale_translation; + e_widget_ilist_append(cfdata->gui.blang_list, NULL, trans, NULL, NULL, key); + i++; + } + e_widget_ilist_go(ob); + e_widget_min_size_set(ob, 100, 100); + e_widget_frametable_object_append(of, ob, 0, 0, 2, 6, 1, 1, 1, 1); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + /* Locale selector */ + of = e_widget_frametable_add(evas, _("Locale Selected"), 0); + + ob = e_widget_label_add(evas, _("Locale")); + e_widget_frametable_object_append( of, + ob, + 0, 0, 1, 1, + 1, 1, 1, 1); + + cfdata->gui.locale_entry = e_widget_entry_add(evas, &(cfdata->cur_language)); + e_widget_disabled_set(cfdata->gui.locale_entry, 1); + e_widget_min_size_set(cfdata->gui.locale_entry, 100, 25); + e_widget_frametable_object_append(of, cfdata->gui.locale_entry, + 0, 1, 1, 1, + 1, 1, 1, 1); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; + +} + +static Evas_Object * +_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *of, *ob; + char *language; + char *region; + char *codeset; + char *modifier; + + cfdata->evas = evas; + + E_FREE(cfdata->cur_lang); + cfdata->cur_lang = NULL; + + E_FREE(cfdata->cur_reg); + cfdata->cur_reg = NULL; + + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_frametable_add(evas, _("Language Selector"), 1); + + /* Language List */ + ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_lang)); + e_widget_on_change_hook_set(ob, _ilist_language_cb_change, cfdata); + cfdata->gui.lang_list = ob; + + evas_hash_foreach(cfdata->locale_hash, _lang_hash_cb, cfdata); + + e_widget_ilist_go(ob); + e_widget_min_size_set(ob, 100, 100); + e_widget_frametable_object_append(of, ob, 0, 0, 1, 4, 1, 1, 1, 1); + + /* Region List */ + ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_reg)); + e_widget_on_change_hook_set(ob, _ilist_region_cb_change, cfdata); + cfdata->gui.reg_list = ob; + + e_widget_ilist_go(ob); + e_widget_min_size_set(ob, 100, 100); + e_widget_frametable_object_append(of, ob, 1, 0, 1, 4, 1, 1, 1, 1); + + /* Codeset List */ + ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_cs)); + e_widget_on_change_hook_set(ob, _ilist_codeset_cb_change, cfdata); + cfdata->gui.cs_list = ob; + + e_widget_ilist_go(ob); + e_widget_min_size_set(ob, 100, 100); + e_widget_frametable_object_append(of, ob, 2, 0, 1, 4, 1, 1, 1, 1); + + /* Modified List */ + ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_mod)); + e_widget_on_change_hook_set(ob, _ilist_modifier_cb_change, cfdata); + cfdata->gui.mod_list = ob; + + e_widget_ilist_go(ob); + e_widget_min_size_set(ob, 100, 100); + e_widget_frametable_object_append(of, ob, 3, 0, 1, 4, 1, 1, 1, 1); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + /* Locale selector */ + of = e_widget_frametable_add(evas, _("Locale Selected"), 0); + + ob = e_widget_label_add(evas, _("Locale")); + e_widget_frametable_object_append( of, + ob, + 0, 0, 1, 1, + 1, 1, 1, 1); + + cfdata->gui.locale_entry = e_widget_entry_add(evas, &(cfdata->cur_language)); + e_widget_disabled_set(cfdata->gui.locale_entry, 1); + e_widget_min_size_set(cfdata->gui.locale_entry, 100, 25); + e_widget_frametable_object_append(of, cfdata->gui.locale_entry, + 0, 1, 1, 1, + 1, 1, 1, 1); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + language = e_intl_locale_canonic_get(cfdata->cur_language, E_INTL_LOC_LANG); + region = e_intl_locale_canonic_get(cfdata->cur_language, E_INTL_LOC_REGION); + codeset = e_intl_locale_canonic_get(cfdata->cur_language, E_INTL_LOC_CODESET); + modifier = e_intl_locale_canonic_get(cfdata->cur_language, E_INTL_LOC_MODIFIER); + + _cfdata_language_go(language, region, codeset, modifier, cfdata); + + E_FREE(language); + E_FREE(region); + E_FREE(codeset); + E_FREE(modifier); + + return o; +} + +static void +_ilist_basic_language_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data * cfdata; + + cfdata = data; + + e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_blang); +} + +static void +_ilist_language_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data * cfdata; + + cfdata = data; + + _cfdata_language_go(cfdata->cur_lang, NULL, NULL, NULL, cfdata); + + e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_lang); + E_FREE(cfdata->cur_cs); + E_FREE(cfdata->cur_mod); +} + +static void +_ilist_region_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data * cfdata; + char locale[32]; + + cfdata = data; + + _cfdata_language_go(cfdata->cur_lang, cfdata->cur_reg, NULL, NULL, cfdata); + + sprintf(locale, "%s_%s", cfdata->cur_lang, cfdata->cur_reg); + e_widget_entry_text_set(cfdata->gui.locale_entry, locale); + E_FREE(cfdata->cur_cs); + E_FREE(cfdata->cur_mod); +} + +static void +_ilist_codeset_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data * cfdata; + char locale[32]; + + cfdata = data; + + if (cfdata->cur_mod) + { + sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod); + } + else + { + sprintf(locale, "%s_%s.%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs); + } + e_widget_entry_text_set(cfdata->gui.locale_entry, locale); +} + +static void +_ilist_modifier_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data * cfdata; + char locale[32]; + + cfdata = data; + if (cfdata->cur_cs) + { + sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod); + } + else + { + sprintf(locale, "%s_%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_mod); + } + e_widget_entry_text_set(cfdata->gui.locale_entry, locale); + +} + +static void +_cfdata_language_go(const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata) +{ + E_Intl_Language_Node *lang_node; + int lang_update; + int region_update; + + /* Check what changed */ + lang_update = 0; + region_update = 0; + + if (cfdata->cur_lang == NULL || (lang && !region)) + { + lang_update = 1; + region_update = 1; + e_widget_ilist_clear(cfdata->gui.cs_list); + e_widget_ilist_clear(cfdata->gui.mod_list); + } + if (lang && region) + { + region_update = 1; + e_widget_ilist_clear(cfdata->gui.cs_list); + e_widget_ilist_clear(cfdata->gui.mod_list); + } + + if (lang) + { + lang_node = evas_hash_find(cfdata->locale_hash, lang); + + if (lang_node) + { + if (lang_update) + { + e_widget_ilist_clear(cfdata->gui.reg_list); + evas_hash_foreach(lang_node->region_hash, _region_hash_cb, cfdata); + } + if (region && region_update) + { + E_Intl_Region_Node *reg_node; + + reg_node = evas_hash_find(lang_node->region_hash, region); + if (reg_node) + { + Evas_List *next; + + for (next = reg_node->available_codesets; next; next = next->next) + { + const char * cs; + + cs = next->data; + e_widget_ilist_append(cfdata->gui.cs_list, NULL, cs, NULL, NULL, cs); + } + for (next = reg_node->available_modifiers; next; next = next->next) + { + const char * mod; + + mod = next->data; + e_widget_ilist_append(cfdata->gui.mod_list, NULL, mod, NULL, NULL, mod); + } + + } + e_widget_ilist_go(cfdata->gui.cs_list); + e_widget_ilist_go(cfdata->gui.mod_list); + } + } + e_widget_ilist_go(cfdata->gui.reg_list); + } + +} + +static Evas_Bool +_lang_hash_cb(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + E_Config_Dialog_Data *cfdata; + E_Intl_Language_Node *lang_node; + const char *trans; + + cfdata = fdata; + lang_node = data; + + if (lang_node->lang_name) + { + trans = lang_node->lang_name; + } + else + { + trans = key; + } + + if (lang_node->lang_available) + { + Evas_Object *ic; + + ic = edje_object_add(cfdata->evas); + e_util_edje_icon_set(ic, "enlightenment/e"); + e_widget_ilist_append(cfdata->gui.lang_list, ic, trans, NULL, NULL, key); + } + else + { + e_widget_ilist_append(cfdata->gui.lang_list, NULL, trans, NULL, NULL, key); + } + return 1; +} + +static Evas_Bool +_region_hash_cb(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + E_Config_Dialog_Data *cfdata; + E_Intl_Region_Node *reg_node; + const char *trans; + + cfdata = fdata; + reg_node = data; + + if (reg_node->region_name) + { + trans = reg_node->region_name; + } + else + { + trans = key; + } + + e_widget_ilist_append(cfdata->gui.reg_list, NULL, trans, NULL, NULL, key); + return 1; +} diff --git a/src/bin/e_int_config_intl.h b/src/bin/e_int_config_intl.h new file mode 100644 index 000000000..536cf7beb --- /dev/null +++ b/src/bin/e_int_config_intl.h @@ -0,0 +1,12 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#ifdef E_TYPEDEFS +#else +#ifndef E_INT_CONFIG_INTL_H +#define E_INT_CONFIG_INTL_H + +EAPI E_Config_Dialog *e_int_config_intl(E_Container *con); + +#endif +#endif diff --git a/src/bin/e_intl.c b/src/bin/e_intl.c index 8d05e5a14..52b15a0e5 100644 --- a/src/bin/e_intl.c +++ b/src/bin/e_intl.c @@ -810,7 +810,7 @@ e_intl_locale_canonic_get(const char *locale, int ret_mask) case 3: modifier[tmp_idx] = 0; } - + /* Construct the clean locale string */ /* determine the size */ @@ -830,25 +830,27 @@ e_intl_locale_canonic_get(const char *locale, int ret_mask) clean_locale[0] = 0; /* Put the parts of the string together */ - strcat(clean_locale, language); - loc_mask |= E_LOC_LANG; - + if ((ret_mask & E_LOC_LANG) && language[0] != 0) + { + loc_mask |= E_LOC_LANG; + strcat(clean_locale, language); + } if ((ret_mask & E_LOC_REGION) && territory[0] != 0) { loc_mask |= E_LOC_REGION; - strcat(clean_locale, "_"); + if (clean_locale[0] != 0) strcat(clean_locale, "_"); strcat(clean_locale, territory); } if ((ret_mask & E_LOC_CODESET) && codeset[0] != 0) { loc_mask |= E_LOC_CODESET; - strcat(clean_locale, "."); + if (clean_locale[0] != 0) strcat(clean_locale, "."); strcat(clean_locale, codeset); } if ((ret_mask & E_LOC_MODIFIER) && (modifier[0] != 0)) { loc_mask |= E_LOC_MODIFIER; - strcat(clean_locale, "@"); + if (clean_locale[0] != 0) strcat(clean_locale, "@"); strcat(clean_locale, modifier); }