/* * This file is part of Cockpit. * * Copyright (C) 2016 Red Hat, Inc. * * Cockpit is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * Cockpit is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Cockpit; If not, see . */ #include "cockpitlocale.h" #include #include gchar * cockpit_locale_from_language (const gchar *value, const gchar *encoding, gchar **shorter) { const gchar *spot; gchar *country = NULL; gchar *lang = NULL; gchar *result = NULL; const gchar *dot; if (value == NULL) value = "C"; dot = "."; if (!encoding) dot = encoding = ""; spot = strchr (value, '-'); if (spot) { country = g_ascii_strup (spot + 1, -1); lang = g_ascii_strdown (value, spot - value); result = g_strconcat (lang, "_", country, dot, encoding, NULL); if (shorter) { *shorter = lang; lang = NULL; } } else { result = g_strconcat (value, dot, encoding, NULL); if (shorter) *shorter = g_strdup (value); } g_free (country); g_free (lang); return result; } /* The most recently set language */ static gchar previous[32] = { '\0' }; void cockpit_locale_set_language (const gchar *value) { const gchar *encoding = NULL; gchar *locale = NULL; if (value == NULL) value = "C"; else encoding = "UTF-8"; if (strlen (value) > sizeof (previous) - 1) { g_printerr ("invalid language: %s\n", value); return; } /* Already set our locale to this language? */ if (g_strcmp0 (value, previous) == 0) return; locale = cockpit_locale_from_language (value, encoding, NULL); g_assert (locale != NULL); if (setlocale (LC_ALL, locale) == NULL) { /* Note we use g_printerr directly, since we want no gettext invocations on this line */ g_printerr ("invalid or unusable locale: %s\n", locale); } else { g_debug ("set bridge locale to: %s", locale); g_setenv ("LANG", locale, TRUE); } strncpy (previous, value, sizeof (previous) - 1); previous[sizeof (previous) - 1] = '\0'; g_free (locale); }