Fix language fallback 61/116061/4
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 22 Feb 2017 22:33:53 +0000 (07:33 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 23 Feb 2017 02:03:55 +0000 (11:03 +0900)
- Duplicate the locale directory before calling __update_lang()
- Use g_list_remove instead of g_list_remove_link
- Add the default languages to the language list

Change-Id: Ic572b32ad3345e3f3c6858f7d62c82465e9b3b83
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/appcore-i18n.c
src/base/appcore_base.c

index 94289e6..1003ea8 100644 (file)
@@ -115,14 +115,37 @@ static GHashTable *__get_lang_table(void)
        return table;
 }
 
+static char *__get_string_before(const char *str, const char *delim)
+{
+       char *new_str;
+       char *dup_str;
+       char *token;
+
+       dup_str = strdup(str);
+       if (dup_str == NULL)
+               return NULL;
+
+       token = strtok(dup_str, delim);
+       if (token == NULL) {
+               free(dup_str);
+               return NULL;
+       }
+
+       new_str = strdup(token);
+       free(dup_str);
+
+       return new_str;
+}
+
 static GList *__append_langs(const char *lang, GList *list, GHashTable *table)
 {
        GList *child_list;
        GList *child_iter;
        GList *found;
        char *child_lang;
-       char *dup_lang;
-       char *token;
+       char *parent_lang;
+       char *extract_lang;
+       char *tmp;
 
        if (lang == NULL)
                return list;
@@ -130,51 +153,51 @@ static GList *__append_langs(const char *lang, GList *list, GHashTable *table)
        found = g_list_find_custom(g_list_first(list), lang,
                        __compare_langs);
        if (found) {
-               list = g_list_remove_link(list, found);
-               free(found->data);
-               g_list_free(found);
-               list = g_list_append(list, strdup(lang));
+               tmp = (char *)found->data;
+               list = g_list_remove(list, tmp);
+               list = g_list_append(list, tmp);
                return list;
        }
 
-       dup_lang = strdup(lang);
-       if (dup_lang == NULL)
+       extract_lang = __get_string_before(lang, ".");
+       if (extract_lang == NULL)
                return list;
 
-       token = strtok(dup_lang, "_");
-       if (token == NULL) {
-               free(dup_lang);
+       parent_lang = __get_string_before(extract_lang, "_");
+       if (parent_lang == NULL) {
+               free(extract_lang);
                return list;
        }
 
-       child_list = g_hash_table_lookup(table, token);
+       child_list = g_hash_table_lookup(table, parent_lang);
        if (child_list == NULL) {
-               free(dup_lang);
+               free(parent_lang);
+               free(extract_lang);
                return list;
        }
 
        found = g_list_find_custom(g_list_first(child_list),
-                       lang, __compare_langs);
+                       extract_lang, __compare_langs);
        if (found) {
-               list = g_list_append(list, strdup(lang));
-               child_list = g_list_remove_link(child_list, found);
-               free(found->data);
-               g_list_free(found);
-               free(dup_lang);
+               tmp = (char *)found->data;
+               child_list = g_list_remove(child_list, tmp);
+               list = g_list_append(list, tmp);
+               free(parent_lang);
+               free(extract_lang);
                return list;
        }
+       free(extract_lang);
 
        found = g_list_find_custom(g_list_first(child_list),
-                       token, __compare_langs);
+                       parent_lang, __compare_langs);
        if (found) {
-               list = g_list_append(list, strdup(token));
-               child_list = g_list_remove_link(child_list, found);
-               free(found->data);
-               g_list_free(found);
-               free(dup_lang);
+               tmp = (char *)found->data;
+               child_list = g_list_remove(child_list, tmp);
+               list = g_list_append(list, tmp);
+               free(parent_lang);
                return list;
        }
-       free(dup_lang);
+       free(parent_lang);
 
        child_iter = g_list_first(child_list);
        while (child_iter) {
@@ -213,6 +236,22 @@ static GList *__split_language(const char *lang)
        return list;
 }
 
+static GList *__append_default_langs(GList *list)
+{
+       const char *langs[] = {"en_US", "en_GB", "en"};
+       unsigned int i;
+       GList *found;
+
+       for (i = 0; i < (sizeof(langs) / sizeof(langs[0])); i++) {
+               found = g_list_find_custom(g_list_first(list), langs[i],
+                               __compare_langs);
+               if (found == NULL)
+                       list = g_list_append(list, strdup(langs[i]));
+       }
+
+       return list;
+}
+
 static char *__get_language(const char *lang)
 {
        GHashTable *table;
@@ -242,6 +281,7 @@ static char *__get_language(const char *lang)
        g_list_free_full(list, free);
        g_hash_table_destroy(table);
 
+       lang_list = __append_default_langs(lang_list);
        iter = g_list_first(lang_list);
        while (iter) {
                language = (char *)iter->data;
@@ -259,11 +299,6 @@ static char *__get_language(const char *lang)
        }
        g_list_free_full(lang_list, free);
 
-       n = sizeof(buf) - strlen(buf) - 1;
-       strncat(buf, ":", n);
-       n = sizeof(buf) - strlen(buf) - 1;
-       strncat(buf, "en_US:en_GB:en", n);
-
        return strdup(buf);
 }
 
index 2f7298b..93e2f56 100644 (file)
@@ -196,14 +196,37 @@ static GHashTable *__get_lang_table(void)
        return table;
 }
 
+static char *__get_string_before(const char *str, const char *delim)
+{
+       char *new_str;
+       char *dup_str;
+       char *token;
+
+       dup_str = strdup(str);
+       if (dup_str == NULL)
+               return NULL;
+
+       token = strtok(dup_str, delim);
+       if (token == NULL) {
+               free(dup_str);
+               return NULL;
+       }
+
+       new_str = strdup(token);
+       free(dup_str);
+
+       return new_str;
+}
+
 static GList *__append_langs(const char *lang, GList *list, GHashTable *table)
 {
        GList *child_list;
        GList *child_iter;
        GList *found;
        char *child_lang;
-       char *dup_lang;
-       char *token;
+       char *parent_lang;
+       char *extract_lang;
+       char *tmp;
 
        if (lang == NULL)
                return list;
@@ -211,51 +234,51 @@ static GList *__append_langs(const char *lang, GList *list, GHashTable *table)
        found = g_list_find_custom(g_list_first(list), lang,
                        __compare_langs);
        if (found) {
-               list = g_list_remove_link(list, found);
-               free(found->data);
-               g_list_free(found);
-               list = g_list_append(list, strdup(lang));
+               tmp = (char *)found->data;
+               list = g_list_remove(list, tmp);
+               list = g_list_append(list, tmp);
                return list;
        }
 
-       dup_lang = strdup(lang);
-       if (dup_lang == NULL)
+       extract_lang = __get_string_before(lang, ".");
+       if (extract_lang == NULL)
                return list;
 
-       token = strtok(dup_lang, "_");
-       if (token == NULL) {
-               free(dup_lang);
+       parent_lang = __get_string_before(extract_lang, "_");
+       if (parent_lang == NULL) {
+               free(extract_lang);
                return list;
        }
 
-       child_list = g_hash_table_lookup(table, token);
+       child_list = g_hash_table_lookup(table, parent_lang);
        if (child_list == NULL) {
-               free(dup_lang);
+               free(parent_lang);
+               free(extract_lang);
                return list;
        }
 
        found = g_list_find_custom(g_list_first(child_list),
-                       lang, __compare_langs);
+                       extract_lang, __compare_langs);
        if (found) {
-               list = g_list_append(list, strdup(lang));
-               child_list = g_list_remove_link(child_list, found);
-               free(found->data);
-               g_list_free(found);
-               free(dup_lang);
+               tmp = (char *)found->data;
+               child_list = g_list_remove(child_list, tmp);
+               list = g_list_append(list, tmp);
+               free(parent_lang);
+               free(extract_lang);
                return list;
        }
+       free(extract_lang);
 
        found = g_list_find_custom(g_list_first(child_list),
-                       token, __compare_langs);
+                       parent_lang, __compare_langs);
        if (found) {
-               list = g_list_append(list, strdup(token));
-               child_list = g_list_remove_link(child_list, found);
-               free(found->data);
-               g_list_free(found);
-               free(dup_lang);
+               tmp = (char *)found->data;
+               child_list = g_list_remove(child_list, tmp);
+               list = g_list_append(list, tmp);
+               free(parent_lang);
                return list;
        }
-       free(dup_lang);
+       free(parent_lang);
 
        child_iter = g_list_first(child_list);
        while (child_iter) {
@@ -294,6 +317,22 @@ static GList *__split_language(const char *lang)
        return list;
 }
 
+static GList *__append_default_langs(GList *list)
+{
+       const char *langs[] = {"en_US", "en_GB", "en"};
+       unsigned int i;
+       GList *found;
+
+       for (i = 0; i < (sizeof(langs) / sizeof(langs[0])); i++) {
+               found = g_list_find_custom(g_list_first(list), langs[i],
+                               __compare_langs);
+               if (found == NULL)
+                       list = g_list_append(list, strdup(langs[i]));
+       }
+
+       return list;
+}
+
 static char *__get_language(const char *lang)
 {
        GHashTable *table;
@@ -323,6 +362,7 @@ static char *__get_language(const char *lang)
        g_list_free_full(list, free);
        g_hash_table_destroy(table);
 
+       lang_list = __append_default_langs(lang_list);
        iter = g_list_first(lang_list);
        while (iter) {
                language = (char *)iter->data;
@@ -340,11 +380,6 @@ static char *__get_language(const char *lang)
        }
        g_list_free_full(lang_list, free);
 
-       n = sizeof(buf) - strlen(buf) - 1;
-       strncat(buf, ":", n);
-       n = sizeof(buf) - strlen(buf) - 1;
-       strncat(buf, "en_US:en_GB:en", n);
-
        return strdup(buf);
 }
 
@@ -363,7 +398,7 @@ static void __update_lang(void)
                        setenv("LANGUAGE", language, 1);
                        free(language);
                } else {
-                       setenv("LANGUAGE", language, 1);
+                       setenv("LANGUAGE", lang, 1);
                }
                setenv("LANG", lang, 1);
                setenv("LC_MESSAGES", lang, 1);
@@ -581,6 +616,12 @@ static int __set_i18n(const char *domain, const char *dir)
                return -1;
        }
 
+       if (dir) {
+               if (__locale_dir)
+                       free(__locale_dir);
+               __locale_dir = strdup(dir);
+       }
+
        __update_lang();
        __update_region();
 
@@ -597,12 +638,6 @@ static int __set_i18n(const char *domain, const char *dir)
        if (r == NULL)
                _ERR("appcore: setlocale() error");
 
-       if (dir) {
-               if (__locale_dir)
-                       free(__locale_dir);
-               __locale_dir = strdup(dir);
-       }
-
        r = bindtextdomain(domain, dir);
        if (r == NULL)
                _ERR("appcore: bindtextdomain() error");