mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-22 18:22:11 +01:00
Merge branch 'gkeyfile-fix-c-locale-handling' into 'main'
gkeyfile: Fix C locale handling Closes #3578 See merge request GNOME/glib!4480
This commit is contained in:
commit
8d51095602
@ -119,7 +119,8 @@
|
|||||||
* Key-value pairs generally have the form `key=value`, with the exception
|
* Key-value pairs generally have the form `key=value`, with the exception
|
||||||
* of localized strings, which have the form `key[locale]=value`, with a
|
* of localized strings, which have the form `key[locale]=value`, with a
|
||||||
* locale identifier of the form `lang_COUNTRY@MODIFIER` where `COUNTRY`
|
* locale identifier of the form `lang_COUNTRY@MODIFIER` where `COUNTRY`
|
||||||
* and `MODIFIER` are optional. Space before and after the '=' character
|
* and `MODIFIER` are optional. As a special case, the locale `C` is associated with
|
||||||
|
* the untranslated pair `key=value` (since GLib 2.84). Space before and after the '=' character
|
||||||
* are ignored. Newline, tab, carriage return and backslash characters in
|
* are ignored. Newline, tab, carriage return and backslash characters in
|
||||||
* value are escaped as `\n`, `\t`, `\r`, and `\\\\`, respectively. To preserve
|
* value are escaped as `\n`, `\t`, `\r`, and `\\\\`, respectively. To preserve
|
||||||
* leading spaces in values, these can also be escaped as `\s`.
|
* leading spaces in values, these can also be escaped as `\s`.
|
||||||
@ -2170,6 +2171,8 @@ g_key_file_set_string_list (GKeyFile *key_file,
|
|||||||
* Associates a string value for @key and @locale under @group_name.
|
* Associates a string value for @key and @locale under @group_name.
|
||||||
* If the translation for @key cannot be found then it is created.
|
* If the translation for @key cannot be found then it is created.
|
||||||
*
|
*
|
||||||
|
* If @locale is `C` then the untranslated value is set (since GLib 2.84).
|
||||||
|
*
|
||||||
* Since: 2.6
|
* Since: 2.6
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
@ -2187,7 +2190,7 @@ g_key_file_set_locale_string (GKeyFile *key_file,
|
|||||||
g_return_if_fail (string != NULL);
|
g_return_if_fail (string != NULL);
|
||||||
|
|
||||||
value = g_key_file_parse_string_as_value (key_file, string, FALSE);
|
value = g_key_file_parse_string_as_value (key_file, string, FALSE);
|
||||||
full_key = g_strdup_printf ("%s[%s]", key, locale);
|
full_key = g_strcmp0 (locale, "C") != 0 ? g_strdup_printf ("%s[%s]", key, locale) : g_strdup (key);
|
||||||
g_key_file_set_value (key_file, group_name, full_key, value);
|
g_key_file_set_value (key_file, group_name, full_key, value);
|
||||||
g_free (full_key);
|
g_free (full_key);
|
||||||
g_free (value);
|
g_free (value);
|
||||||
@ -2205,6 +2208,8 @@ g_key_file_set_locale_string (GKeyFile *key_file,
|
|||||||
* translated in the given @locale if available. If @locale is
|
* translated in the given @locale if available. If @locale is
|
||||||
* %NULL then the current locale is assumed.
|
* %NULL then the current locale is assumed.
|
||||||
*
|
*
|
||||||
|
* If @locale is `C` then the untranslated value is returned (since GLib 2.84).
|
||||||
|
*
|
||||||
* If @locale is to be non-%NULL, or if the current locale will change over
|
* If @locale is to be non-%NULL, or if the current locale will change over
|
||||||
* the lifetime of the #GKeyFile, it must be loaded with
|
* the lifetime of the #GKeyFile, it must be loaded with
|
||||||
* %G_KEY_FILE_KEEP_TRANSLATIONS in order to load strings for all locales.
|
* %G_KEY_FILE_KEEP_TRANSLATIONS in order to load strings for all locales.
|
||||||
@ -2253,6 +2258,9 @@ g_key_file_get_locale_string (GKeyFile *key_file,
|
|||||||
|
|
||||||
for (i = 0; languages[i]; i++)
|
for (i = 0; languages[i]; i++)
|
||||||
{
|
{
|
||||||
|
if (g_strcmp0 (languages[i], "C") == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
|
candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
|
||||||
|
|
||||||
translated_value = g_key_file_get_string (key_file,
|
translated_value = g_key_file_get_string (key_file,
|
||||||
@ -2330,6 +2338,9 @@ g_key_file_get_locale_for_key (GKeyFile *key_file,
|
|||||||
{
|
{
|
||||||
gchar *candidate_key, *translated_value;
|
gchar *candidate_key, *translated_value;
|
||||||
|
|
||||||
|
if (g_strcmp0 (languages[i], "C") == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
|
candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
|
||||||
translated_value = g_key_file_get_string (key_file, group_name, candidate_key, NULL);
|
translated_value = g_key_file_get_string (key_file, group_name, candidate_key, NULL);
|
||||||
g_free (translated_value);
|
g_free (translated_value);
|
||||||
@ -2359,6 +2370,8 @@ g_key_file_get_locale_for_key (GKeyFile *key_file,
|
|||||||
* translated in the given @locale if available. If @locale is
|
* translated in the given @locale if available. If @locale is
|
||||||
* %NULL then the current locale is assumed.
|
* %NULL then the current locale is assumed.
|
||||||
*
|
*
|
||||||
|
* If @locale is `C` then the untranslated value is returned (since GLib 2.84).
|
||||||
|
*
|
||||||
* If @locale is to be non-%NULL, or if the current locale will change over
|
* If @locale is to be non-%NULL, or if the current locale will change over
|
||||||
* the lifetime of the #GKeyFile, it must be loaded with
|
* the lifetime of the #GKeyFile, it must be loaded with
|
||||||
* %G_KEY_FILE_KEEP_TRANSLATIONS in order to load strings for all locales.
|
* %G_KEY_FILE_KEEP_TRANSLATIONS in order to load strings for all locales.
|
||||||
@ -2438,6 +2451,8 @@ g_key_file_get_locale_string_list (GKeyFile *key_file,
|
|||||||
* @group_name. If the translation for @key cannot be found then
|
* @group_name. If the translation for @key cannot be found then
|
||||||
* it is created.
|
* it is created.
|
||||||
*
|
*
|
||||||
|
* If @locale is `C` then the untranslated value is set (since GLib 2.84).
|
||||||
|
*
|
||||||
* Since: 2.6
|
* Since: 2.6
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
@ -2469,7 +2484,7 @@ g_key_file_set_locale_string_list (GKeyFile *key_file,
|
|||||||
g_free (value);
|
g_free (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
full_key = g_strdup_printf ("%s[%s]", key, locale);
|
full_key = g_strcmp0 (locale, "C") != 0 ? g_strdup_printf ("%s[%s]", key, locale) : g_strdup (key);
|
||||||
g_key_file_set_value (key_file, group_name, full_key, value_list->str);
|
g_key_file_set_value (key_file, group_name, full_key, value_list->str);
|
||||||
g_free (full_key);
|
g_free (full_key);
|
||||||
g_string_free (value_list, TRUE);
|
g_string_free (value_list, TRUE);
|
||||||
|
@ -811,6 +811,40 @@ test_locale_string (void)
|
|||||||
|
|
||||||
setlocale (LC_ALL, old_locale);
|
setlocale (LC_ALL, old_locale);
|
||||||
g_free (old_locale);
|
g_free (old_locale);
|
||||||
|
|
||||||
|
/* test that C locale is handled properly (as gettext does) */
|
||||||
|
|
||||||
|
old_locale = g_strdup (setlocale (LC_ALL, NULL));
|
||||||
|
keyfile = load_data (data, G_KEY_FILE_KEEP_TRANSLATIONS);
|
||||||
|
|
||||||
|
g_key_file_set_locale_string (keyfile, "valid", "key1", "C", "v1_C");
|
||||||
|
check_locale_string_value (keyfile, "valid", "key1", "C", "v1_C");
|
||||||
|
check_string_value (keyfile, "valid", "key1", "v1_C");
|
||||||
|
check_string_locale_value (keyfile, "valid", "key1", "C", "C");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME:
|
||||||
|
* - Tests using setenv() needs to be converted to spawn subprocesses.
|
||||||
|
* - Tests using setlocale() should use uselocale() instead.
|
||||||
|
*/
|
||||||
|
g_setenv ("LANGUAGE", "C:it:de", TRUE);
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
check_locale_string_value (keyfile, "valid", "key1", NULL, "v1_C");
|
||||||
|
check_string_locale_value (keyfile, "valid", "key1", NULL, "C");
|
||||||
|
|
||||||
|
g_setenv ("LANGUAGE", "it:C:de", TRUE);
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
check_locale_string_value (keyfile, "valid", "key1", NULL, "v1_C");
|
||||||
|
check_string_locale_value (keyfile, "valid", "key1", NULL, "C");
|
||||||
|
|
||||||
|
g_setenv ("LANGUAGE", "it:de:C", TRUE);
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
check_locale_string_value (keyfile, "valid", "key1", NULL, "v1-de");
|
||||||
|
check_string_locale_value (keyfile, "valid", "key1", NULL, "de");
|
||||||
|
|
||||||
|
g_key_file_free (keyfile);
|
||||||
|
setlocale (LC_ALL, old_locale);
|
||||||
|
g_free (old_locale);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user