https://bugs.launchpad.net/lightdm/+bug/790186 --- liblightdm-gobject/language.c.orig 2021-02-15 22:06:28 UTC +++ liblightdm-gobject/language.c @@ -55,6 +55,12 @@ static GList *languages = NULL; static gboolean have_languages = FALSE; static GList *languages = NULL; +static gboolean +is_utf8 (const gchar *code) +{ + return g_strrstr (code, ".utf8") || g_strrstr (code, ".UTF-8"); +} + static void update_languages (void) { @@ -81,7 +87,7 @@ update_languages (void) continue; /* Ignore the non-interesting languages */ - if (strcmp (command, "locale -a") == 0 && !g_strrstr (code, ".utf8")) + if (strcmp (command, "locale -a") == 0 && !is_utf8 (code)) continue; LightDMLanguage *language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL); @@ -92,12 +98,6 @@ update_languages (void) have_languages = TRUE; } -static gboolean -is_utf8 (const gchar *code) -{ - return g_strrstr (code, ".utf8") || g_strrstr (code, ".UTF-8"); -} - /* Get a valid locale name that can be passed to setlocale(), so we always can use nl_langinfo() to get language and country names. */ static gchar * get_locale_name (const gchar *code) @@ -129,7 +129,7 @@ get_locale_name (const gchar *code) for (gint i = 0; avail_locales[i]; i++) { const gchar *loc = avail_locales[i]; - if (!g_strrstr (loc, ".utf8")) + if (!is_utf8 (loc)) continue; if (g_str_has_prefix (loc, language)) return g_strdup (loc); @@ -214,10 +214,16 @@ lightdm_language_get_name (LightDMLanguage *language) if (locale) { const gchar *current = setlocale (LC_ALL, NULL); +#ifdef LC_IDENTIFICATION setlocale (LC_IDENTIFICATION, locale); +#endif setlocale (LC_MESSAGES, ""); +#ifdef _NL_IDENTIFICATION_LANGUAGE const gchar *language_en = nl_langinfo (_NL_IDENTIFICATION_LANGUAGE); +#else + const gchar *language_en = "Unknown"; +#endif if (language_en && strlen (language_en) > 0) priv->name = g_strdup (dgettext ("iso_639_3", language_en)); @@ -254,10 +260,16 @@ lightdm_language_get_territory (LightDMLanguage *langu if (locale) { gchar *current = setlocale (LC_ALL, NULL); +#ifdef LC_IDENTIFICATION setlocale (LC_IDENTIFICATION, locale); +#endif setlocale (LC_MESSAGES, ""); +#ifdef _NL_IDENTIFICATION_TERRITORY gchar *country_en = nl_langinfo (_NL_IDENTIFICATION_TERRITORY); +#else + gchar *country_en = "Unknown"; +#endif if (country_en && strlen (country_en) > 0 && g_strcmp0 (country_en, "ISO") != 0) priv->territory = g_strdup (dgettext ("iso_3166", country_en));