Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
devel:BCI:SLCS:next
glib2
0002-Look-for-translation-of-desktop-entry-stri...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0002-Look-for-translation-of-desktop-entry-strings-via-ge.patch of Package glib2
From 98a984570d0bc8535011c680ef80315f92ea6b56 Mon Sep 17 00:00:00 2001 From: Vincent Untz <vuntz@novell.com> Date: Fri, 23 Feb 2024 11:00:06 +0100 Subject: [PATCH 2/4] Look for translation of desktop entry strings via gettext, part that deals with the openSUSE specific infrastructure (with desktop_translations) --- glib/gkeyfile.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++--- glib/gkeyfile.h | 2 +- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index 8ed904f0b..d7d776584 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -511,6 +511,7 @@ struct _GKeyFile gboolean checked_locales; /* TRUE if @locales has been initialised */ gchar **locales; /* (nullable) */ gchar *gettext_domain; + gchar *file_basename; gint ref_count; /* (atomic) */ }; @@ -638,6 +639,7 @@ g_key_file_init (GKeyFile *key_file) key_file->list_separator = ';'; key_file->flags = 0; key_file->gettext_domain = NULL; + key_file->file_basename = NULL; } static void @@ -664,6 +666,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) { @@ -808,6 +816,39 @@ find_file_in_data_dirs (const gchar *file, 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, @@ -889,6 +930,9 @@ g_key_file_load_from_fd (GKeyFile *key_file, 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; } @@ -945,6 +989,8 @@ g_key_file_load_from_file (GKeyFile *key_file, return FALSE; } + key_file->file_basename = g_path_get_basename (file); + return TRUE; } @@ -1006,6 +1052,9 @@ g_key_file_load_from_data (GKeyFile *key_file, 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; } @@ -1110,6 +1159,9 @@ g_key_file_load_from_dirs (GKeyFile *key_file, } } + if (found_file) + key_file->file_basename = g_path_get_basename (output_path); + if (found_file && full_path) *full_path = output_path; else @@ -2310,14 +2362,40 @@ g_key_file_get_locale_string (GKeyFile *key_file, { gboolean codeset_set; const gchar *translated; - gboolean has_gettext; + gboolean has_gettext = FALSE; - 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); diff --git a/glib/gkeyfile.h b/glib/gkeyfile.h index 7ac48f1e1..ba0a317c5 100644 --- a/glib/gkeyfile.h +++ b/glib/gkeyfile.h @@ -322,7 +322,7 @@ gboolean g_key_file_remove_group (GKeyFile *key_file, #define G_KEY_FILE_DESKTOP_KEY_URL "URL" #define G_KEY_FILE_DESKTOP_KEY_DBUS_ACTIVATABLE "DBusActivatable" #define G_KEY_FILE_DESKTOP_KEY_ACTIONS "Actions" -#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" -- 2.43.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor