app, plug-ins: move the locale processing code in the core.

The colon-separated list used in the plugin originally comes from
gimp_help_get_locales() anyway. My previous code was using different
lists of locales in different places, which was inconsistent.
This commit is contained in:
Jehan 2017-02-01 03:10:13 +01:00
parent 65e8521402
commit 08e8c0e4f8
2 changed files with 84 additions and 58 deletions

View File

@ -591,12 +591,93 @@ gimp_help_get_default_domain_uri (Gimp *gimp)
static gchar *
gimp_help_get_locales (Gimp *gimp)
{
GimpGuiConfig *config = GIMP_GUI_CONFIG (gimp->config);
GimpGuiConfig *config = GIMP_GUI_CONFIG (gimp->config);
gchar **names;
gchar *locales = NULL;
GList *locales_list = NULL;
GList *iter;
gint i;
if (config->help_locales && strlen (config->help_locales))
return g_strdup (config->help_locales);
return g_strjoinv (":", (gchar **) g_get_language_names ());
/* Process locales. */
names = (gchar **) g_get_language_names ();
for (i = 0; names[i]; i++)
{
gchar *locale = g_strdup (names[i]);
gchar *c;
/* We don't care about encoding in context of our help system. */
c = strchr (locale, '.');
if (c)
*c = '\0';
/* We don't care about variants as well. */
c = strchr (locale, '@');
if (c)
*c = '\0';
/* Apparently some systems (i.e. Windows) would return a value as
* IETF language tag, which is a different format from POSIX
* locale; especially it would separate the lang and the region
* with an hyphen instead of an underscore.
* Actually the difference is much deeper, and IETF language tags
* can have extended language subtags, a script subtag, variants,
* moreover using different codes.
* We'd actually need to look into this in details (TODO).
* this dirty hack should do for easy translation at least (like
* "en-GB" -> "en_GB).
* Cf. bug 777754.
*/
c = strchr (locale, '-');
if (c)
*c = '_';
if (locale && *locale &&
! g_list_find_custom (locales_list, locale,
(GCompareFunc) g_strcmp0))
{
gchar *base;
/* Adding this locale. */
locales_list = g_list_prepend (locales_list, locale);
/* Adding the base language as well. */
base = strdup (locale);
c = strchr (base, '_');
if (c)
*c = '\0';
if (base && *base &&
! g_list_find_custom (locales_list, base,
(GCompareFunc) g_strcmp0))
{
locales_list = g_list_prepend (locales_list, base);
}
else
{
g_free (base);
}
}
else
{
/* Avoid duplicates. */
g_free (locale);
}
}
locales_list = g_list_reverse (locales_list);
/* Finally generate the colon-separated value. */
if (locales_list)
{
locales = g_strdup (locales_list->data);
for (iter = locales_list->next; iter; iter = iter->next)
{
gchar *temp = locales;
locales = g_strconcat (temp, ":", iter->data, NULL);
g_free (temp);
}
}
g_list_free_full (locales_list, g_free);
return locales;
}
static GFile *

View File

@ -125,62 +125,7 @@ gimp_help_parse_locales (const gchar *help_locales)
for (p = strchr (s, ':'); p; p = strchr (s, ':'))
{
gchar *new = g_strndup (s, p - s);
gchar *c;
/* After a dot is displayed the optional encoding.
* We don't care in context of our help system.
*/
c = strchr (new, '.');
if (c)
*c = '\0';
/* We don't care about variants as well. */
c = strchr (new, '@');
if (c)
*c = '\0';
/* Apparently some systems (i.e. Windows) would return a value as
* IETF language tag, which is a different format from POSIX
* locale; especially it would separate the lang and the region
* with an hyphen instead of an underscore.
* Actually the difference is much deeper, and IETF language tags
* can have extended language subtags, a script subtag, variants,
* moreover using different codes.
* We'd actually need to look into this in details (TODO).
* this dirty hack should do for easy translation at least (like
* "en-GB" -> "en_GB).
*/
c = strchr (new, '-');
if (c)
*c = '_';
if (new && *new &&
! g_list_find_custom (locales, new,
(GCompareFunc) g_strcmp0))
{
gchar *base;
/* Adding this locale. */
locales = g_list_append (locales, new);
/* Adding the base language as well. */
base = strdup (new);
c = strchr (base, '_');
if (c)
*c = '\0';
if (base && *base &&
! g_list_find_custom (locales, base,
(GCompareFunc) g_strcmp0))
{
locales = g_list_append (locales, base);
}
else
{
g_free (base);
}
}
else
{
g_free (new);
}
locales = g_list_append (locales, new);
s = p + 1;
}