3 typedef struct _E_Intl_Pair E_Intl_Pair;
4 typedef struct _E_Intl_Langauge_Node E_Intl_Language_Node;
5 typedef struct _E_Intl_Region_Node E_Intl_Region_Node;
7 static void *_create_data (E_Config_Dialog *cfd);
8 static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
9 static int _advanced_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
10 static Evas_Object *_advanced_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
11 static int _basic_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
12 static Evas_Object *_basic_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
14 static void _ilist_basic_language_cb_change (void *data, Evas_Object *obj);
15 static void _ilist_language_cb_change (void *data, Evas_Object *obj);
16 static void _ilist_region_cb_change (void *data, Evas_Object *obj);
17 static void _ilist_codeset_cb_change (void *data, Evas_Object *obj);
18 static void _ilist_modifier_cb_change (void *data, Evas_Object *obj);
19 static int _lang_list_sort (const void *data1, const void *data2);
20 static void _lang_list_load (void *data);
21 static int _region_list_sort (const void *data1, const void *data2);
22 static void _region_list_load (void *data);
23 static int _basic_lang_list_sort (const void *data1, const void *data2);
25 /* Fill the clear lists, fill with language, select */
27 static void _cfdata_language_go (const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata);
28 static Eina_Bool _lang_hash_cb (const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata);
29 static Eina_Bool _region_hash_cb (const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata);
30 static Eina_Bool _language_hash_free_cb (const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__);
31 static Eina_Bool _region_hash_free_cb (const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__);
32 static void _intl_current_locale_setup (E_Config_Dialog_Data *cfdata);
33 static const char *_intl_charset_upper_get (const char *charset);
37 const char *locale_key;
38 const char *locale_translation;
41 /* We need to store a map of languages -> Countries -> Extra
44 * Each region has its own Encodings
45 * Each region has its own Modifiers
48 struct _E_Intl_Langauge_Node
50 const char *lang_code; /* en */
51 const char *lang_name; /* English (trans in ilist) */
52 int lang_available; /* defined in e translation */
53 Eina_Hash *region_hash; /* US->utf8 */
56 struct _E_Intl_Region_Node
58 const char *region_code; /* US */
59 const char *region_name; /* United States */
60 Eina_List *available_codesets;
61 Eina_List *available_modifiers;
64 struct _E_Config_Dialog_Data
72 const char *cur_blang;
81 Eina_Hash *locale_hash;
83 Eina_List *region_list;
84 Eina_List *blang_list;
88 Evas_Object *blang_list;
90 Evas_Object *lang_list;
91 Evas_Object *reg_list;
93 Evas_Object *mod_list;
95 Evas_Object *locale_entry;
100 const E_Intl_Pair basic_language_predefined_pairs[ ] = {
101 {"bg_BG.UTF-8", "Български"},
102 {"ca_ES.UTF-8", "Català"},
103 {"zh_CN.UTF-8", "Chinese (Simplified)"},
104 {"zh_TW.UTF-8", "Chinese (Traditional)"},
105 {"cs_CZ.UTF-8", "Čeština"},
106 {"da_DK.UTF-8", "Dansk"},
107 {"nl_NL.UTF-8", "Nederlands"},
108 {"en_US.UTF-8", "English"},
109 {"en_GB.UTF-8", "British English"},
110 {"fi_FI.UTF-8", "Suomi"},
111 {"fr_FR.UTF-8", "Français"},
112 {"de_DE.UTF-8", "Deutsch"},
113 {"hu_HU.UTF-8", "Magyar"},
114 {"it_IT.UTF-8", "Italiano"},
115 {"ja_JP.UTF-8", "日本語"},
116 {"ko_KR.UTF-8", "한국어"},
117 {"nb_NO.UTF-8", "Norsk Bokmål"},
118 {"pl_PL.UTF-8", "Polski"},
119 {"pt_BR.UTF-8", "Português"},
120 {"ru_RU.UTF-8", "Русский"},
121 {"sk_SK.UTF-8", "Slovenčina"},
122 {"sl_SI.UTF-8", "Slovenščina"},
123 {"es_AR.UTF-8", "Español"},
124 {"sv_SE.UTF-8", "Svenska"},
125 {"el_GR.UTF-8", "Ελληνικά"},
129 const E_Intl_Pair language_predefined_pairs[ ] = {
137 {"az", "Azərbaycan dili"},
138 {"be", "Беларуская мова"},
157 {"et", "Eesti keel"},
171 {"haw", "ʻŌlelo Hawaiʻi"},
177 {"ia", "Interlingua"},
178 {"id", "Indonesian"},
191 {"kl", "Kalaallisut"},
198 {"ky", "Кыргыз тили"},
201 {"lt", "Lietuvių kalba"},
203 {"mi", "Te Reo Māori"},
204 {"mk", "Македонски"},
208 {"ms", "Bahasa Melayu"},
210 {"nb", "Norsk Bokmål"},
212 {"nl", "Nederlands"},
213 {"nn", "Norsk Nynorsk"},
215 {"nr", "isiNdebele"},
216 {"nso", "Sesotho sa Leboa"},
227 {"rw", "Kinyarwanda"},
229 {"se", "Davvisápmi"},
230 {"sh", "Srpskohrvatski/Српскохрватски"},
231 {"sid", "Sidámo 'Afó"},
232 {"sk", "Slovenčina"},
233 {"sl", "Slovenščina"},
234 {"so", "af Soomaali"},
238 {"st", "Southern Sotho"},
253 {"uk", "Українська мова"},
257 {"vi", "Tiếng Việt"},
262 {"yo", "èdèe Yorùbá"},
268 const E_Intl_Pair region_predefined_pairs[ ] = {
269 { "AF", "Afghanistan"},
271 { "AL", "Shqipëria"},
273 { "AS", "Amerika Sāmoa"},
277 { "AQ", "Antarctica"},
278 { "AG", "Antigua and Barbuda"},
279 { "AR", "Argentina"},
282 { "AU", "Australia"},
283 { "AT", "Österreich"},
284 { "AZ", "Azərbaycan"},
296 { "BA", "Bosnia and Herzegovina"},
298 { "BV", "Bouvetøya"},
300 { "IO", "British Indian Ocean Territory"},
301 { "BN", "Brunei Darussalam"},
303 { "BF", "Burkina Faso"},
308 { "CV", "Cape Verde"},
309 { "KY", "Cayman Islands"},
310 { "CF", "Central African Republic"},
314 { "CX", "Christmas Island"},
315 { "CC", "Cocos (keeling) Islands"},
320 { "CK", "Cook Islands"},
321 { "CR", "Costa Rica"},
322 { "CI", "Cote d'Ivoire"},
326 { "CZ", "Česká republika"},
330 { "DO", "República Dominicana"},
333 { "SV", "El Salvador"},
334 { "GQ", "Equatorial Guinea"},
338 { "FK", "Falkland Islands (malvinas)"},
339 { "FO", "Faroe Islands"},
343 { "GF", "French Guiana"},
344 { "PF", "French Polynesia"},
345 { "TF", "French Southern Territories"},
349 { "DE", "Deutschland"},
351 { "GI", "Gibraltar"},
353 { "GL", "Greenland"},
355 { "GP", "Guadeloupe"},
357 { "GT", "Guatemala"},
360 { "GW", "Guinea-Bissau"},
363 { "HM", "Heard Island and Mcdonald Islands"},
364 { "VA", "Holy See (Vatican City State)"},
366 { "HK", "Hong Kong"},
367 { "HU", "Magyarország"},
370 { "ID", "Indonesia"},
374 { "IM", "Isle Of Man"},
381 { "KZ", "Kazakhstan"},
387 { "KG", "Kyrgyzstan"},
388 { "LA", "Lao People's Democratic Republic"},
393 { "LY", "Libyan Arab Jamahiriya"},
394 { "LI", "Liechtenstein"},
396 { "LU", "Lëtzebuerg"},
398 { "MK", "Македонија"},
399 { "MG", "Madagascar"},
405 { "MH", "Marshall Islands"},
406 { "MQ", "Martinique"},
407 { "MR", "Mauritania"},
408 { "MU", "Mauritius"},
411 { "FM", "Micronesia"},
415 { "MS", "Montserrat"},
417 { "MZ", "Mozambique"},
422 { "NL", "Nederland"},
423 { "AN", "Netherlands Antilles"},
424 { "NC", "New Caledonia"},
425 { "NZ", "New Zealand"},
426 { "NI", "Nicaragua"},
430 { "NF", "Norfolk Island"},
431 { "MP", "Northern Mariana Islands"},
436 { "PS", "Palestinian Territory"},
438 { "PG", "Papua New Guinea"},
441 { "PH", "Philippines"},
445 { "PR", "Puerto Rico"},
449 { "RU", "Russian Federation"},
451 { "SH", "Saint Helena"},
452 { "KN", "Saint Kitts and Nevis"},
453 { "LC", "Saint Lucia"},
454 { "PM", "Saint Pierre and Miquelon"},
455 { "VC", "Saint Vincent and the Grenadines"},
457 { "SM", "San Marino"},
458 { "ST", "Sao Tome and Principe"},
459 { "SA", "Saudi Arabia"},
461 { "CS", "Serbia and Montenegro"},
462 { "SC", "Seychelles"},
463 { "SL", "Sierra Leone"},
464 { "SG", "Singapore"},
467 { "SB", "Solomon Islands"},
469 { "ZA", "South Africa"},
470 { "GS", "South Georgia and the South Sandwich Islands"},
472 { "LK", "Sri Lanka"},
475 { "SJ", "Svalbard and Jan Mayen"},
476 { "SZ", "Swaziland"},
478 { "CH", "Switzerland"},
479 { "SY", "Syrian Arab Republic"},
481 { "TJ", "Tajikistan"},
484 { "TL", "Timor-Leste"},
488 { "TT", "Trinidad and Tobago"},
491 { "TM", "Turkmenistan"},
492 { "TC", "Turks and Caicos Islands"},
496 { "AE", "United Arab Emirates"},
497 { "GB", "United Kingdom"},
498 { "US", "United States"},
499 { "UM", "United States Minor Outlying Islands"},
501 { "UZ", "Uzbekistan"},
503 { "VE", "Venezuela"},
505 { "VG", "Virgin Islands"},
506 { "VI", "Virgin Islands"},
507 { "WF", "Wallis and Futuna"},
508 { "EH", "Western Sahara"},
518 $ locale -a | grep -v @ | grep "\." | cut -d . -f 2 | sort -u
520 * On some machines is complains if codesets don't look like this
521 * On linux its not really a problem but BSD has issues. So we neet to
522 * make sure that locale -a output gets converted to upper-case form in
523 * all situations just to be safe.
525 const E_Intl_Pair charset_predefined_pairs[ ] = {
526 /* These are in locale -a but not in charsets */
527 {"cp1255", "CP1255"},
529 {"georgianps", "GEORGIAN-PS"},
530 {"iso885914", "ISO-8859-14"},
535 /* These are from charsets man page */
537 {"big5hkscs", "BIG5-HKSCS"},
538 {"cp1251", "CP1251"},
542 {"gb18030", "GB18030"},
543 {"gb2312", "GB2312"},
545 {"iso88591", "ISO-8859-1"},
546 {"iso885913", "ISO-8859-13"},
547 {"iso885915", "ISO-8859-15"},
548 {"iso88592", "ISO-8859-2"},
549 {"iso88593", "ISO-8859-3"},
550 {"iso88595", "ISO-8859-5"},
551 {"iso88596", "ISO-8859-6"},
552 {"iso88597", "ISO-8859-7"},
553 {"iso88598", "ISO-8859-8"},
554 {"iso88599", "ISO-8859-9"},
557 {"tis620", "TIS-620"},
563 e_int_config_intl(E_Container *con, const char *params __UNUSED__)
565 E_Config_Dialog *cfd;
566 E_Config_Dialog_View *v;
568 if (e_config_dialog_find("E", "language/language_settings")) return NULL;
569 v = E_NEW(E_Config_Dialog_View, 1);
571 v->create_cfdata = _create_data;
572 v->free_cfdata = _free_data;
573 v->advanced.create_widgets = _advanced_create_widgets;
574 v->advanced.apply_cfdata = _advanced_apply_data;
575 v->basic.create_widgets = _basic_create_widgets;
576 v->basic.apply_cfdata = _basic_apply_data;
578 cfd = e_config_dialog_new(con,
579 _("Language Settings"),
580 "E", "language/language_settings",
581 "preferences-desktop-locale", 0, v, NULL);
585 /* Build hash tables used for locale navigation. The locale information is
586 * gathered using the locale -a command.
588 * Below the following terms are used:
589 * ll - Locale Language Code (Example en)
590 * RR - Locale Region code (Example US)
591 * enc - Locale Encoding (Example UTF-8)
592 * mod - Locale Modifier (Example EURO)
595 _fill_data(E_Config_Dialog_Data *cfdata)
597 Eina_List *e_lang_list;
600 e_lang_list = e_intl_language_list();
602 /* Get list of all locales and start making map */
603 output = popen("locale -a", "r");
607 while (fscanf(output, "%[^\n]\n", line) == 1)
609 E_Locale_Parts *locale_parts;
611 locale_parts = e_intl_locale_parts_get(line);
615 char *basic_language;
617 basic_language = e_intl_locale_parts_combine(locale_parts, E_INTL_LOC_LANG | E_INTL_LOC_REGION);
623 while (basic_language_predefined_pairs[i].locale_key)
625 /* if basic language is supported by E and System*/
626 if (!strncmp(basic_language_predefined_pairs[i].locale_key,
627 basic_language, strlen(basic_language)))
629 if (!eina_list_data_find(cfdata->blang_list, &basic_language_predefined_pairs[i]))
630 cfdata->blang_list = eina_list_append(cfdata->blang_list, &basic_language_predefined_pairs[i]);
636 E_FREE(basic_language);
638 /* If the language is a valid ll_RR[.enc[@mod]] locale add it to the hash */
639 if (locale_parts->lang)
641 E_Intl_Language_Node *lang_node;
642 E_Intl_Region_Node *region_node;
644 /* Add the language to the new locale properties to the hash */
645 /* First check if the LANGUAGE exists in there already */
647 lang_node = eina_hash_find(cfdata->locale_hash, locale_parts->lang);
653 /* create new node */
654 lang_node = E_NEW(E_Intl_Language_Node, 1);
656 lang_node->lang_code = eina_stringshare_add(locale_parts->lang);
658 /* Check if the language list exists */
660 for (next = e_lang_list; next; next = next->next)
665 if (!strncmp(e_lang, locale_parts->lang, 2) || !strcmp("en", locale_parts->lang))
667 lang_node->lang_available = 1;
672 /* Search for translation */
675 while (language_predefined_pairs[i].locale_key)
677 if (!strcmp(language_predefined_pairs[i].locale_key, locale_parts->lang))
679 lang_node->lang_name = _(language_predefined_pairs[i].locale_translation);
685 if (!cfdata->locale_hash)
686 cfdata->locale_hash = eina_hash_string_superfast_new(NULL);
687 eina_hash_add(cfdata->locale_hash, locale_parts->lang, lang_node);
690 /* We now have the current language hash node, lets see if there is
691 region data that needs to be added.
694 if (locale_parts->region)
696 region_node = eina_hash_find(lang_node->region_hash, locale_parts->region);
702 /* create new node */
703 region_node = E_NEW(E_Intl_Region_Node, 1);
704 region_node->region_code = eina_stringshare_add(locale_parts->region);
706 /* Get the region translation */
709 while (region_predefined_pairs[i].locale_key)
711 if (!strcmp(region_predefined_pairs[i].locale_key, locale_parts->region))
713 region_node->region_name = _(region_predefined_pairs[i].locale_translation);
718 if (!lang_node->region_hash)
719 lang_node->region_hash = eina_hash_string_superfast_new(NULL);
720 eina_hash_add(lang_node->region_hash, locale_parts->region, region_node);
723 /* We now have the current region hash node */
724 /* Add codeset to the region hash node if it exists */
725 if (locale_parts->codeset)
728 const char * cs_trans;
730 cs_trans = _intl_charset_upper_get(locale_parts->codeset);
732 cs = eina_stringshare_add(locale_parts->codeset);
734 cs = eina_stringshare_add(cs_trans);
738 if (!eina_list_data_find(region_node->available_codesets, cs))
739 region_node->available_codesets = eina_list_append(region_node->available_codesets, cs);
742 /* Add modifier to the region hash node if it exists */
743 if (locale_parts->modifier)
747 mod = eina_stringshare_add(locale_parts->modifier);
748 /* Find only works here because we are using stringshare*/
752 if (!eina_list_data_find(region_node->available_modifiers, mod))
753 region_node->available_modifiers = eina_list_append(region_node->available_modifiers, mod);
757 e_intl_locale_parts_free(locale_parts);
761 /* Sort basic languages */
762 cfdata->blang_list = eina_list_sort(cfdata->blang_list,
763 eina_list_count(cfdata->blang_list),
764 _basic_lang_list_sort);
768 free(e_lang_list->data);
769 e_lang_list = eina_list_remove_list(e_lang_list, e_lang_list);
774 /* Make sure we know the currently configured locale */
775 if (e_config->language)
776 cfdata->cur_language = strdup(e_config->language);
782 _create_data(E_Config_Dialog *cfd)
784 E_Config_Dialog_Data *cfdata;
786 cfdata = E_NEW(E_Config_Dialog_Data, 1);
793 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
795 E_FREE(cfdata->cur_language);
797 eina_stringshare_del(cfdata->cur_blang);
798 eina_stringshare_del(cfdata->cur_lang);
799 eina_stringshare_del(cfdata->cur_reg);
800 eina_stringshare_del(cfdata->cur_cs);
801 eina_stringshare_del(cfdata->cur_mod);
803 eina_hash_foreach(cfdata->locale_hash, _language_hash_free_cb, NULL);
804 eina_hash_free(cfdata->locale_hash);
806 cfdata->lang_list = eina_list_free(cfdata->lang_list);
807 cfdata->region_list = eina_list_free(cfdata->region_list);
808 cfdata->blang_list = eina_list_free(cfdata->blang_list);
814 _language_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
816 E_Intl_Language_Node *node;
819 if (node->lang_code) eina_stringshare_del(node->lang_code);
820 eina_hash_foreach(node->region_hash, _region_hash_free_cb, NULL);
821 eina_hash_free(node->region_hash);
828 _region_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
830 E_Intl_Region_Node *node;
833 if (node->region_code) eina_stringshare_del(node->region_code);
834 while (node->available_codesets)
838 str = node->available_codesets->data;
839 if (str) eina_stringshare_del(str);
840 node->available_codesets =
841 eina_list_remove_list(node->available_codesets, node->available_codesets);
844 while (node->available_modifiers)
848 str = node->available_modifiers->data;
849 if (str) eina_stringshare_del(str);
850 node->available_modifiers =
851 eina_list_remove_list(node->available_modifiers, node->available_modifiers);
859 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
861 if (cfdata->cur_language)
863 if (e_config->language) eina_stringshare_del(e_config->language);
864 e_config->language = NULL;
865 if ((cfdata->cur_language) && (cfdata->cur_language[0]))
866 e_config->language = eina_stringshare_add(cfdata->cur_language);
867 e_intl_language_set(e_config->language);
870 e_config_save_queue();
875 _advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
877 if (cfdata->cur_language)
879 if (e_config->language) eina_stringshare_del(e_config->language);
880 e_config->language = NULL;
881 if ((cfdata->cur_language) && (cfdata->cur_language[0]))
882 e_config->language = eina_stringshare_add(cfdata->cur_language);
883 e_intl_language_set(e_config->language);
886 e_config_save_queue();
891 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
893 Evas_Object *o, *of, *ob;
899 o = e_widget_table_add(evas, 0);
900 of = e_widget_framelist_add(evas, _("Language Selector"), 0);
901 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_blang));
902 e_widget_size_min_set(ob, 100, 80);
903 e_widget_on_change_hook_set(ob, _ilist_basic_language_cb_change, cfdata);
904 cfdata->gui.blang_list = ob;
905 e_widget_framelist_object_append(of, ob);
906 e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
909 evas_event_freeze(evas_object_evas_get(ob));
911 e_widget_ilist_freeze(ob);
912 if (cfdata->cur_language)
914 E_Locale_Parts *locale_parts;
915 locale_parts = e_intl_locale_parts_get(cfdata->cur_language);
918 cur_sig_loc = e_intl_locale_parts_combine(locale_parts,
919 E_INTL_LOC_LANG | E_INTL_LOC_REGION);
921 e_intl_locale_parts_free(locale_parts);
929 e_widget_ilist_append(cfdata->gui.blang_list, NULL, _("System Default"), NULL, NULL, "");
930 if ((!cur_sig_loc) || (!cfdata->cur_language))
931 e_widget_ilist_selected_set(cfdata->gui.blang_list, i);
934 for (next = cfdata->blang_list; next; next = next->next)
941 key = pair->locale_key;
942 trans = _(pair->locale_translation);
943 e_widget_ilist_append(cfdata->gui.blang_list, NULL, trans, NULL, NULL, key);
945 (!strncmp(key, cur_sig_loc, strlen(cur_sig_loc))))
946 e_widget_ilist_selected_set(cfdata->gui.blang_list, i);
951 e_widget_ilist_go(ob);
952 e_widget_ilist_thaw(ob);
954 evas_event_thaw(evas_object_evas_get(ob));
956 of = e_widget_frametable_add(evas, _("Locale Selected"), 0);
957 ob = e_widget_label_add(evas, _("Locale"));
958 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
959 ob = e_widget_entry_add(evas, &(cfdata->cur_language), NULL, NULL, NULL);
960 cfdata->gui.locale_entry = ob;
961 e_widget_disabled_set(cfdata->gui.locale_entry, 1);
962 e_widget_size_min_set(cfdata->gui.locale_entry, 100, 25);
963 e_widget_frametable_object_append(of, cfdata->gui.locale_entry,
964 1, 0, 1, 1, 1, 1, 1, 0);
965 e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 0, 1, 0);
967 e_dialog_resizable_set(cfd->dia, 1);
972 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
974 Evas_Object *o, *of, *ob;
975 const char *lang, *reg, *cs, *mod;
979 _intl_current_locale_setup(cfdata);
981 o = e_widget_table_add(evas, 0);
983 of = e_widget_framelist_add(evas, _("Language Selector"), 1);
986 ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_lang));
987 cfdata->gui.lang_list = ob;
989 /* If lang_list already loaded just use it */
990 if (!cfdata->lang_list)
991 eina_hash_foreach(cfdata->locale_hash, _lang_hash_cb, cfdata);
993 if (cfdata->lang_list)
996 eina_list_sort(cfdata->lang_list, eina_list_count(cfdata->lang_list),
998 _lang_list_load(cfdata);
1001 e_widget_ilist_go(ob);
1002 e_widget_size_min_set(ob, 140, 200);
1003 e_widget_framelist_object_append(of, ob);
1004 e_widget_ilist_selected_set(ob, e_widget_ilist_selected_get(ob));
1007 ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_reg));
1008 cfdata->gui.reg_list = ob;
1010 e_widget_ilist_go(ob);
1011 e_widget_size_min_set(ob, 100, 100);
1012 e_widget_framelist_object_append(of, ob);
1013 e_widget_ilist_selected_set(ob, e_widget_ilist_selected_get(ob));
1016 ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_cs));
1017 cfdata->gui.cs_list = ob;
1019 e_widget_ilist_go(ob);
1020 e_widget_size_min_set(ob, 100, 100);
1021 e_widget_framelist_object_append(of, ob);
1024 ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_mod));
1025 cfdata->gui.mod_list = ob;
1027 e_widget_ilist_go(ob);
1028 e_widget_size_min_set(ob, 100, 100);
1029 e_widget_framelist_object_append(of, ob);
1031 e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
1033 /* Locale selector */
1034 of = e_widget_frametable_add(evas, _("Locale Selected"), 0);
1035 ob = e_widget_label_add(evas, _("Locale"));
1036 e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
1037 ob = e_widget_entry_add(evas, &(cfdata->cur_language), NULL, NULL, NULL);
1038 cfdata->gui.locale_entry = ob;
1039 e_widget_disabled_set(cfdata->gui.locale_entry, 1);
1040 e_widget_size_min_set(cfdata->gui.locale_entry, 100, 25);
1041 e_widget_frametable_object_append(of, cfdata->gui.locale_entry,
1042 0, 1, 1, 1, 1, 1, 1, 0);
1043 e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 0, 1, 0);
1045 /* all these cur_* values are not guaranteed to be const so we need to
1048 lang = eina_stringshare_ref(cfdata->cur_lang);
1049 reg = eina_stringshare_ref(cfdata->cur_reg);
1050 cs = eina_stringshare_ref(cfdata->cur_cs);
1051 mod = eina_stringshare_ref(cfdata->cur_mod);
1053 _cfdata_language_go(lang, reg, cs, mod, cfdata);
1055 eina_stringshare_del(lang);
1056 eina_stringshare_del(reg);
1057 eina_stringshare_del(cs);
1058 eina_stringshare_del(mod);
1060 e_widget_on_change_hook_set(cfdata->gui.lang_list, _ilist_language_cb_change, cfdata);
1061 e_widget_on_change_hook_set(cfdata->gui.reg_list, _ilist_region_cb_change, cfdata);
1062 e_widget_on_change_hook_set(cfdata->gui.cs_list, _ilist_codeset_cb_change, cfdata);
1063 e_widget_on_change_hook_set(cfdata->gui.mod_list, _ilist_modifier_cb_change, cfdata);
1065 e_dialog_resizable_set(cfd->dia, 1);
1070 _ilist_basic_language_cb_change(void *data, Evas_Object *obj __UNUSED__)
1072 E_Config_Dialog_Data *cfdata;
1075 e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_blang);
1079 _ilist_language_cb_change(void *data, Evas_Object *obj __UNUSED__)
1081 E_Config_Dialog_Data *cfdata;
1084 _cfdata_language_go(cfdata->cur_lang, NULL, NULL, NULL, cfdata);
1085 e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_lang);
1086 eina_stringshare_del(cfdata->cur_cs);
1087 eina_stringshare_del(cfdata->cur_mod);
1091 _ilist_region_cb_change(void *data, Evas_Object *obj __UNUSED__)
1093 E_Config_Dialog_Data * cfdata;
1098 _cfdata_language_go(cfdata->cur_lang, cfdata->cur_reg, NULL, NULL, cfdata);
1100 if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
1102 sprintf(locale, "%s_%s", cfdata->cur_lang, cfdata->cur_reg);
1103 e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
1106 e_widget_entry_text_set(cfdata->gui.locale_entry, "");
1107 eina_stringshare_del(cfdata->cur_cs);
1108 eina_stringshare_del(cfdata->cur_mod);
1112 _ilist_codeset_cb_change(void *data, Evas_Object *obj __UNUSED__)
1114 E_Config_Dialog_Data * cfdata;
1119 if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
1121 if (cfdata->cur_mod)
1122 sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod);
1124 sprintf(locale, "%s_%s.%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs);
1125 e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
1128 e_widget_entry_text_set(cfdata->gui.locale_entry, "");
1132 _ilist_modifier_cb_change(void *data, Evas_Object *obj __UNUSED__)
1134 E_Config_Dialog_Data * cfdata;
1139 if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
1142 sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod);
1144 sprintf(locale, "%s_%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_mod);
1145 e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
1148 e_widget_entry_text_set(cfdata->gui.locale_entry, "");
1152 _cfdata_language_go(const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata)
1154 E_Intl_Language_Node *lang_node;
1158 /* Check what changed */
1162 evas_event_freeze(evas_object_evas_get(cfdata->gui.cs_list));
1163 evas_event_freeze(evas_object_evas_get(cfdata->gui.mod_list));
1165 e_widget_ilist_freeze(cfdata->gui.cs_list);
1166 e_widget_ilist_freeze(cfdata->gui.mod_list);
1168 if ((!lang) || (!lang[0]))
1170 e_widget_ilist_clear(cfdata->gui.reg_list);
1171 e_widget_ilist_clear(cfdata->gui.cs_list);
1172 e_widget_ilist_clear(cfdata->gui.mod_list);
1174 if (cfdata->lang_dirty || (lang && !region))
1178 e_widget_ilist_clear(cfdata->gui.cs_list);
1179 e_widget_ilist_clear(cfdata->gui.mod_list);
1184 e_widget_ilist_clear(cfdata->gui.cs_list);
1185 e_widget_ilist_clear(cfdata->gui.mod_list);
1188 cfdata->lang_dirty = 0;
1192 lang_node = eina_hash_find(cfdata->locale_hash, lang);
1198 e_widget_ilist_clear(cfdata->gui.reg_list);
1199 cfdata->region_list = eina_list_free(cfdata->region_list);
1200 eina_hash_foreach(lang_node->region_hash,
1201 _region_hash_cb, cfdata);
1202 cfdata->region_list =
1203 eina_list_sort(cfdata->region_list,
1204 eina_list_count(cfdata->region_list),
1206 _region_list_load(cfdata);
1209 if (region && region_update)
1211 E_Intl_Region_Node *reg_node;
1213 reg_node = eina_hash_find(lang_node->region_hash, region);
1218 for (next = reg_node->available_codesets; next; next = next->next)
1223 e_widget_ilist_append(cfdata->gui.cs_list, NULL, cs, NULL, NULL, cs);
1224 if (codeset && !strcmp(cs, codeset))
1228 count = e_widget_ilist_count(cfdata->gui.cs_list);
1229 e_widget_ilist_selected_set(cfdata->gui.cs_list, count - 1);
1233 for (next = reg_node->available_modifiers; next; next = next->next)
1238 e_widget_ilist_append(cfdata->gui.mod_list, NULL, mod, NULL, NULL, mod);
1239 if (modifier && !strcmp(mod, modifier))
1243 count = e_widget_ilist_count(cfdata->gui.mod_list);
1244 e_widget_ilist_selected_set(cfdata->gui.mod_list, count - 1);
1249 e_widget_ilist_go(cfdata->gui.cs_list);
1250 e_widget_ilist_go(cfdata->gui.mod_list);
1254 e_widget_ilist_thaw(cfdata->gui.cs_list);
1255 e_widget_ilist_thaw(cfdata->gui.mod_list);
1257 evas_event_thaw(evas_object_evas_get(cfdata->gui.cs_list));
1258 evas_event_thaw(evas_object_evas_get(cfdata->gui.mod_list));
1260 e_widget_ilist_go(cfdata->gui.reg_list);
1264 _lang_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
1266 E_Config_Dialog_Data *cfdata;
1267 E_Intl_Language_Node *lang_node;
1272 cfdata->lang_list = eina_list_append(cfdata->lang_list, lang_node);
1277 _region_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
1279 E_Config_Dialog_Data *cfdata;
1280 E_Intl_Region_Node *reg_node;
1285 cfdata->region_list = eina_list_append(cfdata->region_list, reg_node);
1290 _intl_current_locale_setup(E_Config_Dialog_Data *cfdata)
1292 eina_stringshare_del(cfdata->cur_lang);
1293 eina_stringshare_del(cfdata->cur_reg);
1294 eina_stringshare_del(cfdata->cur_cs);
1295 eina_stringshare_del(cfdata->cur_mod);
1297 cfdata->cur_lang = NULL;
1298 cfdata->cur_reg = NULL;
1299 cfdata->cur_cs = NULL;
1300 cfdata->cur_mod = NULL;
1302 if (cfdata->cur_language)
1304 E_Locale_Parts *locale_parts;
1306 locale_parts = e_intl_locale_parts_get(cfdata->cur_language);
1309 cfdata->cur_lang = eina_stringshare_add(locale_parts->lang);
1310 cfdata->cur_reg = eina_stringshare_add(locale_parts->region);
1311 if (locale_parts->codeset)
1313 const char *cs_trans;
1315 cs_trans = _intl_charset_upper_get(locale_parts->codeset);
1317 cfdata->cur_cs = eina_stringshare_add(locale_parts->codeset);
1319 cfdata->cur_cs = eina_stringshare_add(cs_trans);
1321 cfdata->cur_mod = eina_stringshare_add(locale_parts->modifier);
1323 e_intl_locale_parts_free(locale_parts);
1325 cfdata->lang_dirty = 1;
1329 _lang_list_sort(const void *data1, const void *data2)
1331 const E_Intl_Language_Node *ln1, *ln2;
1335 if (!data1) return 1;
1336 if (!data2) return -1;
1341 if (!ln1->lang_name) return 1;
1342 trans1 = ln1->lang_name;
1344 if (!ln2->lang_name) return -1;
1345 trans2 = ln2->lang_name;
1347 return (strcmp(trans1, trans2));
1351 _lang_list_load(void *data)
1353 E_Config_Dialog_Data *cfdata;
1359 if (!cfdata->lang_list) return;
1361 evas_event_freeze(evas_object_evas_get(cfdata->gui.lang_list));
1363 e_widget_ilist_freeze(cfdata->gui.lang_list);
1365 e_widget_ilist_append(cfdata->gui.lang_list, NULL, _("System Default"), NULL, NULL, "");
1366 for (l = cfdata->lang_list; l; l = l->next)
1368 E_Intl_Language_Node *ln;
1374 trans = ln->lang_name;
1376 trans = ln->lang_code;
1378 if (ln->lang_available)
1382 ic = e_icon_add(cfdata->evas);
1383 e_util_icon_theme_set(ic, "dialog-ok-apply");
1384 e_widget_ilist_append(cfdata->gui.lang_list, ic, trans, NULL, NULL, ln->lang_code);
1387 e_widget_ilist_append(cfdata->gui.lang_list, NULL, trans, NULL, NULL, ln->lang_code);
1389 if (cfdata->cur_lang && !strcmp(cfdata->cur_lang, ln->lang_code))
1393 count = e_widget_ilist_count(cfdata->gui.lang_list);
1394 e_widget_ilist_selected_set(cfdata->gui.lang_list, count - 1);
1397 e_widget_ilist_thaw(cfdata->gui.lang_list);
1399 evas_event_thaw(evas_object_evas_get(cfdata->gui.lang_list));
1403 _region_list_sort(const void *data1, const void *data2)
1405 const E_Intl_Region_Node *rn1, *rn2;
1409 if (!data1) return 1;
1410 if (!data2) return -1;
1415 if (!rn1->region_name) return 1;
1416 trans1 = rn1->region_name;
1418 if (!rn2->region_name) return -1;
1419 trans2 = rn2->region_name;
1421 return (strcmp(trans1, trans2));
1425 _region_list_load(void *data)
1427 E_Config_Dialog_Data *cfdata;
1433 if (!cfdata->region_list) return;
1435 evas_event_freeze(evas_object_evas_get(cfdata->gui.reg_list));
1437 e_widget_ilist_freeze(cfdata->gui.reg_list);
1439 for (l = cfdata->region_list; l; l = l->next)
1441 E_Intl_Region_Node *rn;
1446 if (rn->region_name)
1447 trans = rn->region_name;
1449 trans = rn->region_code;
1451 e_widget_ilist_append(cfdata->gui.reg_list, NULL, trans, NULL, NULL, rn->region_code);
1453 if (cfdata->cur_reg && !strcmp(cfdata->cur_reg, rn->region_code))
1457 count = e_widget_ilist_count(cfdata->gui.reg_list);
1458 e_widget_ilist_selected_set(cfdata->gui.reg_list, count - 1);
1461 e_widget_ilist_thaw(cfdata->gui.reg_list);
1463 evas_event_thaw(evas_object_evas_get(cfdata->gui.reg_list));
1467 _basic_lang_list_sort(const void *data1, const void *data2)
1469 const E_Intl_Pair *ln1, *ln2;
1473 if (!data1) return 1;
1474 if (!data2) return -1;
1479 if (!ln1->locale_translation) return 1;
1480 trans1 = ln1->locale_translation;
1482 if (!ln2->locale_translation) return -1;
1483 trans2 = ln2->locale_translation;
1485 return (strcmp(trans1, trans2));
1489 _intl_charset_upper_get(const char *charset)
1494 while (charset_predefined_pairs[i].locale_key)
1496 if (!strcmp(charset_predefined_pairs[i].locale_key, charset))
1498 return charset_predefined_pairs[i].locale_translation;