Enlightenment CVS committal Author : stffrdhrn Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_intl.c e_intl.h e_apps.c Log Message: Add language alias caching * use alias cache when getting language for e_app display * fix memory for alias hash getting freed at the wrong time =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_intl.c,v retrieving revision 1.77 retrieving revision 1.78 diff -u -3 -r1.77 -r1.78 --- e_intl.c 9 Mar 2006 14:50:12 -0000 1.77 +++ e_intl.c 13 Mar 2006 13:51:22 -0000 1.78 @@ -16,6 +16,8 @@ static char *_e_intl_orig_lang = NULL; static char *_e_intl_language = NULL; +static char *_e_intl_language_alias = NULL; + static char *_e_intl_orig_xmodifiers = NULL; static char *_e_intl_orig_qt_im_module = NULL; static char *_e_intl_orig_gtk_im_module = NULL; @@ -41,13 +43,13 @@ static int _e_intl_language_list_find(Evas_List *language_list, char *language); /* Locale Validation and Discovery */ -static char *_e_intl_locale_alias_get(char *language); static Evas_Hash *_e_intl_locale_alias_hash_get(void); +static char *_e_intl_locale_alias_get(const char * language); static Evas_List *_e_intl_locale_system_locales_get(void); static Evas_List *_e_intl_locale_search_order_get(char *locale); static int _e_intl_locale_validate(char *locale); static void _e_intl_locale_hash_free(Evas_Hash *language_hash); -Evas_Bool _e_intl_locale_hash_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_Bool _e_intl_locale_hash_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); /* Input Method Configuration and Management */ static int _e_intl_cb_exit(void *data, int type, void *event); @@ -128,6 +130,7 @@ e_intl_input_method_set(NULL); e_intl_language_set(NULL); + E_FREE(_e_intl_language_alias); E_EXE_STOP(_e_intl_input_method_exec); return 1; @@ -145,10 +148,8 @@ EAPI void e_intl_language_set(const char *lang) { - char *alias_locale; int set_envars; - - if (_e_intl_language) free(_e_intl_language); + set_envars = 1; /* NULL lang means set everything back to the original environment * defaults @@ -167,18 +168,21 @@ set_envars = 0; } - + + E_FREE(_e_intl_language_alias); + _e_intl_language_alias = _e_intl_locale_alias_get(lang); + E_FREE(_e_intl_language); + if (lang) _e_intl_language = strdup(lang); else _e_intl_language = NULL; - alias_locale = _e_intl_locale_alias_get(_e_intl_language); - if (!_e_intl_locale_validate(alias_locale)) + if (!_e_intl_locale_validate(_e_intl_language_alias)) { fprintf(stderr, "The locale '%s' cannot be found on your " "system. Please install this locale or try " - "something else.\n", alias_locale); + "something else.\n", _e_intl_language_alias); } else { @@ -196,15 +200,15 @@ { char *locale_path; - locale_path = _e_intl_language_path_find(alias_locale); + locale_path = _e_intl_language_path_find(_e_intl_language_alias); if (locale_path == NULL) { char * match_lang; - match_lang = e_intl_locale_canonic_get(alias_locale, E_LOC_LANG); + match_lang = e_intl_locale_canonic_get(_e_intl_language_alias, E_LOC_LANG); /* If locale is C or some form of en don't report an error */ - if ( match_lang == NULL && strcmp (alias_locale, "C") ) + if ( match_lang == NULL && strcmp (_e_intl_language_alias, "C") ) { fprintf(stderr, "The locale you have chosen '%s' " "appears to be an alias, however, it can not be " @@ -213,7 +217,7 @@ "which can resolve this alias.\n" "\n" "Enlightenment will not be translated.\n", - alias_locale); + _e_intl_language_alias); } else if ( match_lang != NULL && strcmp(match_lang, "en") ) { @@ -222,7 +226,7 @@ "your 'messages' path.\n" "\n" "Enlightenment will not be translated.\n", - alias_locale); + _e_intl_language_alias); } E_FREE(match_lang); } @@ -235,7 +239,6 @@ } } } - free(alias_locale); } EAPI const char * @@ -244,6 +247,12 @@ return _e_intl_language; } +EAPI const char * +e_intl_language_alias_get(void) +{ + return _e_intl_language_alias; +} + EAPI Evas_List * e_intl_language_list(void) { @@ -466,7 +475,7 @@ evas_hash_free(locale_hash); } -Evas_Bool +static Evas_Bool _e_intl_locale_hash_free_cb(Evas_Hash *hash __UNUSED__, const char *key __UNUSED__, void *data, void *fdata __UNUSED__) { free(data); @@ -593,19 +602,19 @@ * is no alias. */ static char * -_e_intl_locale_alias_get(char *language) +_e_intl_locale_alias_get(const char *language) { Evas_Hash *alias_hash; char *canonic; char *alias; - + if (language == NULL || !strncmp(language, "POSIX", strlen("POSIX"))) return strdup("C"); canonic = e_intl_locale_canonic_get(language, E_LOC_ALL ); alias_hash = _e_intl_locale_alias_hash_get(); - if (alias_hash == NULL) + if (alias_hash == NULL) /* No alias file available */ { if (canonic == NULL) return strdup(language); @@ -613,26 +622,24 @@ return canonic; } - if (canonic == NULL) /* not not a locale */ + if (canonic == NULL) /* Should be an alias */ { char *lower_language; int i; - lower_language = (char *) malloc(strlen(language) + 1); + lower_language = malloc(strlen(language) + 1); for (i = 0; i < strlen(language); i++) lower_language[i] = tolower(language[i]); lower_language[i] = 0; - alias = (char *) evas_hash_find(alias_hash, lower_language); + alias = evas_hash_find(alias_hash, lower_language); free(lower_language); } - else + else /* check for alias */ { - alias = (char *) evas_hash_find(alias_hash, canonic); + alias = evas_hash_find(alias_hash, canonic); } - _e_intl_locale_hash_free(alias_hash); - if (alias) { alias = strdup(alias); @@ -646,6 +653,8 @@ { alias = strdup(language); } + + _e_intl_locale_hash_free(alias_hash); return alias; } @@ -702,7 +711,7 @@ * the returned string needs to be freed */ EAPI char * -e_intl_locale_canonic_get(char *locale, int ret_mask) +e_intl_locale_canonic_get(const char *locale, int ret_mask) { char *clean_locale; int clean_e_intl_locale_size; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_intl.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_intl.h 9 Mar 2006 14:50:12 -0000 1.11 +++ e_intl.h 13 Mar 2006 13:51:22 -0000 1.12 @@ -47,6 +47,7 @@ /* Setting & Getting Language */ EAPI void e_intl_language_set(const char *lang); EAPI const char *e_intl_language_get(void); +EAPI const char *e_intl_language_alias_get(void); EAPI Evas_List *e_intl_language_list(void); /* Setting & Getting Input Method */ EAPI void e_intl_input_method_set(const char *method); @@ -56,6 +57,6 @@ EAPI int e_intl_input_method_config_write (Eet_File *imc_file, E_Input_Method_Config *imc); EAPI void e_intl_input_method_config_free (E_Input_Method_Config *imc); /* Getting locale */ -EAPI char *e_intl_locale_canonic_get(char *locale, int ret_mask); +EAPI char *e_intl_locale_canonic_get(const char *locale, int ret_mask); #endif #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_apps.c,v retrieving revision 1.126 retrieving revision 1.127 diff -u -3 -r1.126 -r1.127 --- e_apps.c 9 Mar 2006 14:50:12 -0000 1.126 +++ e_apps.c 13 Mar 2006 13:51:22 -0000 1.127 @@ -988,14 +988,17 @@ { Eet_File *ef; char *str, *v; - char *lang; + const char *lang; int size; /* get our current language */ - lang = getenv("LANG"); + lang = e_intl_language_alias_get(); + /* if its "C" its the default - so drop it */ - if ((lang) && (!strcmp(lang, "C"))) - lang = NULL; + if (!strcmp(lang, "C")) + { + lang = NULL; + } if (!path) path = a->path; ef = eet_open(path, EET_FILE_MODE_READ); if (!ef) return; @@ -1074,7 +1077,7 @@ { Eet_File *ef; char buf[PATH_MAX]; - char *lang; + const char *lang; unsigned char tmp[1]; int img; @@ -1089,10 +1092,13 @@ img = 1; /* get our current language */ - lang = getenv("LANG"); + lang = e_intl_language_alias_get(); + /* if its "C" its the default - so drop it */ - if ((lang) && (!strcmp(lang, "C"))) - lang = NULL; + if (!strcmp(lang, "C")) + { + lang = NULL; + } ef = eet_open(a->path, EET_FILE_MODE_READ_WRITE); if (!ef) return; ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs