6435f8f8418651fc4e05fbb7f8db55360bafa1ea
[framework/uifw/e17.git] / src / modules / wizard / page_010.c
1 /* Language chooser */
2 #include "e.h"
3 #include "e_mod_main.h"
4
5 typedef struct _E_Intl_Pair E_Intl_Pair;
6
7 static int _basic_lang_list_sort(const void *data1, const void *data2);
8
9 struct _E_Intl_Pair
10 {
11    const char *locale_key;
12    const char *locale_icon;
13    const char *locale_translation;
14 };
15
16 const E_Intl_Pair basic_language_predefined_pairs[ ] = {
17      {"bg_BG.UTF-8", "lang-bg_BG.png", "Български"},
18      {"ca_ES.UTF-8", "lang-ca_ES.png", "Català"},
19      {"zh_CN.UTF-8", "lang-zh_CN.png", "Chinese (Simplified)"},
20      {"zh_TW.UTF-8", "lang-zh_TW.png", "Chinese (Traditional)"},
21      {"cs_CZ.UTF-8", "lang-cs_CZ.png", "Čeština"},
22      {"da_DK.UTF-8", "lang-da_DK.png", "Dansk"},
23      {"nl_NL.UTF-8", "lang-nl_NL.png", "Nederlands"},
24      {"en_US.UTF-8", "lang-en_US.png", "English"},
25      {"fi_FI.UTF-8", "lang-fi_FI.png", "Suomi"},
26      {"fr_FR.UTF-8", "lang-fr_FR.png", "Français"},
27      {"de_DE.UTF-8", "lang-de_DE.png", "Deutsch"},
28      {"hu_HU.UTF-8", "lang-hu_HU.png", "Magyar"},
29      {"it_IT.UTF-8", "lang-it_IT.png", "Italiano"},
30      {"ja_JP.UTF-8", "lang-ja_JP.png", "日本語"},
31      {"ko_KR.UTF-8", "lang-ko_KR.png", "한국어"},
32      {"nb_NO.UTF-8", "lang-nb_NO.png", "Norsk Bokmål"},
33      {"pl_PL.UTF-8", "lang-pl_PL.png", "Polski"},
34      {"pt_BR.UTF-8", "lang-pt_BR.png", "Português"},
35      {"ru_RU.UTF-8", "lang-ru_RU.png", "Русский"},
36      {"sk_SK.UTF-8", "lang-sk_SK.png", "Slovenčina"},
37      {"sl_SI.UTF-8", "lang-sl_SI.png", "Slovenščina"},
38      {"es_AR.UTF-8", "lang-es_AR.png", "Español"},
39      {"sv_SE.UTF-8", "lang-sv_SE.png", "Svenska"},
40      {"el_GR.UTF-8", "lang-el_GR.png", "Ελληνικά"},
41      { NULL, NULL, NULL }
42 };
43
44 static const char *lang = NULL;
45 static Eina_List *blang_list = NULL;
46
47 static int 
48 _basic_lang_list_sort(const void *data1, const void *data2) 
49 {
50    E_Intl_Pair *ln1, *ln2;
51    const char *trans1;
52    const char *trans2;
53    
54    if (!data1) return 1;
55    if (!data2) return -1;
56    
57    ln1 = (E_Intl_Pair *)data1;
58    ln2 = (E_Intl_Pair *)data2;
59
60    if (!ln1->locale_translation) return 1;
61    trans1 = ln1->locale_translation;
62
63    if (!ln2->locale_translation) return -1;
64    trans2 = ln2->locale_translation;
65    
66    return (strcmp(trans1, trans2));
67 }
68
69 EAPI int
70 wizard_page_init(E_Wizard_Page *pg __UNUSED__)
71 {
72    FILE *output;
73
74    output = popen("locale -a", "r");
75    if (output) 
76      {
77         char line[32];
78
79         while (fscanf(output, "%[^\n]\n", line) == 1)
80           {
81              E_Locale_Parts *locale_parts;
82
83              locale_parts = e_intl_locale_parts_get(line);
84              if (locale_parts)
85                {
86                   char *basic_language;
87
88                   basic_language = 
89                     e_intl_locale_parts_combine
90                     (locale_parts, E_INTL_LOC_LANG | E_INTL_LOC_REGION);
91                   if (basic_language)
92                     {
93                        int i = 0;
94
95                        while (basic_language_predefined_pairs[i].locale_key)
96                          {
97                             /* if basic language is supported by E and System*/
98                             if (!strncmp
99                                 (basic_language_predefined_pairs[i].locale_key,
100                                  basic_language, strlen(basic_language)))
101                               {
102                                  if (!eina_list_data_find
103                                      (blang_list, 
104                                       &basic_language_predefined_pairs[i]))
105                                    blang_list = eina_list_append
106                                    (blang_list, 
107                                     &basic_language_predefined_pairs[i]);
108                                  break;
109                               }
110                             i++;
111                          }
112                     }
113                   E_FREE(basic_language);
114                   e_intl_locale_parts_free(locale_parts);
115                }
116           }
117         /* Sort basic languages */      
118         blang_list = eina_list_sort(blang_list, eina_list_count(blang_list), _basic_lang_list_sort);
119         pclose(output);
120      }
121    return 1;
122 }
123
124 EAPI int
125 wizard_page_shutdown(E_Wizard_Page *pg __UNUSED__)
126 {
127    // FIXME: free blang_list
128    return 1;
129 }
130
131 EAPI int
132 wizard_page_show(E_Wizard_Page *pg)
133 {
134    Evas_Object *o, *of, *ob;
135    Eina_List *l;
136    int i, sel = -1;
137
138    o = e_widget_list_add(pg->evas, 1, 0);
139    e_wizard_title_set(_("Language"));
140    of = e_widget_framelist_add(pg->evas, _("Select one"), 0);
141    ob = e_widget_ilist_add(pg->evas, 32 * e_scale, 32 * e_scale, &lang);
142    e_widget_size_min_set(ob, 140 * e_scale, 140 * e_scale);
143
144    e_widget_ilist_freeze(ob);
145
146    e_widget_ilist_append(ob, NULL, _("System Default"), 
147                          NULL, NULL, NULL);
148    for (i = 1, l = blang_list; l; l = l->next, i++)
149      {
150         E_Intl_Pair *pair;
151         Evas_Object *ic;
152         char buf[PATH_MAX];
153
154         pair = l->data;
155         e_prefix_data_snprintf(buf, sizeof(buf), "data/images/%s", pair->locale_icon);
156         ic = e_util_icon_add(buf, pg->evas);
157         e_widget_ilist_append(ob, ic, _(pair->locale_translation), 
158                               NULL, NULL, pair->locale_key);
159         if (e_intl_language_get())
160           {
161              if (!strcmp(pair->locale_key, e_intl_language_get())) sel = i;
162           }
163      }
164    e_widget_ilist_go(ob);
165    e_widget_ilist_thaw(ob);
166    if (sel >= 0) e_widget_ilist_selected_set(ob, sel);
167
168    e_widget_framelist_object_append(of, ob);
169    e_widget_list_object_append(o, of, 1, 1, 0.5);
170    evas_object_show(ob);
171    evas_object_show(of);
172    e_wizard_page_show(o);
173    pg->data = of;
174    return 1; /* 1 == show ui, and wait for user, 0 == just continue */
175 }
176
177 EAPI int
178 wizard_page_hide(E_Wizard_Page *pg)
179 {
180    evas_object_del(pg->data);
181    /* special - language inits its stuff the moment it goes away */
182    eina_stringshare_del(e_config->language);
183    e_config->language = eina_stringshare_ref(lang);
184    e_intl_language_set(e_config->language);
185    e_wizard_labels_update();
186    return 1;
187 }
188
189 EAPI int
190 wizard_page_apply(E_Wizard_Page *pg __UNUSED__)
191 {
192    // do this again as we want it to apply to the new profile
193    eina_stringshare_del(e_config->language);
194    e_config->language = eina_stringshare_ref(lang);
195    e_intl_language_set(e_config->language);
196    e_wizard_labels_update();
197    return 1;
198 }