summaryrefslogtreecommitdiff
path: root/src/session.c
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2011-09-20 10:54:29 +1000
committerRobert Ancell <robert.ancell@canonical.com>2011-09-20 10:54:29 +1000
commit8005ca24b6ca1419171d3a7d7a2c4a74c2d010f1 (patch)
tree06c1c9708ef83f454ec95771e3d180cc18374c9e /src/session.c
parentb34ddd2b987636d41f6a6490f4d9bb66ee2f5a46 (diff)
downloadlightdm-8005ca24b6ca1419171d3a7d7a2c4a74c2d010f1.tar.gz
Set LANG variable based on the user language
Diffstat (limited to 'src/session.c')
-rw-r--r--src/session.c66
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);