summaryrefslogtreecommitdiff
path: root/capplets/localization/gnome-localization-properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/localization/gnome-localization-properties.c')
-rw-r--r--capplets/localization/gnome-localization-properties.c1105
1 files changed, 0 insertions, 1105 deletions
diff --git a/capplets/localization/gnome-localization-properties.c b/capplets/localization/gnome-localization-properties.c
deleted file mode 100644
index db2097ad0..000000000
--- a/capplets/localization/gnome-localization-properties.c
+++ /dev/null
@@ -1,1105 +0,0 @@
-/* -*- mode: c; style: linux -*- */
-
-/* gnome-localization-properties.c
- * Copyright (C) 2003 Carlos Perelló Marín
- *
- * Written by: Carlos Perelló Marín <carlos@gnome.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <locale.h>
-#include <string.h>
-#include <gnome.h>
-#include <gconf/gconf-client.h>
-#include <glade/glade.h>
-#include <unicode/uloc.h>
-#include <unicode/udat.h>
-#include <unicode/ucal.h>
-
-#include "capplet-util.h"
-#include "gconf-property-editor.h"
-#include "activate-settings-daemon.h"
-#include "capplet-stock-icons.h"
-
-gboolean our_update;
-gint idx2Select = -1;
-
-#define GCONF_LOCALIZATION_ROOT_KEY "/desktop/gnome/interface"
-
-#define get_selected_languages_list() \
- gconf_client_get_list (gconf_client_get_default (), \
- GCONF_LOCALIZATION_ROOT_KEY "/languages", \
- GCONF_VALUE_STRING, NULL)
-
-#define set_selected_languages_list(list) \
- gconf_client_set_list (gconf_client_get_default (), \
- GCONF_LOCALIZATION_ROOT_KEY "/languages", \
- GCONF_VALUE_STRING, (list), NULL)
-
-#define ICU_STRING_LONG 128
-
-static void fill_region_option_menu (GladeXML *dialog);
-
-static GladeXML *
-create_dialog (void)
-{
- GladeXML *dialog;
-
- dialog = glade_xml_new
- (GNOMECC_DATA_DIR "/interfaces/gnome-localization-properties.glade",
- NULL, NULL);
-
- return dialog;
-}
-
-static void
-enable_disable_move_buttons_cb (GladeXML *dialog)
-{
- GtkWidget *up_button;
- GtkWidget *down_button;
- GtkWidget *tree_view;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean can_move_up;
- gboolean can_move_down;
- int nlangs;
-
- up_button = WID ("language_up_button");
- down_button = WID ("language_down_button");
- tree_view = WID ("languages_treeview");
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
- nlangs = gtk_tree_model_iter_n_children (model, NULL);
-
- can_move_up = FALSE;
- can_move_down = FALSE;
-
- if (gtk_tree_selection_get_selected (selection, NULL, &iter)) {
- GtkTreePath *path =
- gtk_tree_model_get_path (model, &iter);
- if (path != NULL) {
- int *indices = gtk_tree_path_get_indices (path);
- int idx = indices[0];
- can_move_up = idx > 0;
- can_move_down = idx < (nlangs - 1);
- gtk_tree_path_free (path);
- }
- }
- gtk_widget_set_sensitive (up_button, can_move_up);
- gtk_widget_set_sensitive (down_button, can_move_down);
-}
-
-static void
-prepare_selected_languages_tree (GladeXML * dialog)
-{
- GtkListStore *list_store;
- GtkWidget *tree_view;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selection;
-
- list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
- tree_view = WID ("languages_treeview");
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (NULL,
- renderer, "text", 0, NULL);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
- g_signal_connect_swapped (G_OBJECT (selection), "changed",
- G_CALLBACK
- (enable_disable_move_buttons_cb),
- dialog);
-
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view),
- GTK_TREE_MODEL (list_store));
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
-}
-
-static void
-item_toggled_cb (GtkCellRendererToggle *cell,
- gchar *path_str,
- GtkTreeModel *model)
-{
- GtkTreePath *path;
- GtkTreeIter iter;
- gboolean toggle_item;
-
- path = gtk_tree_path_new_from_string (path_str);
-
- /* get toggled iter */
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 0, &toggle_item, -1);
-
- /* do something with the value */
- toggle_item ^= 1;
-
- /* set new value */
- gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 0,
- toggle_item, -1);
-
- /* clean up */
- gtk_tree_path_free (path);
-}
-
-static void
-prepare_available_languages_tree (GladeXML *dialog)
-{
- GtkTreeStore *tree_store;
- GtkWidget *tree_view;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
-
- tree_store = gtk_tree_store_new (4, G_TYPE_BOOLEAN, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_BOOLEAN);
- tree_view = WID ("available_languages_treeview");
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view),
- GTK_TREE_MODEL (tree_store));
-
- /* Toggle Button */
- renderer = gtk_cell_renderer_toggle_new ();
- g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
- g_signal_connect (G_OBJECT (renderer), "toggled",
- G_CALLBACK (item_toggled_cb), tree_store);
- column = gtk_tree_view_column_new_with_attributes (_("Show"),
- renderer, "active", 0, "visible", 3, NULL);
-
- gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
- GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
-
- /* Language tree */
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "xalign", 0.0, NULL);
- column = gtk_tree_view_column_new_with_attributes (_("Language"),
- renderer, "text", 1, NULL);
-
- gtk_tree_view_column_set_sort_column_id (column, 1);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
-
- gtk_tree_view_set_expander_column (GTK_TREE_VIEW (tree_view), column);
-}
-
-static void
-fill_selected_languages_tree (GladeXML * dialog)
-{
- GSList *langs;
- GSList *cur_lang;
- GtkListStore *list_store;
- gchar *locale;
- gchar *plocale;
- gchar *split;
-
- list_store = GTK_LIST_STORE (gtk_tree_view_get_model
- (GTK_TREE_VIEW (WID ("languages_treeview"))));
- gtk_list_store_clear (list_store);
-
- langs = get_selected_languages_list ();
-
- if (langs == NULL) { /* We get the environment preferences */
- locale = g_strdup (setlocale (LC_MESSAGES, NULL));
- plocale = locale;
- while (locale != NULL) {
- split = strchr (locale, ':');
- if (split) {
- *split = '\0';
- split++;
- }
- langs = g_slist_append (langs, locale);
- locale = split;
- }
- g_free (plocale);
-
- if (langs) {
- set_selected_languages_list (langs);
- }
- }
-
- for (cur_lang = langs; cur_lang != NULL; cur_lang = cur_lang->next) {
- GtkTreeIter iter;
- gunichar2 name[ICU_STRING_LONG];
- gchar *name_utf8;
- UErrorCode status;
-
- locale = (char *) cur_lang->data;
- status = U_ZERO_ERROR;
-
- uloc_getDisplayName (locale, locale, name,
- ICU_STRING_LONG, &status);
- /* Change the first letter to uppercase */
- name[0] = g_unichar_toupper (name[0]);
- name_utf8 = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL);
-
- gtk_list_store_append (list_store, &iter);
-
- gtk_list_store_set (list_store, &iter,
- 0, name_utf8 ? name_utf8 : locale,
- 1, locale, -1);
- g_free (name_utf8);
- }
- if (idx2Select != -1) {
- GtkTreeSelection *selection;
- GtkTreePath *path;
-
- selection = gtk_tree_view_get_selection ((GTK_TREE_VIEW
- (WID ("languages_treeview"))));
- path = gtk_tree_path_new_from_indices (idx2Select, -1);
- gtk_tree_selection_select_path (selection, path);
- gtk_tree_path_free (path);
- idx2Select = -1;
- }
- enable_disable_move_buttons_cb (dialog);
-}
-
-static void
-fill_available_languages_tree (GladeXML *dialog)
-{
- GtkTreeStore *tree_store;
- gint32 nlocales;
- gint32 i;
- GSList *langs;
-
- tree_store = GTK_TREE_STORE (gtk_tree_view_get_model
- (GTK_TREE_VIEW (WID ("available_languages_treeview"))));
- gtk_tree_store_clear (tree_store);
-
- nlocales = uloc_countAvailable ();
- langs = get_selected_languages_list ();
-
- for (i = 0; i < nlocales; i++) {
- UErrorCode status;
- const gchar *locale;
- gunichar2 name[ICU_STRING_LONG];
- gchar *name_utf8;
- GtkTreeIter iter;
- GtkTreeIter child_iter;
-
- status = U_ZERO_ERROR;
- locale = uloc_getAvailable (i);
- if (uloc_getVariant (locale, NULL, 0, &status)) {
- continue; /* We don't handle the variant locales */
- }
-
- status = U_ZERO_ERROR;
-
- if (!uloc_getCountry (locale, NULL, 0, &status)) {
-
- uloc_getDisplayLanguage (locale, locale, name,
- ICU_STRING_LONG, &status);
- name[0] = g_unichar_toupper (name[0]);
- name_utf8 = g_utf16_to_utf8 (name, -1,
- NULL, NULL, NULL);
-
- gtk_tree_store_append (tree_store, &iter, NULL);
- if (g_slist_find_custom
- (langs, locale, (GCompareFunc) strcmp)) {
- gtk_tree_store_set (tree_store, &iter,
- 0, TRUE, 1, name_utf8,
- 2, locale, 3, TRUE, -1);
- } else {
- gtk_tree_store_set (tree_store, &iter,
- 0, FALSE, 1, name_utf8,
- 2, locale, 3, TRUE, -1);
- }
- } else {
- status = U_ZERO_ERROR;
-
- uloc_getDisplayCountry (locale, locale, name,
- ICU_STRING_LONG, &status);
- name_utf8 = g_utf16_to_utf8 (name, -1,
- NULL, NULL, NULL);
-
- gtk_tree_store_append (tree_store, &child_iter, &iter);
- if (g_slist_find_custom
- (langs, locale, (GCompareFunc) strcmp)) {
- gtk_tree_store_set (tree_store, &child_iter,
- 0, TRUE, 1, name_utf8,
- 2, locale, 3, TRUE, -1);
- } else {
- gtk_tree_store_set (tree_store, &child_iter,
- 0, FALSE, 1, name_utf8,
- 2, locale, 3, TRUE, -1);
- }
- }
- }
-}
-
-static void
-update_warning_box (GladeXML *dialog)
-{
- GtkWidget *warning;
-
- warning = WID ("warning_hbox");
- gtk_widget_show (warning);
-}
-
-static void
-update_info_box (GladeXML *dialog, const gchar *lang, const gchar *region)
-{
- GtkWidget *info;
- gchar main_lang[5];
- gchar region_lang[5];
- UErrorCode status;
-
- info = WID ("info_hbox");
-
- if (lang == NULL || region == NULL) {
- gtk_widget_show (info);
- return;
- }
- status = U_ZERO_ERROR;
- uloc_getLanguage (lang, main_lang, 5, &status);
- uloc_getLanguage (region, region_lang, 5, &status);
-
- if (strcmp (main_lang, region_lang)) {
- gtk_widget_show (info);
- } else {
- gtk_widget_hide (info);
- }
-
-}
-
-static void
-languages_changed_cb (GConfClient *client, guint cnxn_id,
- GConfEntry *entry, GladeXML *dialog)
-{
- GSList *langs;
- const gchar *region;
-
- if (our_update) {
- our_update = FALSE;
- } else {
- fill_selected_languages_tree (dialog);
- fill_available_languages_tree (dialog);
- }
- langs = gconf_value_get_list (entry->value);
- region = gconf_client_get_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region", NULL);
-
- update_warning_box (dialog);
- update_info_box (dialog, langs->data, region);
-
- fill_region_option_menu (dialog);
-}
-
-static void
-languages_sorted_cb (GtkWidget *widget,
- GdkDragContext *context,
- GladeXML *dialog)
-{
- GSList *old_langs;
- GSList *new_langs;
- GtkWidget *tree_view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean changed, more_rows;
- gchar *code;
- guint len, i;
- const gchar *region;
-
- tree_view = WID ("languages_treeview");
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
-
- old_langs = get_selected_languages_list ();
- new_langs = NULL;
- len = g_slist_length (old_langs);
- changed = FALSE;
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- more_rows = TRUE;
- for (i = 0; i < len && more_rows; i++) {
- gtk_tree_model_get (model, &iter, 1, &code, -1);
- if (strcmp (code, (const gchar *)g_slist_nth_data (old_langs, i))) {
- changed = TRUE;
- }
- new_langs = g_slist_append (new_langs, code);
- more_rows = gtk_tree_model_iter_next (model, &iter);
- }
- if (changed) {
- our_update = TRUE;
- set_selected_languages_list (new_langs);
- enable_disable_move_buttons_cb (dialog);
-
- region = gconf_client_get_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region", NULL);
-
- update_warning_box (dialog);
- update_info_box (dialog, new_langs->data, region);
- }
- }
-}
-
-static void
-change_languages_cb (GtkWidget *button, GladeXML *dialog)
-{
- GtkWidget *chooser;
- GtkWidget *main_capplet;
-
- chooser = WID ("available_languages_dialog");
- main_capplet = WID ("localization_dialog");
-
- gtk_window_set_transient_for (GTK_WINDOW (chooser),
- GTK_WINDOW (main_capplet));
- if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
- GSList *langs;
- GSList *cur_lang;
- GtkWidget *tree_view;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreeIter child_iter;
- gboolean selected, changed;
- gchar *code;
-
- tree_view = WID ("available_languages_treeview");
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
-
- changed = FALSE;
- if (gtk_tree_model_get_iter_first (model, &iter)) {
- langs = get_selected_languages_list ();
- do {
- gtk_tree_model_get (model, &iter,
- 0, &selected, 2, &code, -1);
- cur_lang = g_slist_find_custom (langs,
- code, (GCompareFunc) strcmp);
-
- if (cur_lang && !selected) {
- langs = g_slist_delete_link
- (langs, cur_lang);
- changed = TRUE;
- } else if (!cur_lang && selected) {
- langs = g_slist_append
- (langs, code);
- changed = TRUE;
- } else {
- g_free (code);
- }
- if (gtk_tree_model_iter_children
- (model, &child_iter, &iter)) {
- do {
- gtk_tree_model_get (model,
- &child_iter,
- 0, &selected,
- 2, &code, -1);
- cur_lang = g_slist_find_custom
- (langs, code,
- (GCompareFunc) strcmp);
-
- if (cur_lang && !selected) {
- langs = g_slist_delete_link
- (langs, cur_lang);
- changed = TRUE;
- } else if (!cur_lang && selected) {
- langs = g_slist_append
- (langs, code);
- changed = TRUE;
- } else {
- g_free (code);
- }
- } while (gtk_tree_model_iter_next (model, &child_iter));
- }
- } while (gtk_tree_model_iter_next (model, &iter));
- }
- if (changed) {
- set_selected_languages_list (langs);
- }
- gtk_widget_hide (chooser);
- } else {
- gtk_widget_hide (chooser);
- }
-}
-
-static void
-language_move (GladeXML * dialog, int offset)
-{
- GtkTreeSelection *selection;
- GtkTreeIter siter;
- GtkTreeModel *model;
- GSList *langs;
- GtkTreePath *path;
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW
- (WID ("languages_treeview")));
-
- if (gtk_tree_selection_get_selected (selection, &model, &siter)) {
- path = gtk_tree_model_get_path (model, &siter);
- if (path != NULL) {
- int *indices;
- char *id;
- GSList *node;
-
- id = NULL;
-
- langs = get_selected_languages_list ();
- indices = gtk_tree_path_get_indices (path);
- node = g_slist_nth (langs, indices[0]);
-
- langs = g_slist_remove_link (langs, node);
-
- id = (char *) node->data;
- g_slist_free_1 (node);
-
- langs = g_slist_insert (langs, id, indices[0] + offset);
- idx2Select = indices[0] + offset;
-
- set_selected_languages_list (langs);
- gtk_tree_path_free (path);
- }
- }
-}
-
-static void
-language_up_cb (GtkWidget *button, GladeXML *dialog)
-{
- language_move (dialog, -1);
-}
-
-static void
-language_down_cb (GtkWidget *button, GladeXML *dialog)
-{
- language_move (dialog, +1);
-}
-
-static void
-menu_item_activated_cb (GtkMenuItem *menu_item, GladeXML *dialog)
-{
- const gchar *locale;
-
- locale = g_object_get_data (G_OBJECT (menu_item), "itemId");
- gconf_client_set_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region",
- locale, NULL);
-}
-
-static void
-submenu_selected_cb (GtkMenu *menu, GladeXML *dialog)
-{
- GtkWidget *menu_item;
- GtkWidget *optionmenu;
- const gchar *locale;
-
- optionmenu = WID ("region_optionmenu");
- menu_item = gtk_menu_get_active (menu);
- locale = g_object_get_data (G_OBJECT (menu_item), "itemId");
- gconf_client_set_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region",
- locale, NULL);
- fill_region_option_menu (dialog);
-// gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 0);
-}
-
-static void
-update_region_examples (GladeXML *dialog, const gchar *region)
-{
- UErrorCode status;
- gunichar2 str[ICU_STRING_LONG];
- gchar *str_utf8;
- UCalendar *cal;
- UDate date;
- GtkWidget *label;
- UDateFormat* dfmt;
- UNumberFormat* nf;
- double number;
-
- status = U_ZERO_ERROR;
-
- cal = ucal_open (NULL, -1, region, UCAL_TRADITIONAL, &status);
- ucal_setDateTime (cal, 2004, UCAL_JANUARY, 2, 12, 34, 0, &status);
- date = ucal_getMillis (cal, &status);
-
- /* Full date label */
- status = U_ZERO_ERROR;
- dfmt = udat_open(UDAT_NONE, UDAT_FULL, region,
- NULL, -1, NULL, -1, &status);
- udat_format(dfmt, date, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("full_date_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-
- /* Medium date label */
- status = U_ZERO_ERROR;
- dfmt = udat_open(UDAT_NONE, UDAT_MEDIUM, region,
- NULL, -1, NULL, -1, &status);
- udat_format(dfmt, date, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("medium_date_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-
- /* Short date label */
- status = U_ZERO_ERROR;
- dfmt = udat_open(UDAT_NONE, UDAT_SHORT, region,
- NULL, -1, NULL, -1, &status);
- udat_format(dfmt, date, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("short_date_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-
- /* Short time AM label */
- status = U_ZERO_ERROR;
- dfmt = udat_open(UDAT_SHORT, UDAT_NONE, region,
- NULL, -1, NULL, -1, &status);
- udat_format(dfmt, date, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("am_time_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-
- /* Short time AM label */
- status = U_ZERO_ERROR;
- ucal_setDateTime (cal, 2004, UCAL_JANUARY, 2, 4, 56, 0, &status);
- date = ucal_getMillis (cal, &status);
- dfmt = udat_open(UDAT_SHORT, UDAT_NONE, region,
- NULL, -1, NULL, -1, &status);
- udat_format(dfmt, date, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("pm_time_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-
- /* Currency label */
- number = 1234.56;
- status = U_ZERO_ERROR;
- nf = unum_open(UNUM_CURRENCY, NULL, -1, region, NULL, &status);
- unum_formatDouble(nf, number, str, ICU_STRING_LONG, NULL, &status);
- str_utf8 = g_utf16_to_utf8 (str, -1, NULL, NULL, NULL);
- label = WID ("currency_label");
- gtk_label_set_text (GTK_LABEL(label), str_utf8);
- g_free (str_utf8);
-}
-
-static void
-fill_region_option_menu (GladeXML *dialog)
-{
- GSList *langs;
- gchar main_lang[5];
- UErrorCode status;
- const gchar *selected_region;
- GtkWidget *menu;
- GtkWidget *submenu;
- GtkWidget *menu_item;
- gboolean show_all;
- gint32 nlocales;
- gint32 i;
- gboolean has_childs;
- gboolean selected_region_added;
- GtkWidget *selected_region_mitem;
- GList *pitem_node;
- gint position;
-
- langs = get_selected_languages_list ();
- status = U_ZERO_ERROR;
-
- uloc_getLanguage ((gchar *)langs->data, main_lang, 5, &status);
- selected_region = gconf_client_get_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region", NULL);
-
- if (selected_region == NULL) { /* We get the environment preferences */
- selected_region = setlocale (LC_TIME, NULL);
- if (selected_region) {
- gconf_client_set_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region",
- selected_region, NULL);
- return; /* The GConf event will update the menu */
- } else {
- /* FIXME: What default should we use? */
- selected_region = (gchar *) langs->data;
- }
- }
- selected_region_added = FALSE;
- selected_region_mitem = NULL;
-
- show_all = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
- (WID ("show_all_checkbutton")));
-
- /* FIXME: Is there a way to reuse the old menu? */
- menu = gtk_menu_new ();
- submenu = NULL;
- menu_item = NULL;
-
- nlocales = uloc_countAvailable ();
- has_childs = FALSE;
-
- for (i = 0; i < nlocales; i++) {
- const gchar *locale;
- gunichar2 name[ICU_STRING_LONG];
- gchar *name_utf8;
- gint position;
-
- locale = uloc_getAvailable (i);
-
- if (uloc_getVariant (locale, NULL, 0, &status)) {
- continue; /* We don't handle the variant locales */
- }
-
- status = U_ZERO_ERROR;
-
- if (!uloc_getCountry (locale, NULL, 0, &status)) {
- /* We remove the last country submenu
- * if it does not have childs
- */
- if (!has_childs && menu_item) {
- gtk_menu_item_remove_submenu
- (GTK_MENU_ITEM (menu_item));
- g_signal_connect
- (menu_item, "activate",
- G_CALLBACK (menu_item_activated_cb),
- dialog);
- }
-
- /* If it's the main language selected
- * we just add their childs to the root menu
- */
- if (strcmp (locale, main_lang) == 0 &&
- strcmp ((gchar *)langs->data,
- main_lang)) {
- has_childs = TRUE;
- submenu = menu;
- continue;
- } else if (!show_all) {
- has_childs = TRUE;
- submenu = NULL;
- continue;
- }
-
- status = U_ZERO_ERROR;
- uloc_getDisplayLanguage (locale, (gchar *)langs->data,
- name, ICU_STRING_LONG, &status);
- name[0] = g_unichar_toupper (name[0]);
- name_utf8 = g_utf16_to_utf8 (name, -1,
- NULL, NULL, NULL);
-
- if (selected_region_added) {
- position = 2;
- } else {
- position = 0;
- }
- pitem_node = g_list_nth (GTK_MENU_SHELL (menu)->children,
- position);
-
- for (position = selected_region_added ? 2 : 0;
- pitem_node != NULL;
- position++,
- pitem_node = pitem_node->next) {
- GtkWidget *label;
- const gchar *plocale;
- const gchar *txt;
-
- menu_item = GTK_WIDGET (pitem_node->data);
-
- plocale = g_object_get_data
- (G_OBJECT (menu_item), "itemId");
-
- status = U_ZERO_ERROR;
- if (!uloc_getCountry (plocale, NULL, 0, &status)) {
- label = GTK_BIN (menu_item)->child;
- txt = gtk_label_get_text (GTK_LABEL (label));
-
- /* FIXME: We must call setlocale */
- if (g_utf8_collate (txt, name_utf8) > 0) {
- break;
- }
- } else {
- /* We jump the main_locale regions */
- continue;
- }
- }
-
- menu_item = gtk_menu_item_new_with_label (name_utf8);
- g_object_set_data_full (G_OBJECT (menu_item), "itemId",
- g_strdup (locale),
- (GDestroyNotify) g_free);
-
- gtk_menu_shell_insert (GTK_MENU_SHELL (menu),
- GTK_WIDGET (menu_item), position);
- submenu = gtk_menu_new ();
- g_signal_connect (submenu, "selection-done",
- G_CALLBACK (submenu_selected_cb), dialog);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), submenu);
- has_childs = FALSE;
- } else {
- status = U_ZERO_ERROR;
- has_childs = TRUE;
-
- uloc_getDisplayCountry (locale, (gchar *)langs->data,
- name, ICU_STRING_LONG, &status);
- name_utf8 = g_utf16_to_utf8 (name, -1,
- NULL, NULL, NULL);
-
- if (!strcmp (locale, selected_region) && menu != submenu) {
- /* This is the selected region, we must
- * add it also to the root menu
- */
- gunichar2 language[ICU_STRING_LONG];
- gchar *language_utf8;
- gchar *label;
-
- uloc_getDisplayLanguage (selected_region,
- (gchar *)langs->data,
- language, ICU_STRING_LONG,
- &status);
- language_utf8 = g_utf16_to_utf8 (language,
- -1, NULL, NULL, NULL);
-
- label = g_strdup_printf ("%s (%s)",
- name_utf8,
- language_utf8);
-
- g_free (language_utf8);
-
- menu_item = gtk_menu_item_new_with_label (label);
- selected_region_mitem = menu_item;
- g_free (label);
- g_object_set_data_full (G_OBJECT (menu_item),
- "itemId",
- g_strdup (selected_region),
- (GDestroyNotify) g_free);
-
- gtk_menu_shell_insert (GTK_MENU_SHELL (menu),
- GTK_WIDGET (menu_item), 0);
-
- menu_item = gtk_separator_menu_item_new ();
- gtk_menu_shell_insert (GTK_MENU_SHELL (menu),
- GTK_WIDGET (menu_item), 1);
-
- selected_region_added = TRUE;
- }
-
- if (!(show_all || menu == submenu)) {
- continue;
- }
-
- if (menu == submenu && selected_region_added) {
- position = 2;
- } else {
- position = 0;
- }
-
- pitem_node = g_list_nth (GTK_MENU_SHELL (submenu)->children,
- position);
-
- for ( ; pitem_node != NULL;
- position++,
- pitem_node = pitem_node->next) {
- GtkWidget *label;
- const gchar *plocale;
- const gchar *txt;
-
- menu_item = GTK_WIDGET (pitem_node->data);
- plocale = g_object_get_data
- (G_OBJECT (menu_item), "itemId");
-
- status = U_ZERO_ERROR;
- if (!uloc_getCountry (plocale, NULL, 0, &status)) {
- /* Here starts the other regions != main_language */
- break;
- }
- label = GTK_BIN (menu_item)->child;
- txt = gtk_label_get_text (GTK_LABEL (label));
- /* FIXME: We must call setlocale */
- if (g_utf8_collate (txt, name_utf8) > 0) {
- break;
- }
- }
-
- menu_item = gtk_menu_item_new_with_label (name_utf8);
- if (menu == submenu) {
- if (!strcmp (selected_region, locale)) {
- selected_region_mitem = menu_item;
- }
- g_signal_connect (menu_item, "activate",
- G_CALLBACK (menu_item_activated_cb),
- dialog);
- }
- g_object_set_data_full (G_OBJECT (menu_item), "itemId",
- g_strdup (locale),
- (GDestroyNotify) g_free);
- gtk_menu_shell_insert (GTK_MENU_SHELL (submenu),
- GTK_WIDGET (menu_item), position);
- }
- }
-
- if (selected_region_mitem) {
- pitem_node = GTK_MENU_SHELL (menu)->children;
- position = g_list_index (pitem_node, selected_region_mitem);
- if (position == -1) {
- /* FIXME: We have a problem.... */
- position = 0;
- }
- } else {
- /* FIXME: The user has a non valid region */
- position = 0;
- }
-
- /* We remove the old menu */
- gtk_option_menu_remove_menu (GTK_OPTION_MENU (WID ("region_optionmenu")));
- /* Add the new menu */
- gtk_option_menu_set_menu (GTK_OPTION_MENU (WID ("region_optionmenu")),
- GTK_WIDGET (menu));
- gtk_option_menu_set_history (GTK_OPTION_MENU
- (WID ("region_optionmenu")), position);
- gtk_widget_show_all (menu);
-
- update_region_examples (dialog, selected_region);
-}
-
-static void
-show_all_regions_cb (GConfClient *client, guint cnxn_id,
- GConfEntry *entry, GladeXML *dialog)
-{
- /* We just refresh the region_optionmenu */
- fill_region_option_menu (dialog);
-}
-
-static void
-region_changed_cb (GConfClient *client, guint cnxn_id,
- GConfEntry *entry, GladeXML *dialog)
-{
- GSList *langs;
- gchar *selected_region;
-
- langs = get_selected_languages_list ();
- selected_region = g_strdup (gconf_value_get_string (entry->value));
-
- update_info_box (dialog, langs->data, selected_region);
-
- g_free (selected_region);
-
- /* Updates the optionmenu */
- fill_region_option_menu (dialog);
-
-}
-
-static void
-dialog_response (GtkWidget *widget,
- gint response_id,
- GConfChangeSet *changeset)
-{
- if (response_id == GTK_RESPONSE_HELP) {
- /* FIXME: What should we add here? */
-/* capplet_help (GTK_WINDOW (widget),
- "user-guide.xml",
- "goscustperiph-2");*/
- } else {
- gtk_main_quit ();
- }
-}
-
-static void
-setup_dialog (GladeXML *dialog,
- GConfChangeSet *changeset)
-{
- GObject *peditor;
- GnomeProgram *program;
- GSList *langs;
- const gchar *region;
-
- /* load all the images */
- program = gnome_program_get ();
-
- capplet_init_stock_icons ();
-
- /* Language Tab */
-
- /* Flag to ignore our own updates when sorting the language list */
- our_update = FALSE;
-
- prepare_selected_languages_tree (dialog);
- prepare_available_languages_tree (dialog);
-
- fill_selected_languages_tree (dialog);
- fill_available_languages_tree (dialog);
-
- gconf_client_notify_add (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/languages",
- (GConfClientNotifyFunc) languages_changed_cb,
- dialog, NULL, NULL);
-
- g_signal_connect (G_OBJECT (WID ("languages_treeview")), "drag_end",
- G_CALLBACK (languages_sorted_cb), dialog);
- g_signal_connect (G_OBJECT (WID ("change_languages_button")), "clicked",
- G_CALLBACK (change_languages_cb), dialog);
- g_signal_connect (G_OBJECT (WID ("language_up_button")), "clicked",
- G_CALLBACK (language_up_cb), dialog);
- g_signal_connect (G_OBJECT (WID ("language_down_button")), "clicked",
- G_CALLBACK (language_down_cb), dialog);
-
- /* Formats Tab */
- fill_region_option_menu (dialog);
-
- peditor = gconf_peditor_new_boolean
- (changeset, GCONF_LOCALIZATION_ROOT_KEY "/show_all_regions",
- WID ("show_all_checkbutton"), NULL);
-
- gconf_client_notify_add (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/show_all_regions",
- (GConfClientNotifyFunc) show_all_regions_cb,
- dialog, NULL, NULL);
-
- gconf_client_notify_add (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region",
- (GConfClientNotifyFunc) region_changed_cb,
- dialog, NULL, NULL);
-
- langs = get_selected_languages_list();
- region = gconf_client_get_string (gconf_client_get_default (),
- GCONF_LOCALIZATION_ROOT_KEY "/region", NULL);
-
- update_info_box (dialog, langs->data, region);
-
- /* Dialog action buttons */
- g_signal_connect (G_OBJECT (WID ("localization_dialog")), "response",
- G_CALLBACK (dialog_response), changeset);
-
-}
-
-int
-main (int argc, char **argv)
-{
- GConfClient *client;
- GConfChangeSet *changeset;
- GladeXML *dialog;
-
- bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
-
- gnome_program_init ("gnome-localization-properties", VERSION, LIBGNOMEUI_MODULE, argc, argv,
- GNOME_PARAM_APP_DATADIR, GNOMECC_DATA_DIR,
- NULL);
-
- activate_settings_daemon ();
-
- client = gconf_client_get_default ();
- gconf_client_add_dir (client, GCONF_LOCALIZATION_ROOT_KEY, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
-
- changeset = NULL;
- dialog = create_dialog ();
- setup_dialog (dialog, changeset);
- capplet_set_icon (WID ("localization_dialog"), "localization-capplet.png");
- gtk_widget_show (WID ("localization_dialog"));
- gtk_main ();
-
- return 0;
-}