Eina_Stringshare *id;
Eina_Stringshare *domain;
Eina_Stringshare *string;
+ Eina_Bool preset : 1;
};
/* local subsystem globals */
return NULL;
}
-static Eina_Bool
-_translatable_part_text_set(Eina_List **translate_strings, const char *part, const char *domain, const char *label)
+static Elm_Translate_String_Data *
+_translate_string_data_get(Eina_List *translate_strings, const char *part)
{
- const char *str;
- Eina_List *t, *l;
- Elm_Translate_String_Data *ts = NULL;
+ Elm_Translate_String_Data *ts;
+ Eina_Stringshare *str;
+ Eina_List *l;
+
+ if (eina_list_count(translate_strings) == 0) return NULL;
- t = *translate_strings;
str = eina_stringshare_add(part);
- EINA_LIST_FOREACH(t, l, ts)
+ EINA_LIST_FOREACH(translate_strings, l, ts)
{
if (ts->id == str) break;
else ts = NULL;
}
+ eina_stringshare_del(str);
- if (!ts && !label)
- eina_stringshare_del(str);
- else if (!ts)
- {
- ts = malloc(sizeof(Elm_Translate_String_Data));
- if (!ts) return EINA_FALSE;
+ return ts;
+}
- ts->id = str;
- ts->domain = eina_stringshare_add(domain);
- ts->string = eina_stringshare_add(label);
- t = eina_list_append(t, ts);
- }
- else
+static Elm_Translate_String_Data *
+_part_text_translatable_set(Eina_List **translate_strings, const char *part, Eina_Bool translatable, Eina_Bool preset)
+{
+ Eina_List *t;
+ Elm_Translate_String_Data *ts = NULL;
+ t = *translate_strings;
+ ts = _translate_string_data_get(t, part);
+
+ if (translatable)
{
- if (label)
+ if (!ts)
{
- eina_stringshare_replace(&ts->domain, domain);
- eina_stringshare_replace(&ts->string, label);
+ ts = ELM_NEW(Elm_Translate_String_Data);
+ if (!ts) return NULL;
+
+ ts->id = eina_stringshare_add(part);
+ t = eina_list_append(t, ts);
}
- else
+ if (preset) ts->preset = EINA_TRUE;
+ }
+ //Delete this exist one if this part has been not preset.
+ //see elm_widget_part_text_translatable_set()
+ else if ((preset) || (!ts->preset))
+ {
+ if (ts)
{
- t = eina_list_remove_list(t, l);
+ t = eina_list_remove(t, ts);
eina_stringshare_del(ts->id);
eina_stringshare_del(ts->domain);
eina_stringshare_del(ts->string);
free(ts);
+ ts = NULL;
}
- eina_stringshare_del(str);
}
*translate_strings = t;
- return EINA_TRUE;
+
+ return ts;
}
EAPI void
const char *label)
{
API_ENTRY return;
-
- if (!_translatable_part_text_set(&sd->translate_strings, part, domain,
- label)) return;
+ Elm_Translate_String_Data *ts;
+ if (!label)
+ {
+ _part_text_translatable_set(&sd->translate_strings, part, EINA_FALSE,
+ EINA_FALSE);
+ }
+ else
+ {
+ ts = _part_text_translatable_set(&sd->translate_strings, part,
+ EINA_TRUE, EINA_FALSE);
+ if (!ts) return;
+ if (!ts->string) ts->string = eina_stringshare_add(label);
+ else eina_stringshare_replace(&ts->string, label);
+ if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+ else eina_stringshare_replace(&ts->domain, domain);
#ifdef HAVE_GETTEXT
- if (label && label[0])
- label = dgettext(domain, label);
+ if (label[0]) label = dgettext(domain, label);
#endif
+ }
+
+ sd->on_translate = EINA_TRUE;
elm_widget_text_part_set(obj, part, label);
+ sd->on_translate = EINA_FALSE;
}
-static const char *
-_translatable_part_text_get(Eina_List *translate_strings, const char *part)
+EAPI const char *
+elm_widget_translatable_part_text_get(const Evas_Object *obj,
+ const char *part)
{
+ API_ENTRY return NULL;
Elm_Translate_String_Data *ts;
- const char*ret = NULL, *str;
- Eina_List *l;
+ ts = _translate_string_data_get(sd->translate_strings, part);
+ if (ts) return ts->string;
+ return NULL;
+}
- str = eina_stringshare_add(part);
- EINA_LIST_FOREACH(translate_strings, l, ts)
- if (ts->id == str)
- {
- ret = ts->string;
- break;
- }
- eina_stringshare_del(str);
+EAPI void
+elm_widget_domain_part_text_translatable_set(Evas_Object *obj,
+ const char *part,
+ const char *domain,
+ Eina_Bool translatable)
+{
+ API_ENTRY return;
+ Elm_Translate_String_Data *ts;
+ const char *text;
- return ret;
+ ts = _part_text_translatable_set(&sd->translate_strings, part,
+ translatable, EINA_TRUE);
+ if (!ts) return;
+ if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+ else eina_stringshare_replace(&ts->domain, domain);
+
+ text = elm_widget_text_part_get(obj, part);
+ if (!text || !text[0]) return;
+
+ if (!ts->string) ts->string = eina_stringshare_add(text);
+
+//Try to translate text since we don't know the text is already translated.
+#ifdef HAVE_GETTEXT
+ text = dgettext(domain, text);
+#endif
+ sd->on_translate = EINA_TRUE;
+ elm_widget_text_part_set(obj, part, text);
+ sd->on_translate = EINA_FALSE;
+}
+
+static const char*
+_part_text_translate(Eina_List *translate_strings,
+ const char *part,
+ const char *text)
+{
+ Elm_Translate_String_Data *ts;
+ ts = _translate_string_data_get(translate_strings, part);
+ if (!ts) return text;
+
+ if (!ts->string) ts->string = eina_stringshare_add(text);
+ else eina_stringshare_replace(&ts->string, text);
+#ifdef HAVE_GETTEXT
+ if (text && text[0])
+ text = dgettext(ts->domain, text);
+#endif
+ return text;
}
EAPI const char *
-elm_widget_translatable_part_text_get(const Evas_Object *obj,
- const char *part)
+elm_widget_part_text_translate(Evas_Object *obj, const char *part, const char *text)
{
- API_ENTRY return NULL;
- return _translatable_part_text_get(sd->translate_strings, part);
+ API_ENTRY return text;
+
+ if (!sd->translate_strings || sd->on_translate) return text;
+ return _part_text_translate(sd->translate_strings, part, text);
}
EAPI void
elm_widget_translate(Evas_Object *obj)
{
+ API_ENTRY return;
+
const Eina_List *l;
Evas_Object *child;
-#ifdef HAVE_GETTEXT
- Elm_Translate_String_Data *ts;
-#endif
-
- API_ENTRY return;
EINA_LIST_FOREACH(sd->subobjs, l, child)
elm_widget_translate(child);
sd->api->translate(obj);
#ifdef HAVE_GETTEXT
+ Elm_Translate_String_Data *ts;
EINA_LIST_FOREACH(sd->translate_strings, l, ts)
{
+ if (!ts->string) continue;
const char *s = dgettext(ts->domain, ts->string);
+ sd->on_translate = EINA_TRUE;
elm_widget_text_part_set(obj, ts->id, s);
+ sd->on_translate = EINA_FALSE;
}
#endif
}
const char *label)
{
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+ Elm_Translate_String_Data *ts;
- if (!_translatable_part_text_set(&item->translate_strings, part, domain,
- label)) return;
+ if (!label)
+ {
+ _part_text_translatable_set(&item->translate_strings, part, EINA_FALSE,
+ EINA_FALSE);
+ }
+ else
+ {
+ ts = _part_text_translatable_set(&item->translate_strings, part,
+ EINA_TRUE, EINA_FALSE);
+ if (!ts) return;
+ if (!ts->string) ts->string = eina_stringshare_add(label);
+ else eina_stringshare_replace(&ts->string, label);
+ if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+ else eina_stringshare_replace(&ts->domain, domain);
#ifdef HAVE_GETTEXT
- if (label && label[0])
- label = dgettext(domain, label);
+ if (label[0]) label = dgettext(domain, label);
#endif
+ }
+ item->on_translate = EINA_TRUE;
_elm_widget_item_part_text_set(item, part, label);
+ item->on_translate = EINA_FALSE;
}
EAPI const char *
const char *part)
{
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
- return _translatable_part_text_get(item->translate_strings, part);
+ Elm_Translate_String_Data *ts;
+ ts = _translate_string_data_get(item->translate_strings, part);
+ if (ts) return ts->string;
+ return NULL;
+}
+
+EAPI void
+_elm_widget_item_domain_part_text_translatable_set(Elm_Widget_Item *item,
+ const char *part,
+ const char *domain,
+ Eina_Bool translatable)
+{
+ ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+ Elm_Translate_String_Data *ts;
+ const char *text;
+
+ ts = _part_text_translatable_set(&item->translate_strings, part,
+ translatable, EINA_TRUE);
+ if (!ts) return;
+ if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+ else eina_stringshare_replace(&ts->domain, domain);
+
+ text = _elm_widget_item_part_text_get(item, part);
+ if (!text || !text[0]) return;
+
+ if (!ts->string) ts->string = eina_stringshare_add(text);
+
+//Try to translate text since we don't know the text is already translated.
+#ifdef HAVE_GETTEXT
+ text = dgettext(domain, text);
+#endif
+ item->on_translate = EINA_TRUE;
+ _elm_widget_item_part_text_set(item, part, text);
+ item->on_translate = EINA_FALSE;
}
typedef struct _Elm_Widget_Item_Tooltip Elm_Widget_Item_Tooltip;
return item->content_unset_func((Elm_Object_Item *)item, part);
}
+static const char *
+_elm_widget_item_part_text_translate(Elm_Widget_Item *item,
+ const char *part,
+ const char *label)
+{
+ if (!item->translate_strings || item->on_translate) return label;
+ return _part_text_translate(item->translate_strings, part, label);
+}
+
EAPI void
_elm_widget_item_part_text_set(Elm_Widget_Item *item,
const char *part,
return;
}
+ label = _elm_widget_item_part_text_translate(item, part, label);
item->text_set_func((Elm_Object_Item *)item, part, label);
}
else item->access_info = eina_stringshare_add(txt);
}
+EAPI void
+_elm_widget_item_translate(Elm_Widget_Item *item)
+{
+ ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+
+#ifdef HAVE_GETTEXT
+ Elm_Translate_String_Data *ts;
+ const Eina_List *l;
+ EINA_LIST_FOREACH(item->translate_strings, l, ts)
+ {
+ if (!ts->string) continue;
+ const char *s = dgettext(ts->domain, ts->string);
+ item->on_translate = EINA_TRUE;
+ _elm_widget_item_part_text_set(item, ts->id, s);
+ item->on_translate = EINA_FALSE;
+ }
+#endif
+}
+
/* happy debug functions */
#ifdef ELM_DEBUG
static void
Eina_Bool can_access : 1;
Eina_Bool highlighted : 1;
Eina_Bool highlight_root : 1;
+ Eina_Bool on_translate : 1;
} Elm_Widget_Smart_Data;
/**
Eina_Bool disabled : 1;
Eina_Bool on_deletion : 1;
+ Eina_Bool on_translate : 1;
};
struct _Elm_Object_Item
EAPI const char *elm_widget_text_part_get(const Evas_Object *obj, const char *part);
EAPI void elm_widget_domain_translatable_part_text_set(Evas_Object *obj, const char *part, const char *domain, const char *text);
EAPI const char *elm_widget_translatable_part_text_get(const Evas_Object *obj, const char *part);
+EAPI void elm_widget_domain_part_text_translatable_set(Evas_Object *obj, const char *part, const char *domain, Eina_Bool translatable);
+EAPI const char * elm_widget_part_text_translate(Evas_Object *obj, const char *part, const char *text);
EAPI void elm_widget_content_part_set(Evas_Object *obj, const char *part, Evas_Object *content);
EAPI Evas_Object *elm_widget_content_part_get(const Evas_Object *obj, const char *part);
EAPI Evas_Object *elm_widget_content_part_unset(Evas_Object *obj, const char *part);
EAPI void _elm_widget_item_domain_translatable_part_text_set(Elm_Widget_Item *item, const char *part, const char *domain, const char *label);
EAPI const char * _elm_widget_item_translatable_part_text_get(const Elm_Widget_Item *item, const char *part);
EAPI void _elm_widget_item_translate(Elm_Widget_Item *item);
+EAPI void _elm_widget_item_domain_part_text_translatable_set(Elm_Widget_Item *item, const char *part, const char *domain, Eina_Bool translatable);
/**
* Function to operate on a given widget's scrollabe children when necessary.
#define elm_widget_item_del_pre_hook_set(item, func) \
_elm_widget_item_del_pre_hook_set((Elm_Widget_Item *)item, (Elm_Widget_Del_Pre_Cb)func)
+/**
+ * Convenience function to query del pre hook.
+ * @see _elm_widget_item_del_pre_hook_set()
+ */
+#define elm_widget_item_translate(item) \
+ _elm_widget_item_translate((Elm_Widget_Item *)item)
+
+
#define ELM_WIDGET_CHECK_OR_RETURN(obj, ...) \
do { \
if (!obj || !evas_object_smart_data_get(obj)) \