Index: glib-2.19.5/glib/gkeyfile.c =================================================================== --- glib-2.19.5.orig/glib/gkeyfile.c +++ glib-2.19.5/glib/gkeyfile.c @@ -84,6 +84,7 @@ struct _GKeyFile gchar **locales; gchar *gettext_domain; + gchar *file_basename; }; typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair; @@ -211,6 +212,7 @@ g_key_file_init (GKeyFile *key_file) key_file->flags = 0; key_file->locales = g_strdupv ((gchar **)g_get_language_names ()); key_file->gettext_domain = NULL; + key_file->file_basename = NULL; } static void @@ -236,6 +238,12 @@ g_key_file_clear (GKeyFile *key_file) key_file->gettext_domain = NULL; } + if (key_file->file_basename) + { + g_free (key_file->file_basename); + key_file->file_basename = NULL; + } + tmp = key_file->groups; while (tmp != NULL) { @@ -375,6 +383,39 @@ find_file_in_data_dirs (const gchar *f return fd; } +static int _g_key_file_default_textdomain_codeset_bound = 0; +#define _G_KEY_FILE_DEFAULT_DOMAIN "desktop_translations" + +static char * +_g_key_file_get_default_gettext_domain (void) +{ + if (!_g_key_file_default_textdomain_codeset_bound) + { + const char *codeset; + + _g_key_file_default_textdomain_codeset_bound = 1; + + codeset = bind_textdomain_codeset (_G_KEY_FILE_DEFAULT_DOMAIN, "UTF-8"); + + if (codeset) + _g_key_file_default_textdomain_codeset_bound |= 1 << 1; + } + + return g_strdup (_G_KEY_FILE_DEFAULT_DOMAIN); +} + +static inline gboolean +_g_key_file_is_default_gettext_domain (const char *domain) +{ + return (domain && strcmp (domain, _G_KEY_FILE_DEFAULT_DOMAIN) == 0); +} + +static inline gboolean +_g_key_file_default_gettext_domain_is_bound (void) +{ + return _g_key_file_default_textdomain_codeset_bound & (1 << 1); +} + static gboolean g_key_file_load_from_fd (GKeyFile *key_file, gint fd, @@ -461,6 +502,9 @@ g_key_file_load_from_fd (GKeyFile G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL); + if (!key_file->gettext_domain) + key_file->gettext_domain = _g_key_file_get_default_gettext_domain (); + return TRUE; } @@ -510,6 +554,8 @@ g_key_file_load_from_file (GKeyFile return FALSE; } + key_file->file_basename = g_path_get_basename (file); + return TRUE; } @@ -572,6 +618,9 @@ g_key_file_load_from_data (GKeyFile G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL); + if (!key_file->gettext_domain) + key_file->gettext_domain = _g_key_file_get_default_gettext_domain (); + return TRUE; } @@ -641,6 +690,9 @@ g_key_file_load_from_dirs (GKeyFile } } + if (found_file) + key_file->file_basename = g_path_get_basename (output_path); + if (found_file && full_path) *full_path = output_path; else @@ -1756,12 +1808,38 @@ g_key_file_get_locale_string (GKeyFile const gchar *translated; gboolean has_gettext; - codeset_set = bind_textdomain_codeset (key_file->gettext_domain, "UTF-8") != NULL; + if (_g_key_file_is_default_gettext_domain (key_file->gettext_domain)) + codeset_set = _g_key_file_default_gettext_domain_is_bound (); + else + codeset_set = bind_textdomain_codeset (key_file->gettext_domain, "UTF-8") != NULL; translated = NULL; - translated = g_dgettext (key_file->gettext_domain, - orig_value); - has_gettext = translated != orig_value; + /* first try to translate with the context */ + if (key_file->file_basename) + { + gchar *context; + gchar *context_value; + + context = g_strdup_printf ("%s(%s)", key, + key_file->file_basename); + context_value = g_strdup_printf ("%s%s%s", + context, ": ", orig_value); + + translated = g_dgettext (key_file->gettext_domain, + context_value); + has_gettext = translated != context_value; + + g_free (context_value); + g_free (context); + } + + /* no translation with the context: try without context */ + if (!has_gettext) + { + translated = g_dgettext (key_file->gettext_domain, + orig_value); + has_gettext = translated != orig_value; + } g_free (orig_value); Index: glib-2.19.5/glib/gkeyfile.h =================================================================== --- glib-2.19.5.orig/glib/gkeyfile.h +++ glib-2.19.5/glib/gkeyfile.h @@ -240,7 +240,7 @@ gboolean g_key_file_remove_group #define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify" #define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass" #define G_KEY_FILE_DESKTOP_KEY_URL "URL" -#define G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN "X-GNOME-Gettext-Domain" +#define G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN "X-SUSE-Gettext-Domain" #define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application" #define G_KEY_FILE_DESKTOP_TYPE_LINK "Link"