static GtkWidget * language_widget_new (const gchar *locale_id, const gchar *current_locale_id, gboolean is_extra) { gchar *locale_name; gchar *locale_current_name; gchar *locale_untranslated_name; GtkWidget *row; GtkWidget *check; GtkWidget *box; locale_name = gnome_get_language_from_locale (locale_id, locale_id); locale_current_name = gnome_get_language_from_locale (locale_id, NULL); locale_untranslated_name = gnome_get_language_from_locale (locale_id, "C"); row = gtk_list_box_row_new (); box = padded_label_new (locale_name, is_extra); gtk_container_add (GTK_CONTAINER (row), box); /* We add a check on each side of the label to keep it centered. */ check = gtk_image_new (); gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU); gtk_widget_set_opacity (check, 0.0); g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL); gtk_box_pack_start (GTK_BOX (box), check, FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (box), check, 0); check = gtk_image_new (); gtk_image_set_from_icon_name (GTK_IMAGE (check), "object-select-symbolic", GTK_ICON_SIZE_MENU); gtk_widget_set_opacity (check, 0.0); g_object_set (check, "icon-size", GTK_ICON_SIZE_MENU, NULL); gtk_box_pack_start (GTK_BOX (box), check, FALSE, FALSE, 0); if (g_strcmp0 (locale_id, current_locale_id) == 0) gtk_widget_set_opacity (check, 1.0); g_object_set_data (G_OBJECT (row), "check", check); g_object_set_data_full (G_OBJECT (row), "locale-id", g_strdup (locale_id), g_free); g_object_set_data_full (G_OBJECT (row), "locale-name", locale_name, g_free); g_object_set_data_full (G_OBJECT (row), "locale-current-name", locale_current_name, g_free); g_object_set_data_full (G_OBJECT (row), "locale-untranslated-name", locale_untranslated_name, g_free); g_object_set_data (G_OBJECT (row), "is-extra", GUINT_TO_POINTER (is_extra)); return row; }
int main (int argc, char **argv) { char **locales; guint i; setlocale (LC_ALL, ""); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); if (argc > 1) { guint i; for (i = 1; i < argc; i++) { char *lang, *country, *norm; norm = gnome_normalize_locale (argv[i]); lang = gnome_get_language_from_locale (norm, NULL); country = gnome_get_country_from_locale (norm, NULL); g_print ("%s (norm: %s) == %s -- %s\n", argv[i], norm, lang, country); g_free (norm); g_free (lang); g_free (country); } return 0; } locales = gnome_get_all_locales (); if (locales == NULL) { g_warning ("No locales found"); return 1; } for (i = 0; locales[i] != NULL; i++) { char *lang, *country; lang = gnome_get_language_from_locale (locales[i], NULL); country = gnome_get_country_from_locale (locales[i], NULL); g_print ("%s == %s -- %s\n", locales[i], lang, country); g_free (lang); g_free (country); } g_strfreev (locales); return 0; }
static GtkWidget * language_widget_new (const char *locale_id, gboolean is_extra) { gchar *locale_name, *locale_current_name, *locale_untranslated_name; GtkWidget *checkmark; LanguageWidget *widget = g_new0 (LanguageWidget, 1); locale_name = gnome_get_language_from_locale (locale_id, locale_id); locale_current_name = gnome_get_language_from_locale (locale_id, NULL); locale_untranslated_name = gnome_get_language_from_locale (locale_id, "C"); widget->box = padded_label_new (locale_name); widget->locale_id = g_strdup (locale_id); widget->locale_name = locale_name; widget->locale_current_name = locale_current_name; widget->locale_untranslated_name = locale_untranslated_name; widget->is_extra = is_extra; /* We add a check on each side of the label to keep it centered. */ checkmark = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU); gtk_widget_show (checkmark); gtk_widget_set_opacity (checkmark, 0.0); gtk_box_pack_start (GTK_BOX (widget->box), checkmark, FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (widget->box), checkmark, 0); widget->checkmark = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU); gtk_box_pack_start (GTK_BOX (widget->box), widget->checkmark, FALSE, FALSE, 0); gtk_widget_show (widget->checkmark); g_object_set_data_full (G_OBJECT (widget->box), "language-widget", widget, language_widget_free); return widget->box; }
static void get_locale_infos (GtkWidget *chooser) { CcInputChooserPrivate *priv = GET_PRIVATE (chooser); GHashTable *layouts_with_locale; LocaleInfo *info; gchar **locale_ids; gchar **locale; GList *list, *l; priv->locales = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, locale_info_free); priv->locales_by_language = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_hash_table_destroy); layouts_with_locale = g_hash_table_new (g_str_hash, g_str_equal); locale_ids = gnome_get_all_locales (); for (locale = locale_ids; *locale; ++locale) { gchar *lang_code, *country_code; gchar *simple_locale; gchar *tmp; const gchar *type = NULL; const gchar *id = NULL; if (!gnome_parse_locale (*locale, &lang_code, &country_code, NULL, NULL)) continue; if (country_code != NULL) simple_locale = g_strdup_printf ("%s_%s.UTF-8", lang_code, country_code); else simple_locale = g_strdup_printf ("%s.UTF-8", lang_code); if (g_hash_table_contains (priv->locales, simple_locale)) { g_free (simple_locale); g_free (country_code); g_free (lang_code); continue; } info = g_new0 (LocaleInfo, 1); info->id = simple_locale; /* Take ownership */ info->name = gnome_get_language_from_locale (simple_locale, NULL); info->unaccented_name = cc_util_normalize_casefold_and_unaccent (info->name); tmp = gnome_get_language_from_locale (simple_locale, "C"); info->untranslated_name = cc_util_normalize_casefold_and_unaccent (tmp); g_free (tmp); g_hash_table_replace (priv->locales, simple_locale, info); add_locale_to_table (priv->locales_by_language, lang_code, info); if (gnome_get_input_source_from_locale (simple_locale, &type, &id) && g_str_equal (type, INPUT_SOURCE_TYPE_XKB)) { add_default_row (chooser, info, type, id); g_hash_table_add (layouts_with_locale, (gpointer) id); } /* We don't own these ids */ info->layout_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); info->engine_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); list = gnome_xkb_info_get_layouts_for_language (priv->xkb_info, lang_code); add_rows_to_table (chooser, info, list, INPUT_SOURCE_TYPE_XKB, id); add_ids_to_set (layouts_with_locale, list); g_list_free (list); if (country_code != NULL) { list = gnome_xkb_info_get_layouts_for_country (priv->xkb_info, country_code); add_rows_to_table (chooser, info, list, INPUT_SOURCE_TYPE_XKB, id); add_ids_to_set (layouts_with_locale, list); g_list_free (list); } g_free (lang_code); g_free (country_code); } g_strfreev (locale_ids); /* Add a "Other" locale to hold the remaining input sources */ info = g_new0 (LocaleInfo, 1); info->id = g_strdup (""); info->name = g_strdup (C_("Keyboard Layout", "Other")); info->unaccented_name = g_strdup (""); info->untranslated_name = g_strdup (""); g_hash_table_replace (priv->locales, info->id, info); info->layout_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); info->engine_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); list = gnome_xkb_info_get_all_layouts (priv->xkb_info); for (l = list; l; l = l->next) if (!g_hash_table_contains (layouts_with_locale, l->data)) add_row_other (chooser, INPUT_SOURCE_TYPE_XKB, l->data); g_list_free (list); g_hash_table_destroy (layouts_with_locale); }