diff --git a/src/lib/elementary/elm_main.c b/src/lib/elementary/elm_main.c index eaafac4ca0..528604cd18 100644 --- a/src/lib/elementary/elm_main.c +++ b/src/lib/elementary/elm_main.c @@ -1180,6 +1180,7 @@ EAPI void elm_language_set(const char *lang) { setlocale(LC_ALL, lang); + evas_language_reinit(); _elm_win_translate(); edje_language_set(lang); } diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h index cf6fb1bbf9..d44644b92f 100644 --- a/src/lib/evas/Evas_Common.h +++ b/src/lib/evas/Evas_Common.h @@ -5115,6 +5115,16 @@ EAPI int evas_string_char_prev_get(const char *str, int pos, int *decoded) EINA */ EAPI int evas_string_char_len_get(const char *str) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1); +/** + * Reinitialize language from the environment. + * + * The locale can change while a process is running. This call tells evas to + * reload the locale from the environment like it does on start. + * @ingroup Evas_Utils + * @since 1.18 + */ +EAPI void evas_language_reinit(void); + /** * @defgroup Evas_Keys Key Input Functions * diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 38e901a957..87061b6be2 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -705,4 +705,10 @@ evas_ector_get(Evas_Public_Data *e) return e->engine.ector; } +EAPI void +evas_language_reinit(void) +{ + evas_common_language_reinit(); +} + #include "canvas/evas_canvas.eo.c" diff --git a/src/lib/evas/common/language/evas_language_utils.c b/src/lib/evas/common/language/evas_language_utils.c index 19638d528d..f8b38b6abd 100644 --- a/src/lib/evas/common/language/evas_language_utils.c +++ b/src/lib/evas/common/language/evas_language_utils.c @@ -45,6 +45,9 @@ #define EXPLICIT_SCRIPT(script) \ (((script) != EVAS_SCRIPT_UNKNOWN) && ((script) > EVAS_SCRIPT_INHERITED)) +static char lang[6]; /* FIXME: Maximum length I know about */ +static char lang_full[32]; + static Evas_Script_Type _evas_common_language_char_script_search(Eina_Unicode unicode) { @@ -135,7 +138,6 @@ evas_common_language_script_type_get(const Eina_Unicode *str, size_t len) const char * evas_common_language_from_locale_get(void) { - static char lang[6]; /* FIXME: Maximum length I know about */ if (*lang) return lang; const char *locale; @@ -163,8 +165,7 @@ evas_common_language_from_locale_get(void) const char * evas_common_language_from_locale_full_get(void) { - static char lang[32]; - if (*lang) return lang; + if (*lang_full) return lang_full; const char *locale; locale = setlocale(LC_MESSAGES, NULL); @@ -177,14 +178,20 @@ evas_common_language_from_locale_full_get(void) if ((c == '.') || (c == '@') || (c == ' ')) /* Looks like en_US.UTF8 or de_DE@euro or aa_ER UTF-8*/ break; } - strncpy(lang, locale, i); - lang[i] = '\0'; - return lang; + strncpy(lang_full, locale, i); + lang_full[i] = '\0'; + return lang_full; } return ""; } +void +evas_common_language_reinit(void) +{ + *lang = *lang_full = '\0'; +} + /* * @} */ diff --git a/src/lib/evas/common/language/evas_language_utils.h b/src/lib/evas/common/language/evas_language_utils.h index 5e249121fd..8c7529a572 100644 --- a/src/lib/evas/common/language/evas_language_utils.h +++ b/src/lib/evas/common/language/evas_language_utils.h @@ -131,5 +131,8 @@ evas_common_language_from_locale_get(void); const char * evas_common_language_from_locale_full_get(void); + +void +evas_common_language_reinit(void); #endif diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 1473f99354..9120b228da 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -3911,11 +3911,31 @@ _hyphenation_width_stress(Evas_Object *tb, Evas_Textblock_Cursor *cur) START_TEST(evas_textblock_hyphenation) { START_TB_TEST(); + Evas_Coord w, fw; + + const char *buf = "Automati-"; + evas_object_textblock_text_markup_set(tb, buf); + evas_object_textblock_size_formatted_get(tb, &w, NULL); + evas_object_resize(tb, w, 100); + + setlocale(LC_MESSAGES, "en_US.UTF-8"); + /* Language should be reinitialized after calling setlocale(). */ + evas_language_reinit(); + + buf = "Automatically"; + evas_object_textblock_text_markup_set(tb, buf); + evas_textblock_cursor_format_prepend(cur, ""); + evas_object_textblock_size_formatted_get(tb, &fw, NULL); + ck_assert_int_eq(w, fw); + + /* Restore locale */ + setlocale(LC_MESSAGES, "C"); + evas_language_reinit(); /* SHY-HYPHEN (­) */ /* Note: placing ­ in a ligature is errornuos, so for the sake * of this test, it was removed from the "officia" word */ - const char *buf = + buf = "Lorem ipsum dolor sit amet, cons­ectetur adipisicing elit," " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." " Ut enim ad minim veniam, quis nostrud exer­citation ullamco" @@ -3928,7 +3948,8 @@ START_TEST(evas_textblock_hyphenation) evas_object_textblock_text_markup_set(tb, buf); /* Dictionary + locale fallback (en_US) */ - setlocale(LC_MESSAGES, "en_US.UTF8"); + setlocale(LC_MESSAGES, "en_US.UTF-8"); + evas_language_reinit(); /* Mixture of Dictionary with SHY-HYPHEN */ _hyphenation_width_stress(tb, cur);