common: Make language filtering smarter
We normalize both the filter string from the user and the language label to disregard case and accents. Then we try to match the language label on its native translation, the current LC_MESSAGES translation and untranslated.
This commit is contained in:
parent
cfa16a070d
commit
864b98e141
1 changed files with 48 additions and 11 deletions
|
@ -33,6 +33,7 @@
|
|||
#include "egg-list-box/egg-list-box.h"
|
||||
|
||||
#include "cc-common-language.h"
|
||||
#include "cc-util.h"
|
||||
|
||||
#define GNOME_DESKTOP_USE_UNSTABLE_API
|
||||
#include <libgnome-desktop/gnome-languages.h>
|
||||
|
@ -138,10 +139,14 @@ language_widget_new (const gchar *locale_id,
|
|||
gboolean is_extra)
|
||||
{
|
||||
gchar *locale_name;
|
||||
gchar *locale_current_name;
|
||||
gchar *locale_untranslated_name;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *check;
|
||||
|
||||
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 = padded_label_new (locale_name, is_extra);
|
||||
|
||||
|
@ -154,11 +159,11 @@ language_widget_new (const gchar *locale_id,
|
|||
|
||||
g_object_set_data (G_OBJECT (widget), "check", check);
|
||||
g_object_set_data_full (G_OBJECT (widget), "locale-id", g_strdup (locale_id), g_free);
|
||||
g_object_set_data_full (G_OBJECT (widget), "locale-name", g_strdup (locale_name), g_free);
|
||||
g_object_set_data_full (G_OBJECT (widget), "locale-name", locale_name, g_free);
|
||||
g_object_set_data_full (G_OBJECT (widget), "locale-current-name", locale_current_name, g_free);
|
||||
g_object_set_data_full (G_OBJECT (widget), "locale-untranslated-name", locale_untranslated_name, g_free);
|
||||
g_object_set_data (G_OBJECT (widget), "is-extra", GUINT_TO_POINTER (is_extra));
|
||||
|
||||
g_free (locale_name);
|
||||
|
||||
return widget;
|
||||
}
|
||||
|
||||
|
@ -234,9 +239,12 @@ language_visible (GtkWidget *child,
|
|||
{
|
||||
GtkDialog *chooser = user_data;
|
||||
CcLanguageChooserPrivate *priv = GET_PRIVATE (chooser);
|
||||
gchar *locale_name;
|
||||
const gchar *filter_contents;
|
||||
gchar *locale_name = NULL;
|
||||
gchar *locale_current_name = NULL;
|
||||
gchar *locale_untranslated_name = NULL;
|
||||
gchar *filter_contents = NULL;
|
||||
gboolean is_extra;
|
||||
gboolean visible;
|
||||
|
||||
if (child == priv->more_item)
|
||||
return !priv->showing_extra;
|
||||
|
@ -246,16 +254,45 @@ language_visible (GtkWidget *child,
|
|||
return TRUE;
|
||||
|
||||
is_extra = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "is-extra"));
|
||||
locale_name = g_object_get_data (G_OBJECT (child), "locale-name");
|
||||
|
||||
filter_contents = gtk_entry_get_text (GTK_ENTRY (priv->filter_entry));
|
||||
if (*filter_contents && strcasestr (locale_name, filter_contents) == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!priv->showing_extra && is_extra)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
filter_contents =
|
||||
cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry)));
|
||||
|
||||
if (!filter_contents)
|
||||
return TRUE;
|
||||
|
||||
visible = FALSE;
|
||||
|
||||
locale_name =
|
||||
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), "locale-name"));
|
||||
if (strstr (locale_name, filter_contents)) {
|
||||
visible = TRUE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
locale_current_name =
|
||||
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), "locale-current-name"));
|
||||
if (strstr (locale_current_name, filter_contents)) {
|
||||
visible = TRUE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
locale_untranslated_name =
|
||||
cc_util_normalize_casefold_and_unaccent (g_object_get_data (G_OBJECT (child), "locale-untranslated-name"));
|
||||
if (strstr (locale_untranslated_name, filter_contents)) {
|
||||
visible = TRUE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
g_free (filter_contents);
|
||||
g_free (locale_untranslated_name);
|
||||
g_free (locale_current_name);
|
||||
g_free (locale_name);
|
||||
return visible;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Reference in a new issue