diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2011-09-20 10:54:29 +1000 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2011-09-20 10:54:29 +1000 |
commit | 8005ca24b6ca1419171d3a7d7a2c4a74c2d010f1 (patch) | |
tree | 06c1c9708ef83f454ec95771e3d180cc18374c9e /src/session.c | |
parent | b34ddd2b987636d41f6a6490f4d9bb66ee2f5a46 (diff) | |
download | lightdm-8005ca24b6ca1419171d3a7d7a2c4a74c2d010f1.tar.gz |
Set LANG variable based on the user language
Diffstat (limited to 'src/session.c')
-rw-r--r-- | src/session.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/session.c b/src/session.c index 3360515d..be20cf24 100644 --- a/src/session.c +++ b/src/session.c @@ -151,6 +151,71 @@ session_set_console_kit_parameter (Session *session, const gchar *name, GVariant g_hash_table_insert (session->priv->console_kit_parameters, g_strdup (name), value); } +/* Set the LANG variable based on the chosen language. This is not a great + * solution, as it will override the language set in PAM (which is where it + * should be set). It's also overly simplistic to set all the locale + * settings based on one language. In the case of Ubuntu these will be + * overridden by setting these variables in ~/.profile */ +static void +set_language (Session *session) +{ + User *user; + const gchar *language; + gchar *language_dot; + gboolean result; + gchar *stdout_text = NULL; + int exit_status; + gboolean found_code = FALSE; + GError *error = NULL; + + user = pam_session_get_user (session->priv->authentication); + language = user_get_language (user); + if (!language) + return; + + language_dot = g_strdup_printf ("%s.", language); + + /* Find a locale that matches the language code */ + result = g_spawn_command_line_sync ("locale -a", &stdout_text, NULL, &exit_status, &error); + if (error) + { + g_warning ("Failed to run 'locale -a': %s", error->message); + g_clear_error (&error); + } + else if (exit_status != 0) + g_warning ("Failed to get languages, locale -a returned %d", exit_status); + else if (result) + { + gchar **tokens; + int i; + + tokens = g_strsplit_set (stdout_text, "\n\r", -1); + for (i = 0; tokens[i]; i++) + { + gchar *code; + + code = g_strchug (tokens[i]); + if (code[0] == '\0') + continue; + + if (strcmp (code, language) == 0 || g_str_has_prefix (code, language_dot)) + { + g_debug ("Using locale %s for language %s", code, language); + found_code = TRUE; + process_set_env (PROCESS (session), "LANG", code); + break; + } + } + + g_strfreev (tokens); + } + g_free (language_dot); + g_free (stdout_text); + + if (!found_code) + g_debug ("Failed to find locale for language %s", language); +} + gboolean session_start (Session *session) { @@ -169,6 +234,7 @@ session_start (Session *session) process_set_env (PROCESS (session), "HOME", user_get_home_directory (user)); process_set_env (PROCESS (session), "SHELL", user_get_shell (user)); set_env_from_authentication (session, session->priv->authentication); + set_language (session); if (session->priv->console_kit_cookie) process_set_env (PROCESS (session), "XDG_SESSION_COOKIE", session->priv->console_kit_cookie); |