summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libappstream-glib/as-node.c27
-rw-r--r--libappstream-glib/as-node.h2
-rw-r--r--libappstream-glib/as-self-test.c18
3 files changed, 36 insertions, 11 deletions
diff --git a/libappstream-glib/as-node.c b/libappstream-glib/as-node.c
index f5320ea..b1a4f41 100644
--- a/libappstream-glib/as-node.c
+++ b/libappstream-glib/as-node.c
@@ -303,12 +303,17 @@ as_tag_data_get_name (AsNodeData *data)
* as_node_data_set_name:
**/
static void
-as_node_data_set_name (AsNodeData *data, const gchar *name)
+as_node_data_set_name (AsNodeData *data, const gchar *name, AsNodeInsertFlags flags)
{
- /* only store the name if the tag is not recognised */
- data->tag = as_tag_from_string (name);
- if (data->tag == AS_TAG_UNKNOWN)
- data->name = g_strdup (name);
+ if ((flags & AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE) == 0) {
+ /* only store the name if the tag is not recognised */
+ data->tag = as_tag_from_string (name);
+ if (data->tag == AS_TAG_UNKNOWN)
+ data->name = g_strdup (name);
+ } else {
+ /* always store the translated tag */
+ data->name = g_strdup_printf ("_%s", name);
+ }
}
/**
@@ -494,7 +499,7 @@ as_node_start_element_cb (GMarkupParseContext *context,
/* create the new node data */
data = g_slice_new0 (AsNodeData);
- as_node_data_set_name (data, element_name);
+ as_node_data_set_name (data, element_name, AS_NODE_INSERT_FLAG_NONE);
for (i = 0; attribute_names[i] != NULL; i++) {
as_node_attr_insert (data,
attribute_names[i],
@@ -882,7 +887,7 @@ as_node_set_name (GNode *node, const gchar *name)
/* overwrite */
g_free (data->name);
data->name = NULL;
- as_node_data_set_name (data, name);
+ as_node_data_set_name (data, name, AS_NODE_INSERT_FLAG_NONE);
}
/**
@@ -1230,7 +1235,7 @@ as_node_insert (GNode *parent,
va_list args;
data = g_slice_new0 (AsNodeData);
- as_node_data_set_name (data, name);
+ as_node_data_set_name (data, name, insert_flags);
if (cdata != NULL)
data->cdata = g_strdup (cdata);
data->cdata_escaped = insert_flags & AS_NODE_INSERT_FLAG_PRE_ESCAPED;
@@ -1289,7 +1294,7 @@ as_node_insert_localized (GNode *parent,
if (value_c == NULL)
return;
data = g_slice_new0 (AsNodeData);
- as_node_data_set_name (data, name);
+ as_node_data_set_name (data, name, insert_flags);
if (insert_flags & AS_NODE_INSERT_FLAG_NO_MARKUP) {
data->cdata = as_markup_convert_simple (value_c, -1, NULL);
data->cdata_escaped = FALSE;
@@ -1316,7 +1321,7 @@ as_node_insert_localized (GNode *parent,
continue;
data = g_slice_new0 (AsNodeData);
as_node_attr_insert (data, "xml:lang", key);
- as_node_data_set_name (data, name);
+ as_node_data_set_name (data, name, insert_flags);
if (insert_flags & AS_NODE_INSERT_FLAG_NO_MARKUP) {
data->cdata = as_markup_convert_simple (value, -1, NULL);
data->cdata_escaped = FALSE;
@@ -1360,7 +1365,7 @@ as_node_insert_hash (GNode *parent,
key = l->data;
value = g_hash_table_lookup (hash, key);
data = g_slice_new0 (AsNodeData);
- as_node_data_set_name (data, name);
+ as_node_data_set_name (data, name, insert_flags);
data->cdata = g_strdup (!swapped ? value : key);
data->cdata_escaped = insert_flags & AS_NODE_INSERT_FLAG_PRE_ESCAPED;
if (!swapped) {
diff --git a/libappstream-glib/as-node.h b/libappstream-glib/as-node.h
index 092803e..c4ced19 100644
--- a/libappstream-glib/as-node.h
+++ b/libappstream-glib/as-node.h
@@ -77,6 +77,7 @@ typedef enum {
* @AS_NODE_INSERT_FLAG_SWAPPED: The name and key should be swapped
* @AS_NODE_INSERT_FLAG_NO_MARKUP: Preformat the 'description' markup
* @AS_NODE_INSERT_FLAG_DEDUPE_LANG: No xml:lang keys where text matches 'C'
+ * @AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE: Mark the tag name as translatable
*
* The flags to use when inserting a node.
**/
@@ -86,6 +87,7 @@ typedef enum {
AS_NODE_INSERT_FLAG_SWAPPED = 2, /* Since: 0.1.0 */
AS_NODE_INSERT_FLAG_NO_MARKUP = 4, /* Since: 0.1.1 */
AS_NODE_INSERT_FLAG_DEDUPE_LANG = 8, /* Since: 0.1.4 */
+ AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE = 16, /* Since: 0.2.1 */
/*< private >*/
AS_NODE_INSERT_FLAG_LAST
} AsNodeInsertFlags;
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index 15699c1..f8f949a 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -1096,6 +1096,23 @@ as_test_node_localized_wrap_func (void)
}
static void
+as_test_node_intltool_func (void)
+{
+ GNode *n;
+ _cleanup_node_unref_ GNode *root;
+ _cleanup_string_free_ GString *str;
+
+ root = as_node_new ();
+ n = as_node_insert (root, "description", NULL, AS_NODE_INSERT_FLAG_NONE, NULL);
+ as_node_insert (n, "name", "Hello",
+ AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE, NULL);
+
+ /* verify that the tags get prefixed with '_' */
+ str = as_node_to_xml (root, AS_NODE_TO_XML_FLAG_NONE);
+ g_assert_cmpstr (str->str, ==, "<description><_name>Hello</_name></description>");
+}
+
+static void
as_test_node_localized_wrap2_func (void)
{
GError *error = NULL;
@@ -1697,6 +1714,7 @@ main (int argc, char **argv)
g_test_add_func ("/AppStream/node{localized}", as_test_node_localized_func);
g_test_add_func ("/AppStream/node{localized-wrap}", as_test_node_localized_wrap_func);
g_test_add_func ("/AppStream/node{localized-wrap2}", as_test_node_localized_wrap2_func);
+ g_test_add_func ("/AppStream/node{intltool}", as_test_node_intltool_func);
g_test_add_func ("/AppStream/utils", as_test_utils_func);
g_test_add_func ("/AppStream/utils{spdx-token}", as_test_utils_spdx_token_func);
g_test_add_func ("/AppStream/store", as_test_store_func);