46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/*
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Copyright (C) 2010 Robert Ancell.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Author: Robert Ancell <robert.ancell@canonical.com>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * This library is free software; you can redistribute it and/or modify it under
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * the terms of the GNU Lesser General Public License as published by the Free
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Software Foundation; either version 2 or version 3 of the License.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <string.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <locale.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <langinfo.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <stdio.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <glib/gi18n.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "lightdm/language.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_0,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_CODE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_TERRITORY
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *code;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *territory;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} LightDMLanguagePrivate;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncG_DEFINE_TYPE (LightDMLanguage, lightdm_language, G_TYPE_OBJECT);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LANGUAGE, LightDMLanguagePrivate)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean have_languages = FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic GList *languages = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupdate_languages (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *command = "locale -a";
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *stdout_text = NULL, *stderr_text = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gint exit_status;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (have_languages)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_spawn_command_line_sync (command, &stdout_text, &stderr_text, &exit_status, &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to run '%s': %s", command, error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (exit_status != 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to get languages, '%s' returned %d", command, exit_status);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **tokens;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync int i;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync tokens = g_strsplit_set (stdout_text, "\n\r", -1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; tokens[i]; i++)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguage *language;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *code;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync code = g_strchug (tokens[i]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (code[0] == '\0')
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore the non-interesting languages */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (command, "locale -a") == 0 && !g_strrstr (code, ".utf8"))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync languages = g_list_append (languages, language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (tokens);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (stdout_text);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (stderr_text);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync have_languages = TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncis_utf8 (const gchar *code)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_strrstr (code, ".utf8") || g_strrstr (code, ".UTF-8");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* Get a valid locale name that can be passed to setlocale(), so we always can use nl_langinfo() to get language and country names. */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_locale_name (const gchar *code)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *locale = NULL, *language;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync char *at;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync static gchar **avail_locales;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gint i;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (is_utf8 (code))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return (gchar *) code;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if ((at = strchr (code, '@')))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync language = g_strndup (code, at - code);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync language = g_strdup (code);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!avail_locales)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *locales;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_spawn_command_line_sync ("locale -a", &locales, NULL, NULL, &error))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync avail_locales = g_strsplit (g_strchomp (locales), "\n", -1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (locales);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to run 'locale -a': %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (avail_locales)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; avail_locales[i]; i++)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *loc = avail_locales[i];
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_strrstr (loc, ".utf8"))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_str_has_prefix (loc, language))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync locale = g_strdup (loc);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return locale;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_language:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the current language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): The current language or #NULL if no language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncLightDMLanguage *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_language (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const gchar *lang;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync lang = g_getenv ("LANG");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!lang)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = lightdm_get_languages (); link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguage *language = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (lightdm_language_matches (language, lang))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return language;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_languages:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get a list of languages to present to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncGList *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_languages (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync update_languages ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return languages;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_language_get_code:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @language: A #LightDMLanguage
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the code of a language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The code of the language
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_get_code (LightDMLanguage *language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LANGUAGE (language), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_PRIVATE (language)->code;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_language_get_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @language: A #LightDMLanguage
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the name of a language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The name of the language
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_get_name (LightDMLanguage *language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguagePrivate *priv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LANGUAGE (language), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv = GET_PRIVATE (language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!priv->name)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *locale = get_locale_name (priv->code);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (locale)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *current = setlocale (LC_ALL, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_IDENTIFICATION, locale);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_MESSAGES, "");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *language_en = nl_langinfo (_NL_IDENTIFICATION_LANGUAGE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (language_en && strlen (language_en) > 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->name = g_strdup (dgettext ("iso_639_3", language_en));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_ALL, current);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!priv->name)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **tokens = g_strsplit_set (priv->code, "_.@", 2);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->name = g_strdup (tokens[0]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (tokens);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return priv->name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_language_get_territory:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @language: A #LightDMLanguage
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the territory the language is used in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The territory the language is used in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_get_territory (LightDMLanguage *language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguagePrivate *priv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LANGUAGE (language), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv = GET_PRIVATE (language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!priv->territory && strchr (priv->code, '_'))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *locale = get_locale_name (priv->code);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (locale)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *current = setlocale (LC_ALL, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_IDENTIFICATION, locale);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_MESSAGES, "");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *country_en = nl_langinfo (_NL_IDENTIFICATION_TERRITORY);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (country_en && strlen (country_en) > 0 && g_strcmp0 (country_en, "ISO") != 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->territory = g_strdup (dgettext ("iso_3166", country_en));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setlocale (LC_ALL, current);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!priv->territory)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **tokens = g_strsplit_set (priv->code, "_.@", 3);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->territory = g_strdup (tokens[1]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (tokens);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return priv->territory;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_language_matches:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @language: A #LightDMLanguage
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @code: A language code
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Check if a language code matches this language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if the code matches this language.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_matches (LightDMLanguage *language, const gchar *code)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguagePrivate *priv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_LANGUAGE (language), FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (code != NULL, FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv = GET_PRIVATE (language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Handle the fact the UTF-8 is specified both as '.utf8' and '.UTF-8' */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (is_utf8 (priv->code) && is_utf8 (code))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Match the characters before the '.' */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync int i;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; priv->code[i] && code[i] && priv->code[i] == code[i] && code[i] != '.' ; i++);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return priv->code[i] == '.' && code[i] == '.';
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_str_equal (priv->code, code);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_init (LightDMLanguage *language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_set_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguage *self = LIGHTDM_LANGUAGE (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguagePrivate *priv = GET_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id) {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_CODE:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->code = g_strdup (g_value_get_string (value));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_get_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMLanguage *self;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync self = LIGHTDM_LANGUAGE (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id) {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_CODE:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_language_get_code (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_language_get_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case PROP_TERRITORY:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_language_get_territory (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_language_class_init (LightDMLanguageClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMLanguagePrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->set_property = lightdm_language_set_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->get_property = lightdm_language_get_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_CODE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("code",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "code",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Language code",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Name of the language",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync PROP_TERRITORY,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("territory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "territory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Territory the language is from",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}