When generating menus, lookup translations for menu entries in
specified textdomain.  Often used by linux distributions.

Original-patch-by: Alexey Voinov <[email protected]>
Signed-off-by: Alexey I. Froloff <[email protected]>
---
 configure.ac     |    5 +++++
 src/main.c       |   14 ++++++++++++--
 src/rootmenu.c   |   24 ++++++++++++------------
 src/wconfig.h.in |    6 ++++++
 4 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/configure.ac b/configure.ac
index 163216e..430f18d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -326,6 +326,11 @@ if test "x$NLSDIR" = "x"; then
        fi
 fi
 
+AC_ARG_WITH(menu-textdomain, AS_HELP_STRING([--with-menu-textdomain=DOMAIN], 
[specify gettext domain used for menu translations]),
+       [if test "x$withval" != "xno"; then
+        AC_DEFINE_UNQUOTED([MENU_TEXTDOMAIN], ["$withval"], [gettext domain 
used for menu translations])
+        fi])
+
 AC_SUBST(INTLIBS)
 AC_SUBST(NLSDIR)
 AC_SUBST(MOFILES)
diff --git a/src/main.c b/src/main.c
index a15f3fc..7c56cd9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -711,11 +711,21 @@ static int real_main(int argc, char **argv)
        if (!Locale || strcmp(Locale, "C") == 0 || strcmp(Locale, "POSIX") == 0)
                Locale = NULL;
 #ifdef I18N
-       if (getenv("NLSPATH"))
+       if (getenv("NLSPATH")) {
                bindtextdomain("WindowMaker", getenv("NLSPATH"));
-       else
+#if defined(MENU_TEXTDOMAIN)
+               bindtextdomain(MENU_TEXTDOMAIN, getenv("NLSPATH"));
+#endif
+       } else {
                bindtextdomain("WindowMaker", LOCALEDIR);
+#if defined(MENU_TEXTDOMAIN)
+               bindtextdomain(MENU_TEXTDOMAIN, LOCALEDIR);
+#endif
+       }
        bind_textdomain_codeset("WindowMaker", "UTF-8");
+#if defined(MENU_TEXTDOMAIN)
+       bind_textdomain_codeset(MENU_TEXTDOMAIN, "UTF-8");
+#endif
        textdomain("WindowMaker");
 
        if (!XSupportsLocale()) {
diff --git a/src/rootmenu.c b/src/rootmenu.c
index 8d56a7d..4c58bde 100644
--- a/src/rootmenu.c
+++ b/src/rootmenu.c
@@ -1032,12 +1032,12 @@ static WMenu *parseCascade(WScreen * scr, WMenu * menu, 
FILE * file, char *file_
 
                        /* start submenu */
 
-                       cascade = wMenuCreate(scr, title, False);
+                       cascade = wMenuCreate(scr, M_(title), False);
                        cascade->on_destroy = removeShortcutsForMenu;
                        if (parseCascade(scr, cascade, file, file_name) == 
NULL) {
                                wMenuDestroy(cascade, True);
                        } else {
-                               wMenuEntrySetCascade(menu, 
wMenuAddCallback(menu, title, NULL, NULL), cascade);
+                               wMenuEntrySetCascade(menu, 
wMenuAddCallback(menu, M_(title), NULL, NULL), cascade);
                        }
                } else if (strcasecmp(command, "END") == 0) {
                        /* end of menu */
@@ -1045,7 +1045,7 @@ static WMenu *parseCascade(WScreen * scr, WMenu * menu, 
FILE * file, char *file_
 
                } else {
                        /* normal items */
-                       addMenuEntry(menu, title, shortcut[0] ? shortcut : 
NULL, command,
+                       addMenuEntry(menu, M_(title), shortcut[0] ? shortcut : 
NULL, command,
                                     params[0] ? params : NULL, file_name);
                }
        }
@@ -1112,7 +1112,7 @@ static WMenu *readMenuFile(WScreen * scr, char *file_name)
                        break;
                }
                if (strcasecmp(command, "MENU") == 0) {
-                       menu = wMenuCreate(scr, title, True);
+                       menu = wMenuCreate(scr, M_(title), True);
                        menu->on_destroy = removeShortcutsForMenu;
                        if (!parseCascade(scr, menu, file, file_name)) {
                                wMenuDestroy(menu, True);
@@ -1209,7 +1209,7 @@ static WMenu *readMenuPipe(WScreen * scr, char 
**file_name)
                        break;
                }
                if (strcasecmp(command, "MENU") == 0) {
-                       menu = wMenuCreate(scr, title, True);
+                       menu = wMenuCreate(scr, M_(title), True);
                        menu->on_destroy = removeShortcutsForMenu;
                        if (!parseCascade(scr, menu, file, filename)) {
                                wMenuDestroy(menu, True);
@@ -1356,7 +1356,7 @@ static WMenu *readMenuDirectory(WScreen * scr, char 
*title, char **path, char *c
        WMSortArray(dirs, myCompare);
        WMSortArray(files, myCompare);
 
-       menu = wMenuCreate(scr, title, False);
+       menu = wMenuCreate(scr, M_(title), False);
        menu->on_destroy = removeShortcutsForMenu;
 
        WM_ITERATE_ARRAY(dirs, data, iter) {
@@ -1392,7 +1392,7 @@ static WMenu *readMenuDirectory(WScreen * scr, char 
*title, char **path, char *c
                        strcat(buffer, command);
                }
 
-               addMenuEntry(menu, data->name, NULL, "OPEN_MENU", buffer, 
path[data->index]);
+               addMenuEntry(menu, M_(data->name), NULL, "OPEN_MENU", buffer, 
path[data->index]);
 
                wfree(buffer);
                if (data->name)
@@ -1438,7 +1438,7 @@ static WMenu *readMenuDirectory(WScreen * scr, char 
*title, char **path, char *c
                        if (ptr && ptr != data->name)
                                *ptr = 0;
                }
-               addMenuEntry(menu, data->name, NULL, "SHEXEC", buffer, 
path[data->index]);
+               addMenuEntry(menu, M_(data->name), NULL, "SHEXEC", buffer, 
path[data->index]);
 
                wfree(buffer);
                if (data->name)
@@ -1459,8 +1459,8 @@ static WMenu *makeDefaultMenu(WScreen * scr)
        WMenu *menu = NULL;
 
        menu = wMenuCreate(scr, _("Commands"), True);
-       wMenuAddCallback(menu, "XTerm", execCommand, "xterm");
-       wMenuAddCallback(menu, "rxvt", execCommand, "rxvt");
+       wMenuAddCallback(menu, M_("XTerm"), execCommand, "xterm");
+       wMenuAddCallback(menu, M_("rxvt"), execCommand, "rxvt");
        wMenuAddCallback(menu, _("Restart"), restartCommand, NULL);
        wMenuAddCallback(menu, _("Exit..."), exitCommand, NULL);
        return menu;
@@ -1548,7 +1548,7 @@ static WMenu *configureMenu(WScreen * scr, WMPropList * 
definition)
        }
        mtitle = WMGetFromPLString(elem);
 
-       menu = wMenuCreate(scr, mtitle, False);
+       menu = wMenuCreate(scr, M_(mtitle), False);
        menu->on_destroy = removeShortcutsForMenu;
 
 #ifdef GLOBAL_SUBMENU_FILE
@@ -1607,7 +1607,7 @@ static WMenu *configureMenu(WScreen * scr, WMPropList * 
definition)
                        if (!title || !command)
                                goto error;
 
-                       addMenuEntry(menu, WMGetFromPLString(title),
+                       addMenuEntry(menu, M_(WMGetFromPLString(title)),
                                     shortcut ? WMGetFromPLString(shortcut) : 
NULL,
                                     WMGetFromPLString(command),
                                     params ? WMGetFromPLString(params) : NULL, 
"WMRootMenu");
diff --git a/src/wconfig.h.in b/src/wconfig.h.in
index 72f729d..577311c 100644
--- a/src/wconfig.h.in
+++ b/src/wconfig.h.in
@@ -413,9 +413,15 @@
  * the string up for translation
  */
 #define N_(text) (text)
+#if defined(MENU_TEXTDOMAIN)
+#define M_(text) dgettext(MENU_TEXTDOMAIN, text)
+#else
+#define M_(text) (text)
+#endif
 #else
 #define _(text) (text)
 #define N_(text) (text)
+#define M_(text) (text)
 #endif
 
 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-- 
1.7.2.3


-- 
To unsubscribe, send mail to [email protected].

Reply via email to