diff --git a/ChangeLog b/ChangeLog index bca7a5e680..9f5de52201 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2002-12-02 Christian Stimming + + * src/gnome/window-main.c, + src/business/business-gnome/business-gnome.scm, src/scm/main.scm: + Yet more i18n menu insertion fixes. + + * src/gnome-utils/gnc-menu-extensions.[hc]: Added + gnc_gnome_app_insert_menus to work around i18n problems with stock + gnome menus. This is now also used from window-acct-tree.c. + 2002-12-01 Derek Atkins * move QuickFill and dialog-transfer into gnome-utils diff --git a/src/business/business-gnome/business-gnome.scm b/src/business/business-gnome/business-gnome.scm index d6dd5b9349..2b9a9ad47a 100644 --- a/src/business/business-gnome/business-gnome.scm +++ b/src/business/business-gnome/business-gnome.scm @@ -207,7 +207,7 @@ (gnc:add-extension (gnc:make-menu-item (N_ "Properties") (N_ "View and edit the properties of this file.") - (list "Main" "File" "_Print") + (list "Main" "_File" "_Print") (lambda () (let* ((book (gnc:get-current-book)) (slots (gnc:book-get-slots book))) @@ -218,7 +218,7 @@ (gnc:kvp-option-dialog gnc:id-book slots "Book Options" changed_cb))))) - (gnc:add-extension (gnc:make-separator (list "Main" "File" "_Print"))) + (gnc:add-extension (gnc:make-separator (list "Main" "_File" "_Print"))) ) diff --git a/src/gnome-utils/gnc-menu-extensions.c b/src/gnome-utils/gnc-menu-extensions.c index e53bce4cda..64d5a2212f 100644 --- a/src/gnome-utils/gnc-menu-extensions.c +++ b/src/gnome-utils/gnc-menu-extensions.c @@ -343,6 +343,161 @@ gnc_add_c_extension(GnomeUIInfo *info, gchar *path) extension_list = g_slist_append(extension_list, ext_info); } + +/* This code is directly copied from libgnomeui's gnome-app-helper.c + * without modifications. */ +static gint +g_strncmp_ignore_char( const gchar *first, const gchar *second, gint length, gchar ignored ) +{ + gint i, j; + for ( i = 0, j = 0; i < length; i++, j++ ) + { + while ( first[i] == ignored && i < length ) i++; + while ( second[j] == ignored ) j++; + if ( i == length ) + return 0; + if ( first[i] < second[j] ) + return -1; + if ( first[i] > second[j] ) + return 1; + } + return 0; +} + +/* This code is copied from libgnomeui's gnome-app-helper.c + * originally. */ +static const gchar * +gnc_gnome_app_helper_gettext (const gchar *str) +{ + char *s; + + /* First try to look up the string in gettext domain gnome-libs, + * since this is where the original gnome stock labels have been + * translated. */ + s = dgettext ("gnome-libs", str); + if ( s == str ) + s = gettext (str); + + return s; +} + +/* This code is directly copied from libgnomeui's gnome-app-helper.c, + * except for the call to the translation lookup . */ +/** + * gnome_app_find_menu_pos + * @parent: Root menu shell widget containing menu items to be searched + * @path: Specifies the target menu item by menu path + * @pos: (output) returned item position + * + * Description: + * finds menu item described by path starting + * in the GtkMenuShell top and returns its parent GtkMenuShell and the + * position after this item in pos: gtk_menu_shell_insert(p, w, pos) + * would then insert widget w in GtkMenuShell p right after the menu item + * described by path. + **/ +static GtkWidget * +gnc_gnome_app_find_menu_pos (GtkWidget *parent, const gchar *path, gint *pos) +{ + GtkBin *item; + gchar *label = NULL; + GList *children; + gchar *name_end; + gchar *part; + const gchar *transl; + gint p; + int path_len; + + g_return_val_if_fail (parent != NULL, NULL); + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (pos != NULL, NULL); + + children = GTK_MENU_SHELL (parent)->children; + + name_end = strchr(path, '/'); + if(name_end == NULL) + path_len = strlen(path); + else + path_len = name_end - path; + + if (path_len == 0) { + + if (children && GTK_IS_TEAROFF_MENU_ITEM(children->data)) + /* consider the position after the tear off item as the topmost one. */ + *pos = 1; + else + *pos = 0; + return parent; + } + + /* this ugly thing should fix the localization problems */ + part = g_malloc(path_len + 1); + if(!part) + return NULL; + strncpy(part, path, path_len); + part[path_len] = '\0'; + transl = gnc_gnome_app_helper_gettext (part); + path_len = strlen(transl); + + p = 0; + + while (children){ + item = GTK_BIN (children->data); + children = children->next; + label = NULL; + p++; + + if (GTK_IS_TEAROFF_MENU_ITEM(item)) + label = NULL; + else if (!item->child) /* this is a separator, right? */ + label = ""; + else if (GTK_IS_LABEL (item->child)) /* a simple item with a label */ + label = GTK_LABEL (item->child)->label; + else + label = NULL; /* something that we just can't handle */ + /*fprintf(stderr, "Transl '%s', Label '%s'\n", transl, label);*/ + if (label && (g_strncmp_ignore_char (transl, label, path_len, '_') == 0)){ + if (name_end == NULL) { + *pos = p; + g_free(part); + return parent; + } + else if (GTK_MENU_ITEM (item)->submenu) { + g_free(part); + return gnc_gnome_app_find_menu_pos + (GTK_MENU_ITEM (item)->submenu, + (gchar *)(name_end + 1), pos); + } + else { + g_free(part); + return NULL; + } + } + } + + g_free(part); + return NULL; +} + +/* This code is more or less copied from libgnomeui's gnome-app-helper.c . */ +void +gnc_gnome_app_insert_menus (GnomeApp *app, const gchar *path, GnomeUIInfo *menuinfo) +{ + GtkWidget *menu_shell; + gint pos; + + menu_shell = gnc_gnome_app_find_menu_pos(app->menubar, path, &pos); + if(menu_shell == NULL) { + g_warning("gnc_gnome_app_insert_menus: couldn't find " + "insertion point for menus!"); + return; + } + + /* create menus and insert them */ + gnome_app_fill_menu (GTK_MENU_SHELL (menu_shell), menuinfo, + app->accel_group, TRUE, pos); +} + void gnc_extensions_menu_setup(GnomeApp * app, gchar *window) { @@ -355,7 +510,7 @@ gnc_extensions_menu_setup(GnomeApp * app, gchar *window) (strcmp(info->window, WINDOW_NAME_ALL) != 0)) continue; /* fprintf(stderr, "Inserting extension menu at path '%s'\n", info->path); */ - gnome_app_insert_menus(app, info->path, info->info); + gnc_gnome_app_insert_menus(app, info->path, info->info); gnome_app_install_menu_hints(app, info->info); } } @@ -372,6 +527,7 @@ gnc_extensions_menu_setup_with_data(GnomeApp * app, if ((strcmp(info->window, window) != 0) && (strcmp(info->window, WINDOW_NAME_ALL) != 0)) continue; + /* fprintf(stderr, "Inserting extension menu/w/d at path '%s'\n", info->path); */ gnome_app_insert_menus_with_data(app, info->path, info->info, user_data); gnome_app_install_menu_hints(app, info->info); } diff --git a/src/gnome-utils/gnc-menu-extensions.h b/src/gnome-utils/gnc-menu-extensions.h index 8694a58c34..485c3b1779 100644 --- a/src/gnome-utils/gnc-menu-extensions.h +++ b/src/gnome-utils/gnc-menu-extensions.h @@ -34,6 +34,21 @@ void gnc_add_c_extension(GnomeUIInfo *info, gchar *path); void gnc_add_scm_extension(SCM extension); +/* Replacement for gnome_app_insert_menus, since the original one will + * fail for i18n. In particular, as soon as the gnome stock menus + * (created through the macros in gnome-app-helper) have a different + * translation in the original gnome libs compared to the gnucash + * message catalog, then the gnome_app_insert_menus will + * fail. Therefore this function looks up the translation of each 'path' + * element in the gettext domain "gnome-libs" first. + * + * This function should be used in all places where the 'path' + * contains a stock gnome menu, created through the macros in + * gnome-app-helper. */ +void +gnc_gnome_app_insert_menus (GnomeApp *app, const gchar *path, + GnomeUIInfo *menuinfo); + /* This is called from the window initializing code, when the actual * menu items stored by the above functions should now be inserted in * the menu of the GnomeApp app. diff --git a/src/gnome/window-acct-tree.c b/src/gnome/window-acct-tree.c index 3414cfe16b..fa04477acf 100644 --- a/src/gnome/window-acct-tree.c +++ b/src/gnome/window-acct-tree.c @@ -42,6 +42,7 @@ #include "gnc-engine.h" #include "gnc-gui-query.h" #include "gnc-html.h" +#include "gnc-menu-extensions.h" #include "gnc-split-reg.h" #include "gnc-ui.h" #include "gtkselect.h" @@ -1356,16 +1357,16 @@ gnc_acct_tree_tweak_menu (GNCMDIChildInfo * mc) * menus and toolbars. What a pain. */ /* Do not i18n these strings!!! */ - if (gnc_mdi_child_find_menu_item(mc, "File/_New Account...")) + if (gnc_mdi_child_find_menu_item(mc, "_File/_New Account...")) return; /* Do not i18n these strings!!! */ dup_scrub[0].user_data = info; dup_scrub[1].user_data = info; dup_scrub[2].user_data = info; - gnome_app_insert_menus (mc->app, "File/_New File", fileitems1); - gnome_app_insert_menus (mc->app, "File/Open...", fileitems2); - gnome_app_insert_menus (mc->app, "Edit/Paste", edititems); + gnc_gnome_app_insert_menus (mc->app, "_File/_New File", fileitems1); + gnc_gnome_app_insert_menus (mc->app, "_File/_Open...", fileitems2); + gnc_gnome_app_insert_menus (mc->app, "_Edit/_Paste", edititems); gnome_app_insert_menus (mc->app, "_Actions/_Scheduled Transactions", actionitems); @@ -1385,7 +1386,7 @@ gnc_acct_tree_tweak_menu (GNCMDIChildInfo * mc) gnc_acct_tree_window_add_sensitive(win, widget); /* Do not i18n these strings!!! */ - gnc_mdi_child_auto_menu(mc, GNC_AUTO_DISABLE, "File/Close", NULL); + gnc_mdi_child_auto_menu(mc, GNC_AUTO_DISABLE, "_File/_Close", NULL); gnc_mdi_child_auto_toolbar(mc, GNC_AUTO_DISABLE, "Close", NULL); /* Start with all the 'sensitives' disabled. */ diff --git a/src/gnome/window-main.c b/src/gnome/window-main.c index a3f89706be..fd3f34ce6d 100644 --- a/src/gnome/window-main.c +++ b/src/gnome/window-main.c @@ -269,13 +269,13 @@ gnc_main_window_tweak_menus(GNCMDIChildInfo * mc) { GtkWidget *widget; - widget = gnc_mdi_child_find_menu_item(mc, "View/_Toolbar"); + widget = gnc_mdi_child_find_menu_item(mc, "_View/_Toolbar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); - widget = gnc_mdi_child_find_menu_item(mc, "View/_Status Bar"); + widget = gnc_mdi_child_find_menu_item(mc, "_View/_Status Bar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); - widget = gnc_mdi_child_find_menu_item(mc, "View/S_ummary Bar"); + widget = gnc_mdi_child_find_menu_item(mc, "_View/S_ummary Bar"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); mc->gnc_mdi->menu_tweaking = NULL; diff --git a/src/scm/main.scm b/src/scm/main.scm index a986f6afcf..01fd827b15 100644 --- a/src/scm/main.scm +++ b/src/scm/main.scm @@ -474,7 +474,7 @@ string and 'directories' must be a list of strings." (gnc:make-menu-item (N_ "_Style Sheets...") (N_ "Edit report style sheets.") - (list gnc:window-name-main "Edit" "_Preferences...") + (list gnc:window-name-main "_Edit" "_Preferences...") (lambda () (gnc:style-sheet-dialog-open))))