diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-languages.c | 40 |
2 files changed, 47 insertions, 0 deletions
@@ -1,5 +1,12 @@ 2008-02-25 Ray Strode <rstrode@redhat.com> + * gui/simple-greeter/gdm-languages.c: + (language_name_is_valid), + (language_name_is_utf8): + new functions to check locale validity + +2008-02-25 Ray Strode <rstrode@redhat.com> + * gui/simple-greeter/gdm-languages.c (chooser_locale_free): plug a small leak diff --git a/gui/simple-greeter/gdm-languages.c b/gui/simple-greeter/gdm-languages.c index 7084ad22..c826e792 100644 --- a/gui/simple-greeter/gdm-languages.c +++ b/gui/simple-greeter/gdm-languages.c @@ -30,6 +30,7 @@ #include <errno.h> #include <dirent.h> #include <locale.h> +#include <langinfo.h> #include <sys/stat.h> #include <glib.h> @@ -314,6 +315,45 @@ nameentcmp (const void *a, const void *b) ((const struct nameent *) b)->name); } +static gboolean +language_name_is_valid (const char *language_name) +{ + char *old_locale; + gboolean is_valid; + + old_locale = g_strdup (setlocale (LC_MESSAGES, NULL)); + is_valid = setlocale (LC_MESSAGES, language_name) != NULL; + setlocale (LC_MESSAGES, old_locale); + g_free (old_locale); + + return is_valid; +} + +static gboolean +language_name_is_utf8 (const char *language_name) +{ + char *old_locale; + char *codeset; + gboolean is_utf8; + + old_locale = g_strdup (setlocale (LC_CTYPE, NULL)); + + if (setlocale (LC_CTYPE, language_name) == NULL) { + g_free (old_locale); + return FALSE; + } + + codeset = normalize_codeset (nl_langinfo (CODESET)); + + is_utf8 = strcmp (codeset, "utf8") == 0; + g_free (codeset); + + setlocale (LC_CTYPE, old_locale); + g_free (old_locale); + + return is_utf8; +} + static void collect_locales_from_archive (void) { |