[virt-tools-list] [libosinfo v4 2/3] Load localized values for entity params

Zeeshan Ali (Khattak) zeeshanak at gnome.org
Fri Oct 26 02:20:40 UTC 2012


From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>

Attempt to use the localized values of entity params if available before
using the non-localized values.

This does not yet include custom (ones starting with 'x-') params as I
haven't yet figured the right xpath magic to (cleanly) achieve that.
Suggestions welcome!
---
 osinfo/osinfo_loader.c | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 3642a61..ae90637 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -223,14 +223,35 @@ static void osinfo_loader_entity(OsinfoLoader *loader,
                                  GError **err)
 {
     int i = 0;
+    const gchar * const *langs = g_get_language_names ();
 
     /* Standard well-known keys first, allow single value only */
-    for (i = 0 ; keys[i] != NULL ; i++) {
-        gchar *xpath = g_strdup_printf("string(./%s)", keys[i]);
-        gchar *value = osinfo_loader_string(xpath, ctxt, err);
-        g_free(xpath);
-        if (error_is_set(err))
-            return;
+    for (i = 0 ; keys[i] != NULL; i++) {
+        gchar *value = NULL;
+        gchar *xpath;
+        int j;
+
+        /* We are guaranteed to have at least the default "C" locale and we
+         * want to ignore that, hence the NULL check on index 'j + 1'.
+         */
+        for (j = 0; langs[j + 1] != NULL; j++) {
+            xpath = g_strdup_printf("string(./%s[lang('%s')])", keys[i], langs[j]);
+            value = osinfo_loader_string(xpath, ctxt, err);
+            g_free(xpath);
+            if (error_is_set(err))
+                return;
+
+            if (value != NULL)
+                break;
+        }
+
+        if (value == NULL) {
+            xpath = g_strdup_printf("string(./%s)", keys[i]);
+            value = osinfo_loader_string(xpath, ctxt, err);
+            g_free(xpath);
+            if (error_is_set(err))
+                return;
+        }
 
         if (value) {
             osinfo_entity_set_param(entity, keys[i], value);
-- 
1.7.12.1




More information about the virt-tools-list mailing list