diff --git a/libgnome-desktop/gnome-languages.c b/libgnome-desktop/gnome-languages.c index 2ec97a5..807866f 100644 --- a/libgnome-desktop/gnome-languages.c +++ b/libgnome-desktop/gnome-languages.c @@ -44,8 +44,8 @@ #define __LC_LAST 13 #endif -#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes" -#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale" +#define ISO_CODES_DATADIR "xml/iso-codes" +#define ISO_CODES_LOCALESDIR "locale" #include "default-input-sources.h" @@ -70,6 +70,9 @@ static char * construct_language_name (const char *language, const char *modifier); static gboolean language_name_is_valid (const char *language_name); +static gchar * find_iso_codes_dir (const char *dir); +static gchar * get_iso_codes_datadir (void); +static gchar * get_iso_codes_localesdir (void); static void gnome_locale_free (GnomeLocale *locale) @@ -964,11 +967,15 @@ languages_variant_init (const char *variant) gsize buf_len; char *filename; - bindtextdomain (variant, ISO_CODES_LOCALESDIR); + bindtextdomain (variant, get_iso_codes_localesdir()); bind_textdomain_codeset (variant, "UTF-8"); error = NULL; - filename = g_strdup_printf (ISO_CODES_DATADIR "/%s.xml", variant); + filename = g_strdup_printf (g_build_filename (get_iso_codes_datadir(), + "%s.xml", + NULL), + variant); + res = g_file_get_contents (filename, &buf, &buf_len, @@ -1020,17 +1027,19 @@ territories_init (void) gboolean res; char *buf; gsize buf_len; + gchar *file; if (gnome_territories_map) return; - bindtextdomain ("iso_3166", ISO_CODES_LOCALESDIR); + bindtextdomain ("iso_3166", get_iso_codes_localesdir()); bind_textdomain_codeset ("iso_3166", "UTF-8"); gnome_territories_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); error = NULL; - res = g_file_get_contents (ISO_CODES_DATADIR "/iso_3166.xml", + file = g_build_filename (get_iso_codes_datadir(), "iso_3166.xml", NULL); + res = g_file_get_contents (file, &buf, &buf_len, &error); @@ -1044,20 +1053,17 @@ territories_init (void) res = g_markup_parse_context_parse (ctx, buf, buf_len, &error); if (! res) { - g_warning ("Failed to parse '%s': %s\n", - ISO_CODES_DATADIR "/iso_3166.xml", - error->message); + g_warning ("Failed to parse '%s': %s\n", file, error->message); g_error_free (error); } g_markup_parse_context_free (ctx); g_free (buf); } else { - g_warning ("Failed to load '%s': %s\n", - ISO_CODES_DATADIR "/iso_3166.xml", - error->message); + g_warning ("Failed to load '%s': %s\n", file, error->message); g_error_free (error); } + g_free(file); } /** @@ -1395,3 +1401,36 @@ gnome_get_input_source_from_locale (const char *locale, return dis != NULL; } + +static gchar * +find_iso_codes_dir (const char *dir) +{ + const gchar* const *dirs; + gchar *final_dir; + + dirs = g_get_system_data_dirs (); + + while (dirs[0] != NULL) { + final_dir = g_build_filename(dirs[0], dir, NULL); + if (g_file_test (final_dir, G_FILE_TEST_IS_DIR)) + return final_dir; + dirs++; + } + return g_strdup_printf("%s/share/%s", ISO_CODES_PREFIX, dir); +} + +static gchar * +get_iso_codes_datadir (void) +{ + gchar *datadir; + datadir = find_iso_codes_dir(ISO_CODES_DATADIR); + return datadir; +} + +static gchar * +get_iso_codes_localesdir (void) +{ + gchar *localesdir; + localesdir = find_iso_codes_dir(ISO_CODES_LOCALESDIR); + return localesdir; +}