From decf483d3e70bb4a808896d68ab45120f9ca7fb0 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 7 Aug 2019 08:49:55 +0900 Subject: [PATCH] Support language change in runtime Change-Id: Ifc011ae0998ae94ae62f6942d45d8be923f27d88 Signed-off-by: Jihoon Kim --- im_setting_list/input_method_setting_list.cpp | 10 ++- .../input_method_setting_list_popup_view.cpp | 17 +++-- im_setting_list/input_method_setting_list_ui.cpp | 76 +++++++++++++++------- .../input_method_setting_selector.cpp | 10 ++- .../input_method_setting_selector_ui.cpp | 12 ++-- 5 files changed, 89 insertions(+), 36 deletions(-) diff --git a/im_setting_list/input_method_setting_list.cpp b/im_setting_list/input_method_setting_list.cpp index bd3c5d3..5186afb 100644 --- a/im_setting_list/input_method_setting_list.cpp +++ b/im_setting_list/input_method_setting_list.cpp @@ -128,8 +128,16 @@ app_terminate(void *data) static void ui_app_lang_changed(app_event_info_h event_info, void *user_data) { - LOGD(""); /*APP_EVENT_LANGUAGE_CHANGED*/ + char *lang = NULL; + app_event_get_language(event_info, &lang); + + LOGD("lang : %s", lang); + + if (lang) { + elm_language_set(lang); + free(lang); + } } static void diff --git a/im_setting_list/input_method_setting_list_popup_view.cpp b/im_setting_list/input_method_setting_list_popup_view.cpp index 300a95d..b50caab 100644 --- a/im_setting_list/input_method_setting_list_popup_view.cpp +++ b/im_setting_list/input_method_setting_list_popup_view.cpp @@ -24,8 +24,7 @@ #include #include -#define IM_SETTING_LIST_POPUP_VIEW_TITLE dgettext(PACKAGE, "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB") -#define IM_SETTING_SELECT_KEYBOARD dgettext(PACKAGE, "IDS_IME_BODY_SELECT_KEYBOARD") +#define IM_SETTING_LIST_POPUP_VIEW_TITLE "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB" static std::vector g_active_ime_info_list; static Elm_Genlist_Item_Class *itc_im_list = NULL; @@ -188,6 +187,13 @@ static void im_setting_list_ime_sel_cb(void *data, Evas_Object *obj, void *event ecore_idler_add(_ime_select_idler_cb, ad); } +static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info) +{ + im_setting_list_load_active_ime_info(); + + elm_genlist_realized_items_update(obj); +} + static Evas_Object *im_setting_list_genlist_create(appdata *ad, Evas_Object* parent, Evas_Object* conform) { if (!parent) @@ -204,6 +210,7 @@ static Evas_Object *im_setting_list_genlist_create(appdata *ad, Evas_Object* par evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE); + evas_object_smart_callback_add(genlist, "language,changed", gl_lang_changed, NULL); evas_object_show(genlist); return genlist; } @@ -348,7 +355,7 @@ static Evas_Object *im_setting_list_popup_create(void *data) Evas_Object *popup = elm_popup_add(parentWin); elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0); evas_object_smart_callback_add(popup, "block,clicked", im_setting_list_popup_block_clicked_cb, data); - elm_object_part_text_set(popup, "title,text", IM_SETTING_LIST_POPUP_VIEW_TITLE); + elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE); elm_object_style_set(popup, "theme_bg"); eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, im_setting_list_popup_view_back_cb, data); ad->popup = popup; @@ -364,7 +371,7 @@ static Evas_Object *im_setting_list_popup_create(void *data) static char * im_setting_list_default_keyboard_title_text_get(void *data, Evas_Object *obj, const char *part) { - return strdup(IM_SETTING_LIST_POPUP_VIEW_TITLE); + return strdup(dgettext(PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE)); } static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it) @@ -427,7 +434,7 @@ static void im_setting_list_screen_create(void *data) Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, genlist, "empty"); #ifdef _WEARABLE - elm_atspi_accessible_name_set(navi_it, IM_SETTING_LIST_POPUP_VIEW_TITLE); + elm_atspi_accessible_name_set(navi_it, dgettext(PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE)); #endif elm_naviframe_item_pop_cb_set(navi_it, _pop_cb, ad); } diff --git a/im_setting_list/input_method_setting_list_ui.cpp b/im_setting_list/input_method_setting_list_ui.cpp index 5311c14..9072732 100644 --- a/im_setting_list/input_method_setting_list_ui.cpp +++ b/im_setting_list/input_method_setting_list_ui.cpp @@ -29,16 +29,16 @@ #define IM_SETTING_LIST_PACKAGE PACKAGE #define IM_SETTING_LIST_LOCALE_DIR tzplatform_mkpath(TZ_SYS_RO_APP, PACKAGE_NAME"/res/locale") -#define IM_SETTING_LIST_TITLE dgettext(PACKAGE, "IDS_IME_BODY_KEYBOARD") -#define IM_SETTING_LIST_KEYBOARD_HEADER dgettext(PACKAGE, "IDS_ST_HEADER_KEYBOARDS") -#define IM_SETTING_LIST_POPUP_TITLE dgettext(PACKAGE, "IDS_ST_BODY_ATTENTION") -#define IM_SETTING_LIST_POPUP_CANCEL dgettext(PACKAGE, "IDS_COM_SK_CANCEL_ABB") -#define IM_SETTING_LIST_POPUP_ENABLE dgettext(PACKAGE, "IDS_ST_BUTTON_ENABLE") -#define IM_SETTING_LIST_VIRTUAL_KEYBOARD dgettext(PACKAGE, "IDS_ST_HEADER_VIRTUAL_KEYBOARD") -#define IM_SETTING_LIST_DEFAULT_KEYBOARD dgettext(PACKAGE, "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB") -#define IM_SETTING_LIST_KEYBOARD_SETTING dgettext(PACKAGE, "IDS_IME_HEADER_KEYBOARD_SETTINGS_ABB") -#define IM_SETTING_LIST_TURNON_KEYBOARD dgettext(PACKAGE, "IDS_ST_BUTTON_TURN_ON_KEYBOARD_ABB") -#define IM_SETTING_LIST_TURNON dgettext(PACKAGE, "IDS_ST_BUTTON_TURN_ON_ABB3") +#define IM_SETTING_LIST_TITLE "IDS_IME_BODY_KEYBOARD" +#define IM_SETTING_LIST_KEYBOARD_HEADER "IDS_ST_HEADER_KEYBOARDS" +#define IM_SETTING_LIST_POPUP_TITLE "IDS_ST_BODY_ATTENTION" +#define IM_SETTING_LIST_POPUP_CANCEL "IDS_COM_SK_CANCEL_ABB" +#define IM_SETTING_LIST_POPUP_ENABLE "IDS_ST_BUTTON_ENABLE" +#define IM_SETTING_LIST_VIRTUAL_KEYBOARD "IDS_ST_HEADER_VIRTUAL_KEYBOARD" +#define IM_SETTING_LIST_DEFAULT_KEYBOARD "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB" +#define IM_SETTING_LIST_KEYBOARD_SETTING "IDS_IME_HEADER_KEYBOARD_SETTINGS_ABB" +#define IM_SETTING_LIST_TURNON_KEYBOARD "IDS_ST_BUTTON_TURN_ON_KEYBOARD_ABB" +#define IM_SETTING_LIST_TURNON "IDS_ST_BUTTON_TURN_ON_ABB3" #define IM_SETTING_LIST_POPUP_TEXT dgettext(PACKAGE, "IDS_ST_POP_THIS_INPUT_METHOD_MAY_BE_ABLE_TO_COLLECT_ALL_THE"\ "_TEXT_YOU_TYPE_INCLUDING_PERSONAL_DATA_LIKE_PASSWORDS_AND"\ "_CREDIT_CARD_NUMBERS_MSG") @@ -263,6 +263,21 @@ static void _popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf delete cb_data; } +static void set_popup_message(Evas_Object *obj, int index) +{ + char chFormatMsg[255] = {'\0'}; + char chPopupMsg[255] = {'\0'}; + snprintf(chFormatMsg, sizeof(chFormatMsg), "%s", IM_SETTING_LIST_POPUP_TEXT); + snprintf(chPopupMsg, sizeof(chPopupMsg), chFormatMsg, g_ime_info_list[index].label); + elm_object_text_set(obj, chPopupMsg); +} + +static void popup_lang_changed(void *data, Evas_Object *obj, void *event_info) +{ + int index = (int)data; + set_popup_message(obj, index); +} + static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb ime_setting_list_ok_callback, popup_cancel_cb ime_setting_list_cancel_callback) { int index = (int)reinterpret_cast(data); @@ -274,25 +289,22 @@ static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb Evas_Object *top_widget = elm_object_top_widget_get(obj); Evas_Object *popup = elm_popup_add(top_widget); elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0); - elm_object_part_text_set(popup, "title,text", IM_SETTING_LIST_TURNON_KEYBOARD); + elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, IM_SETTING_LIST_TURNON_KEYBOARD); + evas_object_smart_callback_add(popup, "language,changed", popup_lang_changed, (void *)index); - char chFormatMsg[255] = {'\0'}; - char chPopupMsg[255] = {'\0'}; - snprintf(chFormatMsg, sizeof(chFormatMsg), "%s", IM_SETTING_LIST_POPUP_TEXT); - snprintf(chPopupMsg, sizeof(chPopupMsg), chFormatMsg, g_ime_info_list[index].label); - elm_object_text_set(popup, chPopupMsg); + set_popup_message(popup, index); popup_cb_data *cb_data = new popup_cb_data; cb_data->popup = popup; cb_data->data = data; Evas_Object *btn_cancel = elm_button_add(popup); - elm_object_text_set(btn_cancel, IM_SETTING_LIST_POPUP_CANCEL); + elm_object_domain_translatable_text_set(btn_cancel, PACKAGE, IM_SETTING_LIST_POPUP_CANCEL); elm_object_part_content_set(popup, "button1", btn_cancel); evas_object_smart_callback_add(btn_cancel, "clicked", ime_setting_list_cancel_callback, cb_data); Evas_Object *btn_ok = elm_button_add(popup); - elm_object_text_set(btn_ok, IM_SETTING_LIST_TURNON); + elm_object_domain_translatable_text_set(btn_ok, PACKAGE, IM_SETTING_LIST_TURNON); elm_object_part_content_set(popup, "button2", btn_ok); evas_object_smart_callback_add(btn_ok, "clicked", ime_setting_list_ok_callback, cb_data); @@ -463,6 +475,17 @@ static Evas_Object *im_setting_list_naviframe_create(Evas_Object* parent) return naviframe; } +static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info) +{ + /* Reload ime list for getting translated IME name */ + im_setting_list_load_ime_info(); + + /* Set translated active IME name */ + snprintf(item_text[0].sub_text, sizeof(item_text[0].sub_text), "%s", g_ime_info_list[g_active_ime_index].label); + + elm_genlist_realized_items_update(obj); +} + static Evas_Object *im_setting_list_genlist_create(appdata *ad) { Evas_Object *genlist = elm_genlist_add(ad->naviframe); @@ -474,6 +497,7 @@ static Evas_Object *im_setting_list_genlist_create(appdata *ad) ad->main_circle_genlist = eext_circle_object_genlist_add(genlist, ad->circle_surface); eext_rotary_object_event_activated_set(ad->main_circle_genlist, EINA_TRUE); #endif + evas_object_smart_callback_add(genlist, "language,changed", gl_lang_changed, NULL); evas_object_show(genlist); return genlist; } @@ -484,7 +508,7 @@ static char *im_setting_list_genlist_group_label_get(void *data, Evas_Object *ob if (!text) return NULL; if (!strcmp(part, "elm.text")) { - return strdup(text); + return strdup(dgettext(PACKAGE, text)); } return NULL; } @@ -519,7 +543,7 @@ static char *im_setting_list_genlist_keyboard_list_item_label_get(void *data, Ev static char *im_setting_list_genlist_title_label_get(void *data, Evas_Object *obj, const char *part) { if (!strcmp(part, "elm.text")) { - return strdup(IM_SETTING_LIST_TITLE); + return strdup(dgettext(PACKAGE, IM_SETTING_LIST_TITLE)); } return NULL; } @@ -571,14 +595,14 @@ static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj !strcmp(part, "elm.text.main.left") || !strcmp(part, "elm.text.main") || !strcmp(part, "elm.text")) { - return strdup(item_text->main_text); + return strdup(dgettext(PACKAGE, item_text->main_text)); } if (!strcmp(part, "elm.text.sub") || !strcmp(part, "elm.text.sub.left.bottom") || !strcmp(part, "elm.text.multiline") || !strcmp(part, "elm.text.1") || !strcmp(part, "elm.text.2")) { - return strdup(item_text->sub_text); + return strdup(dgettext(PACKAGE, item_text->sub_text)); } return NULL; } @@ -593,7 +617,7 @@ static char *im_setting_list_genlist_item_one_line_label_get(void *data, Evas_Ob !strcmp(part, "elm.text.main") || !strcmp(part, "elm.text") || !strcmp(part, "elm.text.1")) { - return strdup(item_text->main_text); + return strdup(dgettext(PACKAGE, item_text->main_text)); } return NULL; } @@ -720,6 +744,8 @@ static void im_setting_list_add_ime(void *data) { im_setting_list_set_default_keyboard_item_sel_cb, data); + elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE); + #ifdef _WEARABLE if (g_ime_info_list.size() <= 1) { LOGD("The number of IME : %zu\n", g_ime_info_list.size()); @@ -736,6 +762,7 @@ static void im_setting_list_add_ime(void *data) { ELM_GENLIST_ITEM_NONE, im_setting_list_keyboard_setting_item_sel_cb, ad); + elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE); elm_object_item_disabled_set(item, !(g_ime_info_list[g_active_ime_index].has_option)); @@ -750,6 +777,7 @@ static void im_setting_list_add_ime(void *data) { NULL, NULL); elm_genlist_item_select_mode_set(group_header_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + elm_object_item_domain_text_translatable_set(group_header_item, PACKAGE, EINA_TRUE); #endif } @@ -859,6 +887,8 @@ Evas_Object *im_setting_list_list_create(void *data) ad->genlist, item_style); + elm_object_item_domain_text_translatable_set(nf_main_item, PACKAGE, EINA_TRUE); + elm_naviframe_item_title_enabled_set(nf_main_item, EINA_TRUE, EINA_TRUE); elm_naviframe_item_pop_cb_set(nf_main_item, im_setting_list_navi_item_pop_cb, ad); elm_object_content_set(ad->conform, ad->naviframe); diff --git a/im_setting_selector/input_method_setting_selector.cpp b/im_setting_selector/input_method_setting_selector.cpp index b52681a..b9c957f 100644 --- a/im_setting_selector/input_method_setting_selector.cpp +++ b/im_setting_selector/input_method_setting_selector.cpp @@ -89,8 +89,16 @@ app_terminate(void *data) static void ui_app_lang_changed(app_event_info_h event_info, void *user_data) { - LOGD(""); /*APP_EVENT_LANGUAGE_CHANGED*/ + char *lang = NULL; + app_event_get_language(event_info, &lang); + + LOGD("lang : %s", lang); + + if (lang) { + elm_language_set(lang); + free(lang); + } } static void diff --git a/im_setting_selector/input_method_setting_selector_ui.cpp b/im_setting_selector/input_method_setting_selector_ui.cpp index 68c0fc2..a22245d 100644 --- a/im_setting_selector/input_method_setting_selector_ui.cpp +++ b/im_setting_selector/input_method_setting_selector_ui.cpp @@ -25,8 +25,8 @@ #define IM_SETTING_SELECTOR_PACKAGE PACKAGE #define IM_SETTING_SELECTOR_LOCALE_DIR tzplatform_mkpath(TZ_SYS_RO_APP, PACKAGE_NAME"/res/locale") -#define IM_SETTING_SELECTOR_TITLE dgettext(PACKAGE, "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB") -#define IM_SETTING_SELECT_KEYBOARD dgettext(PACKAGE, "IDS_IME_BODY_SELECT_KEYBOARD") +#define IM_SETTING_SELECTOR_TITLE "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB" +#define IM_SETTING_SELECT_KEYBOARD "IDS_IME_BODY_SELECT_KEYBOARD" static std::vector g_ime_info_list; static Elm_Genlist_Item_Class *itc_im_selector = NULL; @@ -382,7 +382,7 @@ Evas_Object *im_setting_selector_popup_create(void *data) ad->popup = elm_popup_add(ad->win); elm_popup_align_set(ad->popup, ELM_NOTIFY_ALIGN_FILL, 1.0); evas_object_smart_callback_add(ad->popup, "block,clicked", im_setting_selector_popup_block_clicked_cb, NULL); - elm_object_part_text_set(ad->popup, "title,text", IM_SETTING_SELECTOR_TITLE); + elm_object_domain_translatable_part_text_set(ad->popup, "title,text", PACKAGE, IM_SETTING_SELECTOR_TITLE); ad->naviframe = im_setting_selector_naviframe_create(ad->win); ad->genlist = im_setting_selector_list_create(data); @@ -399,7 +399,7 @@ Evas_Object *im_setting_selector_popup_create(void *data) if (APP_TYPE_NORMAL == ad->app_type) { Evas_Object *btn = elm_button_add(ad->popup); - elm_object_text_set(btn, IM_SETTING_SELECT_KEYBOARD); + elm_object_domain_translatable_text_set(btn, PACKAGE, IM_SETTING_SELECT_KEYBOARD); elm_object_part_content_set(ad->popup, "button1", btn); evas_object_smart_callback_add(btn, "clicked", im_setting_selector_select_keyboard_cb, ad); } @@ -414,7 +414,7 @@ Evas_Object *im_setting_selector_popup_create(void *data) static char * im_setting_selector_title_text_get(void *data, Evas_Object *obj, const char *part) { - return strdup(IM_SETTING_SELECTOR_TITLE); + return strdup(dgettext(PACKAGE, IM_SETTING_SELECTOR_TITLE)); } static Evas_Object *im_setting_selector_conform_create(Evas_Object *parentWin) @@ -496,7 +496,7 @@ static void im_setting_selector_screen_create(void *data) elm_naviframe_item_pop_cb_set(navi_it, _naviframe_pop_cb, ad); #ifdef _WEARABLE - elm_atspi_accessible_name_set(ad->naviframe, IM_SETTING_SELECTOR_TITLE); + elm_atspi_accessible_name_set(ad->naviframe, dgettext(PACKAGE, IM_SETTING_SELECTOR_TITLE)); #endif } #endif -- 2.7.4