common: Add a region mode to the language chooser
In this mode, locales are primarily represented by their region component, instead of their language component.
This commit is contained in:
parent
3f122250e1
commit
9e02793982
6 changed files with 67 additions and 6 deletions
|
@ -208,6 +208,7 @@ typedef struct
|
|||
GtkListStore *store;
|
||||
GHashTable *user_langs;
|
||||
gchar **languages;
|
||||
gboolean regions;
|
||||
gint position;
|
||||
} AsyncLangData;
|
||||
|
||||
|
@ -245,7 +246,12 @@ add_one_language (gpointer d)
|
|||
goto next;
|
||||
}
|
||||
|
||||
language = gdm_get_language_from_name (name, NULL);
|
||||
if (data->regions) {
|
||||
language = gdm_get_region_from_name (name, NULL);
|
||||
}
|
||||
else {
|
||||
language = gdm_get_language_from_name (name, NULL);
|
||||
}
|
||||
if (!language) {
|
||||
g_debug ("Ignoring '%s' as a locale, because we couldn't figure the language name", name);
|
||||
g_free (name);
|
||||
|
@ -280,6 +286,7 @@ add_one_language (gpointer d)
|
|||
|
||||
guint
|
||||
cc_common_language_add_available_languages (GtkListStore *store,
|
||||
gboolean regions,
|
||||
GHashTable *user_langs)
|
||||
{
|
||||
AsyncLangData *data;
|
||||
|
@ -289,6 +296,7 @@ cc_common_language_add_available_languages (GtkListStore *store,
|
|||
data->store = g_object_ref (store);
|
||||
data->user_langs = g_hash_table_ref (user_langs);
|
||||
data->languages = gdm_get_all_language_names ();
|
||||
data->regions = regions;
|
||||
data->position = 0;
|
||||
|
||||
return gdk_threads_add_idle (add_one_language, data);
|
||||
|
@ -521,3 +529,41 @@ cc_common_language_get_initial_languages (void)
|
|||
|
||||
return ht;
|
||||
}
|
||||
|
||||
GHashTable *
|
||||
cc_common_language_get_initial_regions (const gchar *lang)
|
||||
{
|
||||
GHashTable *ht;
|
||||
char *language;
|
||||
gchar **langs;
|
||||
gint i;
|
||||
|
||||
ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||
|
||||
#if 0
|
||||
/* Add some common regions */
|
||||
g_hash_table_insert (ht, g_strdup ("en_US.utf8"), g_strdup (_("United States")));
|
||||
g_hash_table_insert (ht, g_strdup ("de_DE.utf8"), g_strdup (_("Germany")));
|
||||
g_hash_table_insert (ht, g_strdup ("fr_FR.utf8"), g_strdup (_("France")));
|
||||
g_hash_table_insert (ht, g_strdup ("es_ES.utf8"), g_strdup (_("Spain")));
|
||||
g_hash_table_insert (ht, g_strdup ("zh_CN.utf8"), g_strdup (_("China")));
|
||||
#endif
|
||||
|
||||
gdm_parse_language_name (lang, &language, NULL, NULL, NULL);
|
||||
langs = gdm_get_all_language_names ();
|
||||
for (i = 0; langs[i]; i++) {
|
||||
gchar *l, *s;
|
||||
gdm_parse_language_name (langs[i], &l, NULL, NULL, NULL);
|
||||
if (g_strcmp0 (language, l) == 0) {
|
||||
if (!g_hash_table_lookup (ht, langs[i])) {
|
||||
s = gdm_get_region_from_name (langs[i], NULL);
|
||||
g_hash_table_insert (ht, g_strdup (langs[i]), s);
|
||||
}
|
||||
}
|
||||
g_free (l);
|
||||
}
|
||||
g_strfreev (langs);
|
||||
g_free (language);
|
||||
|
||||
return ht;
|
||||
}
|
||||
|
|
|
@ -41,11 +41,13 @@ gboolean cc_common_language_get_iter_for_region (GtkTreeModel *model,
|
|||
const gchar *lang,
|
||||
GtkTreeIter *iter);
|
||||
guint cc_common_language_add_available_languages (GtkListStore *store,
|
||||
gboolean regions,
|
||||
GHashTable *user_langs);
|
||||
gboolean cc_common_language_has_font (const gchar *locale);
|
||||
gchar *cc_common_language_get_current_language (void);
|
||||
|
||||
GHashTable *cc_common_language_get_initial_languages (void);
|
||||
GHashTable *cc_common_language_get_initial_regions (const gchar *lang);
|
||||
|
||||
void cc_common_language_setup_list (GtkWidget *treeview,
|
||||
GHashTable *initial);
|
||||
|
|
|
@ -157,17 +157,20 @@ finish_language_chooser (gpointer user_data)
|
|||
guint timeout;
|
||||
guint async_id;
|
||||
GtkTreeSelection *selection;
|
||||
gboolean regions;
|
||||
|
||||
/* Did we get called after the widget was destroyed? */
|
||||
if (chooser == NULL)
|
||||
return FALSE;
|
||||
|
||||
regions = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (chooser), "regions"));
|
||||
|
||||
list = g_object_get_data (G_OBJECT (chooser), "list");
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
|
||||
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||
user_langs = g_object_get_data (G_OBJECT (chooser), "user-langs");
|
||||
|
||||
async_id = cc_common_language_add_available_languages (GTK_LIST_STORE (model), user_langs);
|
||||
async_id = cc_common_language_add_available_languages (GTK_LIST_STORE (model), regions, user_langs);
|
||||
g_object_set_data_full (G_OBJECT (chooser), "language-async", GUINT_TO_POINTER (async_id), remove_async);
|
||||
|
||||
parent = gtk_window_get_transient_for (GTK_WINDOW (chooser));
|
||||
|
@ -254,7 +257,7 @@ filter_languages (GtkTreeModel *model,
|
|||
}
|
||||
|
||||
GtkWidget *
|
||||
cc_language_chooser_new (GtkWidget *parent)
|
||||
cc_language_chooser_new (GtkWidget *parent, gboolean regions)
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
const char *filename;
|
||||
|
@ -263,6 +266,7 @@ cc_language_chooser_new (GtkWidget *parent)
|
|||
GtkWidget *list;
|
||||
GtkWidget *button;
|
||||
GtkWidget *entry;
|
||||
GtkWidget *widget;
|
||||
GHashTable *user_langs;
|
||||
GdkCursor *cursor;
|
||||
guint timeout;
|
||||
|
@ -281,6 +285,14 @@ cc_language_chooser_new (GtkWidget *parent)
|
|||
|
||||
chooser = (GtkWidget *) gtk_builder_get_object (builder, "dialog");
|
||||
|
||||
if (regions) {
|
||||
widget = (GtkWidget *) gtk_builder_get_object (builder, "title");
|
||||
gtk_label_set_text (GTK_LABEL (widget), _("Select a region"));
|
||||
|
||||
/* communicate the preference to finish_language_chooser() */
|
||||
g_object_set_data (G_OBJECT (chooser), "regions", GINT_TO_POINTER (TRUE));
|
||||
}
|
||||
|
||||
list = (GtkWidget *) gtk_builder_get_object (builder, "language-list");
|
||||
g_object_set_data (G_OBJECT (chooser), "list", list);
|
||||
g_signal_connect (list, "row-activated",
|
||||
|
|
|
@ -28,7 +28,8 @@ G_BEGIN_DECLS
|
|||
|
||||
void cc_add_user_languages (GtkTreeModel *model);
|
||||
|
||||
GtkWidget *cc_language_chooser_new (GtkWidget *parent);
|
||||
GtkWidget *cc_language_chooser_new (GtkWidget *parent,
|
||||
gboolean regions);
|
||||
void cc_language_chooser_clear_filter (GtkWidget *chooser);
|
||||
gchar *cc_language_chooser_get_language (GtkWidget *chooser);
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ add_language (GtkWidget *button, GtkWidget *treeview)
|
|||
toplevel = gtk_widget_get_toplevel (button);
|
||||
chooser = g_object_get_data (G_OBJECT (button), "chooser");
|
||||
if (chooser == NULL) {
|
||||
chooser = cc_language_chooser_new (toplevel);
|
||||
chooser = cc_language_chooser_new (toplevel, FALSE);
|
||||
|
||||
g_signal_connect (chooser, "response",
|
||||
G_CALLBACK (language_response), treeview);
|
||||
|
|
|
@ -720,7 +720,7 @@ language_changed (UmEditableCombo *combo,
|
|||
return;
|
||||
}
|
||||
|
||||
d->language_chooser = cc_language_chooser_new (gtk_widget_get_toplevel (d->main_box));
|
||||
d->language_chooser = cc_language_chooser_new (gtk_widget_get_toplevel (d->main_box), FALSE);
|
||||
|
||||
g_signal_connect (d->language_chooser, "response",
|
||||
G_CALLBACK (language_response), d);
|
||||
|
|
Loading…
Add table
Reference in a new issue