diff -up desktop-file-utils-0.19/src/validate.c.localelist desktop-file-utils-0.19/src/validate.c --- desktop-file-utils-0.19/src/validate.c.localelist 2011-12-19 09:58:16.000000000 -0500 +++ desktop-file-utils-0.19/src/validate.c 2011-12-23 15:33:00.667543077 -0500 @@ -2722,12 +2722,41 @@ desktop_file_validate (const char *filen return (!kf.fatal_error); } +static void +fixup_list (GKeyFile *keyfile, + const gchar *filename, + const gchar *key) +{ + char *value; + + value = g_key_file_get_value (keyfile, GROUP_DESKTOP_ENTRY, key, NULL); + if (value) { + int len; + + len = strlen (value); + + if (len > 0 && (value[len - 1] != ';' || + (len > 1 && value[len - 2] == '\\' && + (len < 3 || value[len - 3] != '\\')))) { + char *str; + + g_printerr ("%s: warning: key \"%s\" is a list and does not have a " + "semicolon as trailing character, fixing\n", + filename, key); + + str = g_strconcat (value, ";", NULL); + g_key_file_set_value (keyfile, GROUP_DESKTOP_ENTRY, + key, str); + g_free (str); + } + } +} + /* return FALSE if we were unable to fix the file */ gboolean desktop_file_fixup (GKeyFile *keyfile, const char *filename) { - char *value; unsigned int i; if (g_key_file_has_group (keyfile, GROUP_KDE_DESKTOP_ENTRY)) { @@ -2739,33 +2768,28 @@ desktop_file_fixup (GKeyFile *keyfile, /* Fix lists to have a ';' at the end if they don't */ for (i = 0; i < G_N_ELEMENTS (registered_desktop_keys); i++) { - if (registered_desktop_keys[i].type != DESKTOP_STRING_LIST_TYPE && - registered_desktop_keys[i].type != DESKTOP_REGEXP_LIST_TYPE) - continue; - - value = g_key_file_get_value (keyfile, GROUP_DESKTOP_ENTRY, - registered_desktop_keys[i].name, NULL); - if (value) { - int len; - - len = strlen (value); - - if (len > 0 && (value[len - 1] != ';' || - (len > 1 && value[len - 2] == '\\' && - (len < 3 || value[len - 3] != '\\')))) { - char *str; - - g_printerr ("%s: warning: key \"%s\" is a list and does not have a " - "semicolon as trailing character, fixing\n", - filename, registered_desktop_keys[i].name); - - str = g_strconcat (value, ";", NULL); - g_key_file_set_value (keyfile, GROUP_DESKTOP_ENTRY, - registered_desktop_keys[i].name, str); - g_free (str); + if (registered_desktop_keys[i].type == DESKTOP_STRING_LIST_TYPE || + registered_desktop_keys[i].type == DESKTOP_REGEXP_LIST_TYPE) + fixup_list (keyfile, filename, registered_desktop_keys[i].name); + + if (registered_desktop_keys[i].type == DESKTOP_LOCALESTRING_LIST_TYPE) { + gsize len, keylen; + guint j; + gchar **keys; + + keylen = strlen (registered_desktop_keys[i].name); + len = 0; + keys = g_key_file_get_keys (keyfile, GROUP_DESKTOP_ENTRY, &len, NULL); + for (j = 0; j < len; j++) { + if (g_str_has_prefix (keys[j], registered_desktop_keys[i].name) && + (keys[j][keylen] == '[' || keys[j][keylen] == '\0')) { + fixup_list (keyfile, filename, keys[j]); + } } + g_strfreev (keys); } } return TRUE; } +