From ff1184df2eecdc2f1e1fe9b9711fa1423debbd5f Mon Sep 17 00:00:00 2001 From: katpavalli Date: Mon, 1 Jun 2015 17:38:04 +0200 Subject: [PATCH] edje: add ability to change the language on one specific edje object. Summary: Add a new property to edje_object.eo for setting the language on one Edje_Object. Test Plan: Test Code to test this implementation is done as part of efl/src/examples/edje/edje-text.c and efl/src/examples/edje/text.edc edje_cc -md /efl/src/examples/edje/ text.edc && gcc -o edje-text edje-text.c `pkg-config --libs --cflags ecore-evas edje evas ecore eo` ./edje-text 1) Click On the text "Click here" The language gets changed as per the specific edje object. 2) Click on the text object at bottom. "Click here" The system language gets changed and the below two edje objects language are changed globally. Reviewers: cedric, shilpasingh Subscribers: poornima.srinivasan, govi, rajeshps, cedric Differential Revision: https://phab.enlightenment.org/D2559 Signed-off-by: Cedric BAIL --- src/examples/edje/edje-text.c | 77 ++++- src/examples/edje/en_IN/domain_name.mo | Bin 75 -> 201 bytes src/examples/edje/hi_IN/domain_name.mo | Bin 101 -> 260 bytes src/examples/edje/ta_IN/domain_name.mo | Bin 86 -> 281 bytes src/examples/edje/text.edc | 419 +++++++++++++++++++++++-- src/lib/edje/edje_object.eo | 18 ++ src/lib/edje/edje_private.h | 3 + src/lib/edje/edje_text.c | 4 +- src/lib/edje/edje_util.c | 100 ++++-- 9 files changed, 556 insertions(+), 65 deletions(-) diff --git a/src/examples/edje/edje-text.c b/src/examples/edje/edje-text.c index 39ab128655..7fc830c428 100644 --- a/src/examples/edje/edje-text.c +++ b/src/examples/edje/edje-text.c @@ -5,7 +5,7 @@ * buffer one). See stdout/stderr for output. * * @verbatim - * edje_cc -md ~/efl/src/examples/edje/ text.edc && gcc -o edje-text edje-text.c `pkg-config --libs --cflags ecore-evas edje evas ecore` + * edje_cc -md . text.edc && gcc -o edje-text edje-text.c `pkg-config --libs --cflags ecore-evas edje evas ecore eo` * @endverbatim */ @@ -23,9 +23,10 @@ #include #include #include +#include "Eo.h" -#define WIDTH (300) -#define HEIGHT (300) +#define WIDTH (500) +#define HEIGHT (500) static int lang_idx = 0; static const char *lang[] = { @@ -48,6 +49,18 @@ _on_text_change(void *data EINA_UNUSED, Evas_Object *obj, const char *part) static void _on_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char *env; + lang_idx = (lang_idx + 1) % (sizeof (lang) / sizeof (lang[0])); + fprintf(stderr, "Setting lang of this edje object to '%s'\n", lang[lang_idx]); + env = getenv("LANGUAGE"); + setenv("LANGUAGE", lang[lang_idx], 1); + eo_do(o, edje_obj_language_set(lang[lang_idx])); + setenv("LANGUAGE", env, 1); +} + +static void +_on_mouse_down_text(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) { lang_idx = (lang_idx + 1) % (sizeof (lang)/ sizeof (lang[0])); fprintf(stderr, "Setting lang to '%s'\n", lang[lang_idx]); @@ -62,6 +75,9 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED) Evas *evas; Evas_Object *bg; Evas_Object *edje_obj; + Evas_Object *edje_obj_one; + Evas_Object *edje_obj_two; + Evas_Object *edje_obj_three; if (!ecore_evas_init()) return EXIT_FAILURE; @@ -87,23 +103,66 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED) ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE); edje_obj = edje_object_add(evas); - edje_object_file_set(edje_obj, edje_file, "example_group"); - evas_object_move(edje_obj, 20, 20); + evas_object_move(edje_obj, 0, 20); evas_object_resize(edje_obj, WIDTH - 40, HEIGHT - 40); evas_object_show(edje_obj); - - edje_language_set("en_IN"); + setenv("LANGUAGE", "en_IN", 1); + eo_do(edje_obj, edje_obj_language_set("en_IN")); edje_object_text_change_cb_set(edje_obj, _on_text_change, NULL); edje_object_part_text_set(edje_obj, "part_two", "Click here"); - edje_object_part_text_select_allow_set(edje_obj, "part_two", EINA_TRUE); edje_object_part_text_select_all(edje_obj, "part_two"); printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj, "part_two")); edje_object_part_text_select_none(edje_obj, "part_two"); printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj, "part_two")); - evas_object_event_callback_add(edje_obj, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down, NULL); + + edje_obj_one = edje_object_add(evas); + edje_object_file_set(edje_obj_one, edje_file, "example_group1"); + evas_object_move(edje_obj_one, 0, 50); + evas_object_resize(edje_obj_one, WIDTH - 40, HEIGHT - 40); + evas_object_show(edje_obj_one); + eo_do(edje_obj_one, edje_obj_language_set("en_IN")); + edje_object_text_change_cb_set(edje_obj_one, _on_text_change, NULL); + edje_object_part_text_set(edje_obj_one, "part_two", "Click here"); + edje_object_part_text_select_allow_set(edje_obj_one, "part_two", EINA_TRUE); + edje_object_part_text_select_all(edje_obj_one, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_one, "part_two")); + edje_object_part_text_select_none(edje_obj_one, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_one, "part_two")); + evas_object_event_callback_add(edje_obj_one, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down, NULL); + + //Generic Language change + edje_obj_two = edje_object_add(evas); + edje_object_file_set(edje_obj_two, edje_file, "example_group2"); + evas_object_move(edje_obj_two, 0, 250); + evas_object_resize(edje_obj_two, WIDTH - 40, HEIGHT - 40); + evas_object_show(edje_obj_two); + edje_language_set("en_IN"); + edje_object_text_change_cb_set(edje_obj_two, _on_text_change, NULL); + edje_object_part_text_set(edje_obj_two, "part_two", "Click here"); + edje_object_part_text_select_allow_set(edje_obj_two, "part_two", EINA_TRUE); + edje_object_part_text_select_all(edje_obj_two, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_two, "part_two")); + edje_object_part_text_select_none(edje_obj_two, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_two, "part_two")); + evas_object_event_callback_add(edje_obj_two, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down_text, NULL); + + edje_obj_three = edje_object_add(evas); + edje_object_file_set(edje_obj_three, edje_file, "example_group3"); + evas_object_move(edje_obj_three, 0, 350); + evas_object_resize(edje_obj_three, WIDTH - 40, HEIGHT - 40); + evas_object_show(edje_obj_three); + edje_object_text_change_cb_set(edje_obj_three, _on_text_change, NULL); + edje_object_part_text_set(edje_obj_three, "part_two", "Click here"); + edje_object_part_text_select_allow_set(edje_obj_three, "part_two", EINA_TRUE); + edje_object_part_text_select_all(edje_obj_three, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_three, "part_two")); + edje_object_part_text_select_none(edje_obj_three, "part_two"); + printf("selection: %s\n", edje_object_part_text_selection_get(edje_obj_three, "part_two")); + evas_object_event_callback_add(edje_obj_three, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down_text, NULL); + ecore_evas_show(ee); ecore_main_loop_begin(); diff --git a/src/examples/edje/en_IN/domain_name.mo b/src/examples/edje/en_IN/domain_name.mo index f723b0c042e807d2dffd1b91d2f1ade461b47613..0c1b2fcd163e5446dec4b20d6799aa2804254517 100644 GIT binary patch literal 201 zcmca7#4?ou2v~qv28eBdm=%a)fS4VK3xF6TR{`bM0%?9AZiVtengxJ(E)a78@j4&| z$?pVWMj&PeVh~^gVvsq`9*%zQt}YBdK#IY~-_gYrNC!s-hq(GGfW$%_-CY@+GZORC sQ&SjxfK+K>da8nJUV2VuaR!4=equ^yUb>#19z$?taY<^f0!#@50L=v=K>z>% literal 75 zcmca7#4?ou2pEA_28dOFm>Gz5fS4VKEr6H{h#i0!qy`3j{2g69{oEOR@)J`s^V0S7 G^cVovrw7Ua diff --git a/src/examples/edje/hi_IN/domain_name.mo b/src/examples/edje/hi_IN/domain_name.mo index 3abf69472a9550aa304360b2ef031496e20fa0f4..3901b8c2dfb3df3a3604a7b330f9edea192360fb 100644 GIT binary patch literal 260 zcmYMsu?oU45C-6=6>$=r1v@zR30#5=Rj4{t2cZw)=pwiXLUD91!bKcZq>FX2Zz4DN zApVI317H3mcb9kDIS4EVI?#tY#L$2xnA)nmuaPa-LKDnz7gFd!QQkku3e>=?Dwux; zLpceQFG7R}r_vuGqeV1RW7oXRWuOGph3UkU;dEtsF+H%mOi!kQ>CAd>>Ux8E#yVj- d+M-SnciZ;s);rJh(3IP`+|H#;H?;l#6<=HOT2BA~ literal 101 zcmca7#4?ou2pEA_28dOFm>Gz5fS4VKEr1v#<^aSXH89}g@95&`=g#n8$)*QOyB{oB ZsPJIPP9O_NZ2+;B?1Kn&=;`S(000lz8#@31 diff --git a/src/examples/edje/ta_IN/domain_name.mo b/src/examples/edje/ta_IN/domain_name.mo index 9d62babf84cadda2eb1f898c72057409c120f752..bee34852089f28921d64d79127d04fb829d54b4e 100644 GIT binary patch literal 281 zcmca7#4?ou2v~qv28eBdm=%a)fS4VK3xF6TR{`bM0%?9AZUtg>AO>lc2jaazEDFST zfmjuYKLar%5HkZY2rvOL$Q)-6M?ZI07X}|7#o*)b=;8^agCm1OTzwTlVxf-it_%;> zt$VO;--C4Gz5fS4VKEr3`Qh#i0!qy`3j{2g69{oENItlRWpefNWP T^B=6+|6twB2kU$F^z;}2r?L_* diff --git a/src/examples/edje/text.edc b/src/examples/edje/text.edc index 4c0bf30a0d..ed0548d037 100644 --- a/src/examples/edje/text.edc +++ b/src/examples/edje/text.edc @@ -18,20 +18,20 @@ collections { name: "example_group"; max: 500 500; min: 50 50; - translation { - file { - locale: en_IN; - source: domain_name.mo; - } - file { - locale: hi_IN; - source: domain_name.mo; - } - file { - locale: ta_IN; - source: domain_name.mo; - } - } + translation { + file { + locale: en_IN; + source: domain_name.mo; /* Can be either .po file or .mo file */ + } + file { + locale: hi_IN; + source: domain_name.mo; + } + file { + locale: ta_IN; + source: domain_name.mo; + } + } styles { style { name: "textblock_style_en"; @@ -49,7 +49,7 @@ collections { tag: "b" "+ font_weight=Bold"; tag: "tab" "\t"; } - style { + style { name: "textblock_style_hi"; base: "font=Sans font_size=22 color=#00f wrap=word"; tag: "br" "\n"; @@ -66,14 +66,138 @@ collections { min: 50 50; state: "default" 0.0; color: 0 0 255 255; /* blue */ - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 0.5; + rel1.relative: 0.5 0.0; + rel2.relative: 0.5 0.0; text { text : "LOADING"; domain: "domain_name"; font: "arial"; size: 22; min: 1 1; + ellipsis: -1; + } + } + } + part { + name: "part_two"; + type: TEXTBLOCK; + select_mode: EXPLICIT; + source: "sel_group"; + entry_mode: PLAIN; + description { + min: 50 50; + state: "default" 0.0; + rel1.relative: 0.0 0.25; + rel2.relative: 0.5 0.0; + text { + style: "textblock_style_en"; + min: 1 1; + ellipsis: -1; + } + } + description { + inherit: "default" 0.0; + state: "one" 0.0; + text { + style: "textblock_style_hi"; + min: 1 1; + } + } + description { + inherit: "default" 0.0; + state: "two" 0.0; + text { + style: "textblock_style_ta"; + min: 1 1; + } + } + } + } + programs { + program { + signal: "edje,language,hi_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "one", 1.0); + } + } + program { + signal: "edje,language,ta_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "two", 1.0); + } + } + program { + signal: "edje,language,en_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "default", 1.0); + } + } + } + } + group { + name: "example_group1"; + max: 500 500; + min: 50 50; + translation { + file { + locale: en_IN; + source: domain_name.mo; + } + file { + locale: hi_IN; + source: domain_name.mo; + } + file { + locale: ta_IN; + source: domain_name.mo; + } + } + styles { + style { + name: "textblock_style_en1"; + base: "font=Sans font_size=22 color=#f00 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_ta1"; + base: "font=Sans font_size=22 color=#000 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_hi1"; + base: "font=Sans font_size=22 color=#00f wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + } + parts { + part { + name: "part_one"; + type: TEXT; + description { + min: 50 50; + state: "default" 0.0; + color: 0 0 255 255; /* blue */ + rel1.relative: 0.5 0.25; + rel2.relative: 0.5 0.0; + text { + text : "LANG"; + domain: "domain_name"; + font: "arial"; + size: 22; + min: 1 1; + ellipsis: -1; } } } @@ -87,17 +211,18 @@ collections { min: 50 50; state: "default" 0.0; rel1.relative: 0.0 0.5; - rel2.relative: 1.0 1.0; + rel2.relative: 1.0 0.0; text { - style: "textblock_style_en"; + style: "textblock_style_en1"; min: 1 1; + ellipsis: -1; } } description { inherit: "default" 0.0; state: "one" 0.0; text { - style: "textblock_style_hi"; + style: "textblock_style_hi1"; min: 1 1; } } @@ -105,13 +230,13 @@ collections { inherit: "default" 0.0; state: "two" 0.0; text { - style: "textblock_style_ta"; + style: "textblock_style_ta1"; min: 1 1; } } } } - programs { + programs { program { signal: "edje,language,hi_IN"; source: "edje"; @@ -119,14 +244,260 @@ collections { set_state(PART:"part_two", "one", 1.0); } } - program { + program { signal: "edje,language,ta_IN"; source: "edje"; script { set_state(PART:"part_two", "two", 1.0); } } - program { + program { + signal: "edje,language,en_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "default", 1.0); + } + } + } + } + group { + name: "example_group2"; + max: 500 500; + min: 50 50; + translation { + file { + locale: en_IN; + source: domain_name.mo; + } + file { + locale: hi_IN; + source: domain_name.mo; + } + file { + locale: ta_IN; + source: domain_name.mo; + } + } + styles { + style { + name: "textblock_style_en2"; + base: "font=Sans font_size=22 color=#f00 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_ta2"; + base: "font=Sans font_size=22 color=#000 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_hi2"; + base: "font=Sans font_size=22 color=#00f wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + } + parts { + part { + name: "part_one"; + type: TEXT; + description { + min: 50 50; + state: "default" 0.0; + color: 0 0 255 255; /* blue */ + rel1.relative: 0.5 0.25; + rel2.relative: 0.5 0.0; + text { + text : "SYSTEM LANGUAGE"; + domain: "domain_name"; + font: "arial"; + size: 22; + min: 1 1; + ellipsis: -1; + } + } + } + part { + name: "part_two"; + type: TEXTBLOCK; + select_mode: EXPLICIT; + source: "sel_group"; + entry_mode: PLAIN; + description { + min: 50 50; + state: "default" 0.0; + rel1.relative: 0.0 0.5; + rel2.relative: 1.0 0.0; + text { + style: "textblock_style_en2"; + min: 1 1; + ellipsis: -1; + } + } + description { + inherit: "default" 0.0; + state: "one" 0.0; + text { + style: "textblock_style_hi2"; + min: 1 1; + } + } + description { + inherit: "default" 0.0; + state: "two" 0.0; + text { + style: "textblock_style_ta2"; + min: 1 1; + } + } + } + } + programs { + program { + signal: "edje,language,hi_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "one", 1.0); + } + } + program { + signal: "edje,language,ta_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "two", 1.0); + } + } + program { + signal: "edje,language,en_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "default", 1.0); + } + } + } + } + group { + name: "example_group3"; + max: 500 500; + min: 50 50; + translation { + file { + locale: en_IN; + source: domain_name.mo; + } + file { + locale: hi_IN; + source: domain_name.mo; + } + file { + locale: ta_IN; + source: domain_name.mo; + } + } + styles { + style { + name: "textblock_style_en3"; + base: "font=Sans font_size=22 color=#f00 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_ta3"; + base: "font=Sans font_size=22 color=#000 wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + style { + name: "textblock_style_hi3"; + base: "font=Sans font_size=22 color=#00f wrap=word"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } + } + parts { + part { + name: "part_one"; + type: TEXT; + description { + min: 50 50; + state: "default" 0.0; + color: 0 0 255 255; /* blue */ + rel1.relative: 0.5 0.25; + rel2.relative: 0.5 0.0; + text { + text : "CHANGED"; + domain: "domain_name"; + font: "arial"; + size: 22; + min: 1 1; + ellipsis: -1; + } + } + } + part { + name: "part_two"; + type: TEXTBLOCK; + select_mode: EXPLICIT; + source: "sel_group"; + entry_mode: PLAIN; + description { + min: 50 50; + state: "default" 0.0; + rel1.relative: 0.0 0.5; + rel2.relative: 1.0 0.0; + text { + style: "textblock_style_en3"; + min: 1 1; + ellipsis: -1; + } + } + description { + inherit: "default" 0.0; + state: "one" 0.0; + text { + style: "textblock_style_hi3"; + min: 1 1; + } + } + description { + inherit: "default" 0.0; + state: "two" 0.0; + text { + style: "textblock_style_ta3"; + min: 1 1; + } + } + } + } + programs { + program { + signal: "edje,language,hi_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "one", 1.0); + } + } + program { + signal: "edje,language,ta_IN"; + source: "edje"; + script { + set_state(PART:"part_two", "two", 1.0); + } + } + program { signal: "edje,language,en_IN"; source: "edje"; script { diff --git a/src/lib/edje/edje_object.eo b/src/lib/edje/edje_object.eo index 13f702e994..3f76887916 100644 --- a/src/lib/edje/edje_object.eo +++ b/src/lib/edje/edje_object.eo @@ -44,6 +44,24 @@ class Edje.Object (Evas.Smart_Clipped, Efl.File) rtl: bool; /*@ new value of flag EINA_TRUE/EINA_FALSE */ } } + @property language { + set { + /*@ + @brief Set the language for this object. + + @since 1.1.0 */ + } + get { + /*@ + @brief Get the language for this object. + + @return @c language. + @since 1.1.0 */ + } + values { + language: const(char)*; /*@ The language value */ + } + } @property animation { set { /*@ diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index e5507e44fb..d888c36559 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1525,6 +1525,7 @@ struct _Edje const char *path; const char *group; const char *parent; + const char *language; Evas_Object *obj; /* the smart object */ Edje_File *file; /* the file the data comes form */ @@ -2664,6 +2665,8 @@ void _edje_object_orientation_inform(Evas_Object *obj); void _edje_lib_ref(void); void _edje_lib_unref(void); +void _edje_language_signal_emit(Edje *ed, Evas_Object *obj, char *signal); + void _edje_subobj_register(Edje *ed, Evas_Object *ob); void _edje_subobj_unregister(Edje *ed, Evas_Object *ob); diff --git a/src/lib/edje/edje_text.c b/src/lib/edje/edje_text.c index 27a9ca7f5d..a39d52c3b6 100644 --- a/src/lib/edje/edje_text.c +++ b/src/lib/edje/edje_text.c @@ -48,8 +48,10 @@ _set_translated_string(Edje *ed, Edje_Real_Part *ep) snprintf(p, sizeof(p), "%s-%s", ed->file->fid, domain); curlocale = setlocale(LC_ALL, ""); - curpath = bindtextdomain(p, _edje_cache_path); + if (ed->language) + setlocale(LC_ALL, ed->language); + curpath = bindtextdomain(p, _edje_cache_path); text = dgettext(p, text); bindtextdomain(p, curpath); diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index fab492360d..7c93697b9f 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -299,6 +299,71 @@ _edje_util_thaw_edje(Edje *ed) } #endif +void +_edje_language_signal_emit(Edje *ed, Evas_Object *obj, char *signal) +{ + int i; + + for (i = 0; i < (int)ed->table_parts_size; i++) + { + Edje_Real_Part *rp = ed->table_parts[i]; + + if (rp->part->type == EDJE_PART_TYPE_TEXT || + rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) + { + Edje_Part_Description_Text *text; + + text = (Edje_Part_Description_Text *) rp->param1.description; + if (text->text.text.translated) + text->text.text.translated = NULL; + + if (rp->param2) + { + text = (Edje_Part_Description_Text *) rp->param2->description; + if (text->text.text.translated) + text->text.text.translated = NULL; + } + + if (rp->custom) + { + text = (Edje_Part_Description_Text *) rp->custom->description; + if (text->text.text.translated) + text->text.text.translated = NULL; + } + } + } + edje_object_signal_emit(obj, signal, "edje"); + edje_object_calc_force(obj); +} + +EOLIAN void +_edje_object_language_set(Eo *obj, Edje *ed, const char *locale) +{ + const char *lookup; + char *signal; + size_t length; + + lookup = strstr(locale, "."); + length = lookup ? (size_t)(lookup - locale) : strlen(locale); + + eina_stringshare_replace_length(&ed->language, locale, length); + + signal = alloca(length + 15); + snprintf(signal, length + 15, "edje,language,%s", ed->language); + + _edje_language_signal_emit(ed, obj, signal); +} + +EOLIAN const char* +_edje_object_language_get(Eo *obj EINA_UNUSED, Edje *ed) +{ + if (!ed->language) + return _edje_language; + + return ed->language; +} + + EAPI void edje_language_set(const char *locale) { @@ -323,39 +388,12 @@ edje_language_set(const char *locale) EINA_LIST_FOREACH(_edje_edjes, l, obj) { Edje *ed = eo_data_scope_get(obj, EDJE_OBJECT_CLASS); - unsigned int i; - for (i = 0; i < ed->table_parts_size; i++) - { - Edje_Real_Part *rp = ed->table_parts[i]; + if (ed->language) + continue; - if (rp->part->type == EDJE_PART_TYPE_TEXT || - rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) - { - Edje_Part_Description_Text *text; - - text = (Edje_Part_Description_Text *) rp->param1.description; - if (text->text.text.translated) - text->text.text.translated = NULL; - - if (rp->param2) - { - text = (Edje_Part_Description_Text *) rp->param2->description; - if (text->text.text.translated) - text->text.text.translated = NULL; - } - - if (rp->custom) - { - text = (Edje_Part_Description_Text *) rp->custom->description; - if (text->text.text.translated) - text->text.text.translated = NULL; - } - } - } - - edje_object_signal_emit(obj, signal, "edje"); - edje_object_calc_force(obj); + _edje_language_signal_emit(ed, obj, signal); + } }