}
gboolean
+_clutter_script_parse_translatable_string (ClutterScript *script,
+ JsonNode *node,
+ char **str)
+{
+ JsonObject *obj;
+ const char *string, *domain;
+ const char *res;
+ gboolean translatable;
+
+ if (!JSON_NODE_HOLDS_OBJECT (node))
+ return FALSE;
+
+ obj = json_node_get_object (node);
+ if (!(json_object_has_member (obj, "translatable") &&
+ json_object_has_member (obj, "string")))
+ return FALSE;
+
+ translatable = json_object_get_boolean_member (obj, "translatable");
+
+ string = json_object_get_string_member (obj, "string");
+ if (string == NULL || *string == '\0')
+ return FALSE;
+
+ if (json_object_has_member (obj, "domain"))
+ domain = json_object_get_string_member (obj, "domain");
+ else
+ domain = NULL;
+
+ if (domain == NULL || *domain == '\0')
+ domain = clutter_script_get_translation_domain (script);
+
+ if (translatable)
+ {
+ if (domain != NULL && *domain != '\0')
+ res = g_dgettext (domain, string);
+ else
+ res = gettext (string);
+ }
+ else
+ res = string;
+
+ if (str != NULL)
+ *str = g_strdup (res);
+
+ return TRUE;
+}
+
+gboolean
_clutter_script_parse_node (ClutterScript *script,
GValue *value,
const gchar *name,
return TRUE;
}
}
+ else if (p_type == G_TYPE_STRING)
+ {
+ char *str = NULL;
+
+ if (_clutter_script_parse_translatable_string (script, node, &str))
+ {
+ g_value_take_string (value, str);
+ return TRUE;
+ }
+ }
}
return FALSE;
PROP_FILENAME_SET,
PROP_FILENAME,
+ PROP_TRANSLATION_DOMAIN,
PROP_LAST
};
gchar **search_paths;
+ gchar *translation_domain;
+
gchar *filename;
guint is_filename : 1;
};
g_strfreev (priv->search_paths);
g_free (priv->filename);
g_hash_table_destroy (priv->states);
+ g_free (priv->translation_domain);
G_OBJECT_CLASS (clutter_script_parent_class)->finalize (gobject);
}
static void
+clutter_script_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterScript *script = CLUTTER_SCRIPT (gobject);
+
+ switch (prop_id)
+ {
+ case PROP_TRANSLATION_DOMAIN:
+ clutter_script_set_translation_domain (script, g_value_get_string (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
clutter_script_get_property (GObject *gobject,
guint prop_id,
GValue *value,
case PROP_FILENAME_SET:
g_value_set_boolean (value, script->priv->is_filename);
break;
+
case PROP_FILENAME:
g_value_set_string (value, script->priv->filename);
break;
+
+ case PROP_TRANSLATION_DOMAIN:
+ g_value_set_string (value, script->priv->translation_domain);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
NULL,
CLUTTER_PARAM_READABLE);
+ /**
+ * ClutterScript:translation-domain:
+ *
+ * The translation domain, used to localize strings marked as translatable
+ * inside a UI definition.
+ *
+ * If #ClutterScript:translation-domain is set to %NULL, #ClutterScript
+ * will use gettext(), otherwise g_dgettext() will be used.
+ *
+ * Since: 1.10
+ */
+ obj_props[PROP_TRANSLATION_DOMAIN] =
+ g_param_spec_string ("translation-domain",
+ P_("Translation Domain"),
+ P_("The translation domain used to localize string"),
+ NULL,
+ CLUTTER_PARAM_READWRITE);
+
+ gobject_class->set_property = clutter_script_set_property;
gobject_class->get_property = clutter_script_get_property;
gobject_class->finalize = clutter_script_finalize;
return g_hash_table_lookup (script->priv->states, name);
}
+/**
+ * clutter_script_set_translation_domain:
+ * @script: a #ClutterScript
+ * @domain: (allow-none): the translation domain, or %NULL
+ *
+ * Sets the translation domain for @script.
+ *
+ * Since: 1.10
+ */
+void
+clutter_script_set_translation_domain (ClutterScript *script,
+ const gchar *domain)
+{
+ g_return_if_fail (CLUTTER_IS_SCRIPT (script));
+
+ if (g_strcmp0 (domain, script->priv->translation_domain) == 0)
+ return;
+
+ g_free (script->priv->translation_domain);
+ script->priv->translation_domain = g_strdup (domain);
+
+ g_object_notify_by_pspec (G_OBJECT (script), obj_props[PROP_TRANSLATION_DOMAIN]);
+}
+
+/**
+ * clutter_script_get_translation_domain:
+ * @script: a #ClutterScript
+ *
+ * Retrieves the translation domain set using
+ * clutter_script_set_translation_domain().
+ *
+ * Return value: (transfer none): the translation domain, if any is set,
+ * or %NULL
+ *
+ * Since: 1.10
+ */
+const gchar *
+clutter_script_get_translation_domain (ClutterScript *script)
+{
+ g_return_val_if_fail (CLUTTER_IS_SCRIPT (script), NULL);
+
+ return script->priv->translation_domain;
+}
+
/*
* _clutter_script_generate_fake_id:
* @script: a #ClutterScript