Check-in [cc6861c1a2]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview

SHA1 Hash:cc6861c1a268d9514a7d612507d07b980791557a
Date: 2012-02-08 00:08:39
User: BarryK
Comment:MoManager now handles SSS domains (translations for any text files)

Tags And Properties
Changes

Changes to woof-code/rootfs-skeleton/usr/sbin/fixmenus

@@ -7,19 +7,23 @@
 #...the '_' will be converted to a '/', so the generated JWM config file is:
 # /root/.jwmrc
 # 5jan2008: fbpanel,lxpanel support developed by plinej.
 #100404 BK added 'variconlinks' for my fbpanel pkg.
 #100427 when called via /etc/rc.d/rc.update, HOME is '/' (needed by some of the menu generating apps).
+#120207 translation of some SSS strings. refer /usr/share/nls/menu_strings/
 
 #100427
 [ ! "$HOME" ] && HOME='/root'
 [ "$HOME" = "/" ] && HOME='/root'
 export HOME
 
+LANG1="`echo -n $LANG | cut -f 1 -d '_'`"  #120207 ex: de
+
+
 TEMPLATES="`ls -1 /etc/xdg/templates | tr '\n' ' '`"
 
-for ONETPL in $TEMPLATES
+for ONETPL in $TEMPLATES #ex: _root_.jwmrc
 do
  [ "$ONETPL" = "README.txt" ] && continue
  ONEDEST="`echo -n "$ONETPL" | sed -e 's/_/\//g'`"
  ONESRC="/etc/xdg/templates/$ONETPL"
  echo "Generating $ONEDEST..."
@@ -34,10 +38,31 @@
    echo "$ONELINE" >> $ONEDEST
   else
    ${EXECMENU} >> ${ONEDEST}
   fi
  done
+
+ #120207 translate some strings...
+ if [ "$LANG1" != "en" ];then
+  if [ -f /usr/share/nls/menu_strings/menu_strings.${LANG1} ];then
+   sPTN="/\[${ONETPL}\]/,/^$/p" #this is a multi-line block find expression.
+   CODEBLOCK="`sed -n "$sPTN" /usr/share/nls/menu_strings/menu_strings.${LANG1} | sed -e '/^#/d' -e '/^$/d' -e '/^\[/d'`" #extracts just the relevant block of lines.
+   if [ "$CODEBLOCK" ];then
+    echo "$CODEBLOCK" |
+    while read ALINE
+    do
+     eval "$ALINE" #ex: CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Power-off computer' ; TRANSLATION='Computer ausschalten'
+     enPTN="s%INSERTMARKER%${ENGLISH}%"
+     enCODESTRING="`echo -n "$CODESTRING" | sed -e "$enPTN"`"
+     trPTN="s%INSERTMARKER%${TRANSLATION}%"
+     trCODESTRING="`echo -n "$CODESTRING" | sed -e "$trPTN"`"
+     fixPTN="s%${enCODESTRING}%${trCODESTRING}%"
+     sed -i -e "$fixPTN" ${ONEDEST} #translates one line in destination file. ex: /root/.jwmrc
+    done
+   fi
+  fi
+ fi
 
 done
 
 #w001 support for fbpanel, lxpanel, openbox, fluxbox, pekwm...
 [ `which variconlinks` ] && variconlinks #100404 for my fbpanel pkg.

Changes to woof-code/rootfs-skeleton/usr/sbin/momanager

@@ -4,10 +4,16 @@
 #the intention of this script is to manage non-english translations of files.
 #this is to include shell scripts, xml, .desktop and menu files.
 #translation will only be for the current language, and UTF-8 must be enabled.
 #120205 first release, handle gettext'ed scripts.
 #120206 added internationalization management of menu.
+#120206 simplify gui with help buttons.
+#120206 add management of menu categories.
+#120207 write translations to a folder in /root with full path, write.log, generate tarball.
+#120208 support SSS domains. (read comments in /usr/share/nls/menu_strings/menu_strings for more info)
+
+#***MOMANAGER IS ENGLISH ONLY (NOT GETTEXT'ED)***
 
 PARAM1=""
 [ $1 ] && PARAM1="$1"
 
 ORIGLANG=$LANG
@@ -15,10 +21,11 @@
 . /etc/rc.d/PUPSTATE
 GTKDIALOGEXE="gtkdialog"
 [ "`which gtkdialog4`" ] && GTKDIALOGEXE="gtkdialog4"
 mkdir -p /tmp/momanager
 ADATE="`date +%Y%m%d`" #ex: 20120205
+WINICON="gtk-preferences"; HELPICON="gtk-index" #gtk-info
 
 ORIGLANG1="`echo -n $ORIGLANG | cut -f 1 -d '_'`"  #ex: de
 ORIGLANG12="`echo -n $ORIGLANG | cut -f 1 -d '.'`" #ex: de_DE
 
 if [ "$ORIGLANG1" = "en" ];then
@@ -55,11 +62,11 @@
  exit 1
 fi
 ppPTN="s%${PATHPREFIX}%%"
 
 #download woof, to get latest files... no, too difficult, just put up warning...
-export MM1_DLG="<window title=\"MoManager: welcome\" window_position=\"1\" resizable=\"false\">
+export MM1_DLG="<window title=\"MoManager: welcome\" window_position=\"1\" resizable=\"false\" icon-name=\"${WINICON}\">
  <vbox>
   <text><label>Welcome, MoManager will help you to create and edit language translations for your country, for many of the applications in Puppy. MoManager only handles shell scripts and some XML data and .desktop menu files, binary compiled executables are not handled.</label></text>
   <text><label>VERY IMPORTANT: You must be currently running a Puppy built from the latest version of Woof, or very near latest. If your Puppy is even a month old, it is recommended that you check for a later release -- and be sure that it is built from the latest Woof. You can check my blog (bkhome.org/blog) for release announcements, or adventurous developers can even download Woof and build their own Puppy (the online Woof repository at bkhome.org/fossil/woof2.cgi has link to instructions)</label></text>
   <text><label>If you are currently running a very recent Woof-built Puppy, then click the 'OK' button to continue running MoManager:</label></text>
   <hbox>
@@ -130,19 +137,21 @@
  fi
 done
 if [ "$YESMO_XML" ];then
  YESMO_XML="<combobox width-request=\"310\"><variable>YESMO_COMBO</variable>${YESMO_XML}</combobox>"
 else
- YESMO_XML="<text><label>nothing</label></text>"
+ #YESMO_XML="<text><label>nothing</label></text>"
+ YESMO_XML="<combobox width-request=\"310\"><variable>EMPTYYESMO_COMBO</variable><item>--empty--</item></combobox>"
 fi
 if [ "$NOMO_XML" ];then
  NOMO_XML="<combobox width-request=\"330\"><variable>NOMO_COMBO</variable>${NOMO_XML}</combobox>"
 else
- NOMO_XML="<text><label>nothing</label></text>"
+ #NOMO_XML="<text><label>nothing</label></text>"
+ NOMO_XML="<combobox width-request=\"330\"><variable>EMPTYNOMO_COMBO</variable><item>--empty--</item></combobox>"
 fi
 
-#######MENU#######
+#######MENU ENTRIES#######
 #find out which .desktop files have [lang] entries already, create two lists...
 YESDESK_XML=""; NODESK_XML=""
 dPTN="\\[${ORIGLANG1}\\]"
 for ADESKTOP in `find /usr/share/applications -mindepth 1 -maxdepth 1 -type f -name '*.desktop' | grep -v ' ' | sort | tr '\n' ' '`
 do
@@ -167,67 +176,193 @@
  fi
 done
 if [ "$YESDESK_XML" ];then
  YESDESK_XML="<combobox width-request=\"310\"><variable>YESDESK_COMBO</variable>${YESDESK_XML}</combobox>"
 else
- YESDESK_XML="<text><label>nothing</label></text>"
+ #YESDESK_XML="<text><label>nothing</label></text>"
+ YESDESK_XML="<combobox width-request=\"310\"><variable>EMPTYYESDESK_COMBO</variable><item>--empty--</item></combobox>"
 fi
 if [ "$NODESK_XML" ];then
  NODESK_XML="<combobox width-request=\"330\"><variable>NODESK_COMBO</variable>${NODESK_XML}</combobox>"
 else
- NODESK_XML="<text><label>nothing</label></text>"
+ #NODESK_XML="<text><label>nothing</label></text>"
+ NODESK_XML="<combobox width-request=\"330\"><variable>EMPTYNODESK_COMBO</variable><item>--empty--</item></combobox>"
+fi
+
+#help buttons...
+YESMO_HELP_MSG="Puppy has many <b>scripts</b>, applications that are plain text files, usually written in Bash or Ash. These scripts all have English capability, but language translation files may be created for them, known as <b>mo</b> files.
+The drop-down list is a list of scripts for which there is a mo translation file in your language.
+The drop-down list has extra information in brackets, in the format <b>(lang TEXTDOMAIN package)</b>. In particular, package=WOOF means the file is in Woof, or the name of the package from which the file comes is given, or if not known then package=UNKNOWN.
+A mo translation file in your language (${ORIGLANG12}) is at /usr/share/locale/${ORIGLANG12}/LC_MESSAGES/ or /usr/share/locale/${ORIGLANG1}/LC_MESSAGES/. You may select one of the scripts, then click the <b>Edit</b> button to update it.
+Updating is required if the translation is incorrect or incomplete in any way. One reason this can happen is if there is a later version of the script with some changed English text strings."
+export DLG_HELP_YESMO="<window resizable=\"false\" title=\"MoManager: Help edit mo files\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${YESMO_HELP_MSG}\"</label><variable>VAR_HELP_YESMO</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_YESMO</action></button></hbox></vbox></window>"
+YESMOHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_YESMO</action></button>'
+
+NOMO_HELP_MSG="Puppy has many <b>scripts</b>, applications that are plain text files, usually written in Bash or Ash. These scripts all have English capability, but language translation files may be created for them, known as <b>mo</b> files.
+The drop-down list is a list of scripts for which there is no mo translation file in your language.
+The drop-down list has extra information in brackets, in the format <b>(TEXTDOMAIN package)</b>. In particular, package=WOOF means the file is in Woof, or the name of the package from which the file comes is given, or if not known then package=UNKNOWN.
+To create a translation file, select a script from the list, then click the <b>Create</b> button. This will open a file in a text editor which has all the English strings from the script, and below each you type in your translations. This file is known as a <b>po</b> file, and after saving and quiting the text editor, the file will be compiled into a binary format known as a <b>mo</b> file -- note, po files have a filename ending in .po and mo files end in .mo. It is the mo file that the script will use when it runs."
+export DLG_HELP_NOMO="<window resizable=\"false\" title=\"MoManager: Help create mo files\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${NOMO_HELP_MSG}\"</label><variable>VAR_HELP_NOMO</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_NOMO</action></button></hbox></vbox></window>"
+NOMOHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_NOMO</action></button>'
+
+YESDESK_HELP_MSG="The drop-down list is of .desktop files in /usr/share/applications, that have translations for your language.
+The <b>Name[${ORIGLANG1}]</b> entry in these files is what you see when you click on the Menu button at bottom-left of the screen (in some puppies the menu button is placed elsewhere). There will be a translation for each application.
+If you need to correct an entry, select the appropriate .desktop file, then click the <b>Edit</b> button.
+Note, The drop-down list has extra information in brackets, which is the name of the package that the file belongs to. <b>WOOF</b> means that the file is in Woof."
+export DLG_HELP_YESDESK="<window resizable=\"false\" title=\"MoManager: Help edit menu entries\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${YESDESK_HELP_MSG}\"</label><variable>VAR_HELP_YESDESK</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_YESDESK</action></button></hbox></vbox></window>"
+YESDESKHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_YESDESK</action></button>'
+
+NODESK_HELP_MSG="The drop-down list is of .desktop files in /usr/share/applications, that do <i>not</i> have translations for your language.
+The <b>Name[${ORIGLANG1}]</b> entry in these files is what you see when you click on the Menu button at bottom-left of the screen (in some puppies the menu button is placed elsewhere). There will be a translation for each application, but for these .desktop files there is no translation, so the entries will display in English.
+If you wish to create a translation, select the appropriate .desktop file, then click the <b>Create</b> button.
+Note, The drop-down list has extra information in brackets, which is the name of the package that the file belongs to. <b>WOOF</b> means that the file is in Woof."
+export DLG_HELP_NODESK="<window resizable=\"false\" title=\"MoManager: Help create menu entries\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${NODESK_HELP_MSG}\"</label><variable>VAR_HELP_NODESK</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_NODESK</action></button></hbox></vbox></window>"
+NODESKHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_NODESK</action></button>'
+
+#######MENU TITLES#######
+#this gives us the list of .directory files in /usr/share/desktop-directories for the top-level titles... ex: Puppy-Setup.directory
+TOPMENUFILES="`grep -m1 '<Directory>' /etc/xdg/menus/puppy-[^S]*.menu | cut -f 2 -d '>' | cut -f 1 -d '<' | grep 'directory$' | sort | tr '\n' ' '`"
+YESTOP_XML=""; NOTOP_XML=""
+dPTN="^Name\\[${ORIGLANG1}\\]"
+for ATOPMENUFILE in $TOPMENUFILES
+do
+ if [ "`grep "$dPTN" /usr/share/desktop-directories/$ATOPMENUFILE`" != "" ];then
+  #there is already a translation.
+  YESTOP_XML="${YESTOP_XML}
+<item>${ATOPMENUFILE}</item>"
+ else
+  NOTOP_XML="${NOTOP_XML}
+<item>${ATOPMENUFILE}</item>"
+ fi
+done
+if [ "$YESTOP_XML" ];then
+ YESTOP_XML="<combobox width-request=\"310\"><variable>YESTOP_COMBO</variable>${YESTOP_XML}</combobox>"
+else
+ #YESTOP_XML="<text><label>nothing</label></text>"
+ YESTOP_XML="<combobox width-request=\"310\"><variable>EMPTYYESTOP_COMBO</variable><item>--empty--</item></combobox>"
+fi
+if [ "$NOTOP_XML" ];then
+ NOTOP_XML="<combobox width-request=\"330\"><variable>NOTOP_COMBO</variable>${NOTOP_XML}</combobox>"
+else
+ #NOTOP_XML="<text><label>nothing</label></text>"
+ NOTOP_XML="<combobox width-request=\"330\"><variable>EMPTYNOTOP_COMBO</variable><item>--empty--</item></combobox>"
+fi
+#help buttons...
+YESTOP_HELP_MSG="These are the top-level menu titles, or categories, that you see when you click on the 'Menu' button at bottom-left of the screen (or elsewhere in some puppies). The drop-down list is for those categories that already have a translation for the <b>${ORIGLANG1}</b> locale.
+If you wish to change a translation, select a file from the drop-down list, then click the <b>Edit</b> button. A text editor will open, then edit the <b>Name[${ORIGLANG1}]</b> entry, then save and quit the editor. Afterward, the menu will refresh and you will be able to see the change."
+export DLG_HELP_YESTOP="<window resizable=\"false\" title=\"MoManager: Help edit menu categories\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${YESTOP_HELP_MSG}\"</label><variable>VAR_HELP_YESTOP</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_YESTOP</action></button></hbox></vbox></window>"
+YESTOPHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_YESTOP</action></button>'
+NOTOP_HELP_MSG="These are the top-level menu titles, or categories, that you see when you click on the 'Menu' button at bottom-left of the screen (or elsewhere in some puppies). The drop-down list is for those categories that do <i>not</i> have a translation for the <b>${ORIGLANG1}</b> locale (so they will display in English).
+If you wish to create a translation, select a file from the drop-down list, click the <b>Create</b> button. A text editor will open, then edit the <b>Name[${ORIGLANG1}]</b> entry, then save and quit the editor. Afterward, the menu will refresh and you will be able to see the change."
+export DLG_HELP_NOTOP="<window resizable=\"false\" title=\"MoManager: Help edit menu categories\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${NOTOP_HELP_MSG}\"</label><variable>VAR_HELP_NOTOP</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_NOTOP</action></button></hbox></vbox></window>"
+NOTOPHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_NOTOP</action></button>'
+
+#######SSS#######
+#Simple String Substitution
+#manage translations in many non-executable data files.
+#translations are kept in /usr/share/nls/$SSSDOMAIN/$SSSDOMAIN.$ORIGLANG1 ex: SSSDOMAIN=menu_strings ORIGLANG1=de
+YESSSS_XML=""; NOSSS_XML=""
+for ASSSDOMAIN in `find /usr/share/nls -mindepth 1 -maxdepth 1 -type d | sed -e 's%^/usr/share/nls/%%' | tr '\n' ' '`
+do
+ if [ -f /usr/share/nls/${ASSSDOMAIN}/${ASSSDOMAIN}.${ORIGLANG1} ];then
+  #there is already a translation.
+  YESSSS_XML="${YESSSS_XML}
+<item>${ASSSDOMAIN}.${ORIGLANG1}</item>"
+ else
+  NOSSS_XML="${NOSSS_XML}
+<item>${ASSSDOMAIN}</item>"
+ fi
+done
+if [ "$YESSSS_XML" ];then
+ YESSSS_XML="<combobox width-request=\"310\"><variable>YESSSS_COMBO</variable>${YESSSS_XML}</combobox>"
+else
+ YESSSS_XML="<combobox width-request=\"310\"><variable>EMPTYYESSSS_COMBO</variable><item>--empty--</item></combobox>"
+fi
+if [ "$NOSSS_XML" ];then
+ NOSSS_XML="<combobox width-request=\"330\"><variable>NOSSS_COMBO</variable>${NOSSS_XML}</combobox>"
+else
+ NOSSS_XML="<combobox width-request=\"330\"><variable>EMPTYNOSSS_COMBO</variable><item>--empty--</item></combobox>"
 fi
-
-
-
-export MM2_DLG="<window title=\"MoManager: Puppy files\" window_position=\"1\" resizable=\"false\">
+#help buttons...
+SSS_DOMAINS_MSG="
+<b>menu_strings</b>
+These are translations for window manager and tray data files. For example, the JWM window manager has a data file /root/.jwmrc, which has some strings that appear in on-screen menus (apart from the main application menu). Note: you can find further explanation in the file /usr/share/nls/menu_strings/menu_strings."
+YESSSS_HELP_MSG="<b>SSS</b> means Simple String Substitution, a simple method of language translation for any type of text files. An <b>SSS domain</b> defines a class of files that need to be translated. The drop-down list contains domains that have <b>${ORIGLANG1}</b> translations, however do check them as the translations may be incomplete. The headings below are the various domains:
+${SSS_DOMAINS_MSG}"
+export DLG_HELP_YESSSS="<window resizable=\"false\" title=\"MoManager: Help edit SSS domains\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${YESSSS_HELP_MSG}\"</label><variable>VAR_HELP_YESSSS</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_YESSSS</action></button></hbox></vbox></window>"
+YESSSSHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_YESSSS</action></button>'
+NOSSS_HELP_MSG="<b>SSS</b> means Simple String Substitution, a simple method of language translation for any type of text files. An <b>SSS domain</b> defines a class of files that need to be translated. The drop-down list contains domains that do <i>not</i> have <b>${ORIGLANG1}</b> translations (so any on-screen text will be in English). The headings below are the various domains:
+${SSS_DOMAINS_MSG}"
+export DLG_HELP_NOSSS="<window resizable=\"false\" title=\"MoManager: Help create SSS domains\" icon-name=\"${HELPICON}\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${NOSSS_HELP_MSG}\"</label><variable>VAR_HELP_NOSSS</variable></text><hbox><button><label>Close</label><action type=\"closewindow\">VAR_HELP_NOSSS</action></button></hbox></vbox></window>"
+NOSSSHELP_XML='<button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type="launch">DLG_HELP_NOSSS</action></button>'
+
+
+
+
+export MM2_DLG="<window title=\"MoManager: Puppy files\" window_position=\"1\" resizable=\"false\" icon-name=\"${WINICON}\">
  <vbox>
 
-  <frame Scripts>
-  <hbox>
-   <text><label>Puppy has many 'scripts', applications that are plain text files, usually written in Bash or Ash. These scripts all have English capability, but language translation files may be created for them, known as 'mo' files as their filename ends with '.mo'.</label></text>
-   <text><label>Note that the drop-down lists below have extra information in brackets, in the format ([lang ]TEXTDOMAIN package). In particular, package=WOOF means the file is in Woof, or the name of the package from which the file comes is given, or if not known then package=UNKNOWN.</label></text>
-  </hbox>
+  <text use-markup=\"true\" width-chars=\"86\"><label>\"<big>Welcome! To fully translate Puppy to your <b>${ORIGLANG12}</b> locale, you need to get all of the files on the right-side drop-down lists over to the left-side lists. Simple! Click the help buttons for explanation about each list...</big>\"</label></text>
+
+  <frame Scripts>
   <hbox>
    <vbox>
     <frame Scripts that have a mo file>
-     <text><label>A translation file in your language (${ORIGLANG12}) will be at /usr/share/locale/${ORIGLANG12}/LC_MESSAGES/ or /usr/share/locale/${ORIGLANG1}/LC_MESSAGES/. You may select one of the scripts, then click the 'Edit' button to update it...</label></text>
-
-     <hbox>${YESMO_XML}<button><label>Edit</label><action>EXIT:edit_mo</action></button></hbox>
+     <hbox>${YESMO_XML}<button><label>Edit</label><action>EXIT:edit_mo</action></button>${YESMOHELP_XML}</hbox>
     </frame>
    </vbox>
    <vbox>
     <frame Scripts that do not have a mo file>
-     <text><label>These scripts do not have a translation file for your language. You may select one of the scripts, then click the 'Create' button to create a translation...</label></text>
-
-     <hbox>${NOMO_XML}<button><label>Create</label><action>EXIT:create_mo</action></button></hbox>
+     <hbox>${NOMO_XML}<button><label>Create</label><action>EXIT:create_mo</action></button>${NOMOHELP_XML}</hbox>
     </frame>
    </vbox>
   </hbox>
   </frame>
 
-  <frame Menu>
+  <frame Menu categories>
    <hbox>
-    <text use-markup=\"true\"><label>\"Menu entries are defined by files in folder /usr/share/applications. A line <b>Name[${ORIGLANG1}]=</b> is required with text that will appear in the menu. You need to edit the string to be a suitable translation from the English menu string...\"</label></text>
-    <text><label>The extra information in brackets is the name of the package that the file belongs to. 'WOOF' means that the file is in Woof.</label></text>
+    <vbox>
+     <frame Menu categories with a ${ORIGLANG1} translation>
+      <hbox>${YESTOP_XML}<button><label>Edit</label><action>EXIT:edit_top</action></button>${YESTOPHELP_XML}</hbox>
+     </frame>
+    </vbox>
+    <vbox>
+     <frame Menu categories without a ${ORIGLANG1} translation>
+     <hbox>${NOTOP_XML}<button><label>Create</label><action>EXIT:create_top</action></button>${NOTOPHELP_XML}</hbox>
+     </frame>
+    </vbox>
    </hbox>
+  </frame>
+
+  <frame Menu entries>
    <hbox>
     <vbox>
-     <frame Menu files with a ${ORIGLANG1} translation>
-      <hbox>${YESDESK_XML}<button><label>Edit</label><action>EXIT:edit_desk</action></button></hbox>
+     <frame Menu entries with a ${ORIGLANG1} translation>
+      <hbox>${YESDESK_XML}<button><label>Edit</label><action>EXIT:edit_desk</action></button>${YESDESKHELP_XML}</hbox>
      </frame>
     </vbox>
     <vbox>
-     <frame Menu files without a ${ORIGLANG1} translation>
-     <hbox>${NODESK_XML}<button><label>Create</label><action>EXIT:create_desk</action></button></hbox>
+     <frame Menu entries without a ${ORIGLANG1} translation>
+     <hbox>${NODESK_XML}<button><label>Create</label><action>EXIT:create_desk</action></button>${NODESKHELP_XML}</hbox>
      </frame>
     </vbox>
    </hbox>
   </frame>
 
-  <frame ROX-Filer>
-   <text><label>coming soon</label></text>
+  <frame SSS domains>
+   <hbox>
+    <vbox>
+     <frame SSS domains with a ${ORIGLANG1} translation>
+      <hbox>${YESSSS_XML}<button><label>Edit</label><action>EXIT:edit_sss</action></button>${YESSSSHELP_XML}</hbox>
+     </frame>
+    </vbox>
+    <vbox>
+     <frame SSS domains without a ${ORIGLANG1} translation>
+     <hbox>${NOSSS_XML}<button><label>Create</label><action>EXIT:create_sss</action></button>${NOSSSHELP_XML}</hbox>
+     </frame>
+    </vbox>
+   </hbox>
   </frame>
 
   <hbox>
    <button><label>About</label><action>pupdialog --background '#8080FF' --backtitle 'MoManager: About' --msgbox 'Created by Barry Kauler for Puppy Linux. (c) Copyright Barry Kauler 2012, license GPL3 (refer /usr/share/doc/legal)' 0 0 & </action></button>
    <button><label>Exit</label><action>EXIT:quit</action></button>
@@ -241,15 +376,14 @@
 
 MM1RET="`$GTKDIALOGEXE --program=MM2_DLG`"
 eval "$MM1RET"
 
 #note: edit_mo and create_mo have much common code, *to do* eliminate duplication.
-GZNOTE="Note, if you are very security-conscious and want to check for yourself what is in that file before you email it, gunzip it, then use application 'msgunfmt' to de-compile it and view it's contents."
 case $EXIT in
  edit_mo)
   #ex: YESMO_COMBO='/usr/sbin/mousecheck (de mousecheck.mo)'
-  ASCRIPT="`echo -n "$YESMO_COMBO" | cut -f 1 -d '(' | rev | cut -f 2 -d ' ' | rev`"
+  ASCRIPT="`echo -n "$YESMO_COMBO" | cut -f 1 -d '(' | rev | cut -f 2-9 -d ' ' | rev`"
   ANAME="`basename "$ASCRIPT"`"
   ATRANSLANG="`echo -n "$YESMO_COMBO" | cut -f 2 -d '(' | cut -f 1 -d ' '`" #ex: de
   AMO="`echo -n "$YESMO_COMBO" | cut -f 2 -d '(' | cut -f 1 -d ')' | cut -f 2 -d ' '`" #ex: mousecheck.mo
   APKGNAME="`echo -n "$YESMO_COMBO" | cut -f 2 -d '(' | cut -f 1 -d ')' | cut -f 3 -d ' '`" #ex: bluefish  ex: WOOF
   AMOSPEC="/usr/share/locale/${ATRANSLANG}/LC_MESSAGES/${AMO}"
@@ -279,29 +413,38 @@
   defaulttexteditor /tmp/momanager/${ATEXTDOMAIN}.po
   rxvt -e msgfmt --check --output-file=/tmp/momanager/${ATEXTDOMAIN}.mo /tmp/momanager/${ATEXTDOMAIN}.po
   pupdialog --background yellow --colors --backtitle "MoManager: post-edit mo" --yes-label "OK" --no-label "Cancel" --yesno "The file /tmp/momanager/${ATEXTDOMAIN}.po has been edited and converted to /tmp/momanager/${ATEXTDOMAIN}.mo. If all went well, click the \ZbOK\ZB button to copy it to \Zb${AMOSPEC}\ZB. Note, as a precaution, the old mo file is at /tmp/momanager/${ATEXTDOMAIN}.moOLD." 0 0
   if [ $? -eq 0 ];then
    cp -f /tmp/momanager/${ATEXTDOMAIN}.mo "${AMOSPEC}"
-   cd /tmp/momanager
-   rm -f ${ATEXTDOMAIN}.mo.gz 2>/dev/null
-   gzip ${ATEXTDOMAIN}.mo
+   #output as a tarball that user can email to pkg author...
+   mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/locale/${ATRANSLANG}/LC_MESSAGES
+   cp -f /tmp/momanager/${ATEXTDOMAIN}.mo /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/locale/${ATRANSLANG}/LC_MESSAGES/
    ASTAT="`stat --format=%y "$ASCRIPT" | cut -f 1 -d ' ' | tr -d '-' `" #so can check against file version in latest Woof.
    [ -f ${PATHPREFIX}${ASCRIPT} ] && ASTAT="`stat --format=%y "${PATHPREFIX}$ASCRIPT" | cut -f 1 -d ' ' | tr -d '-' `" #get orig modify date.
-   mv -f /tmp/momanager/${ATEXTDOMAIN}.mo.gz /root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz
+   echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_SCRIPT=${ASTAT} SCRIPT='${ASCRIPT}' MO_FILE='${AMOSPEC}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
+   cd /root
+   mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+   dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+   TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
    case $APKGNAME in
     WOOF)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} is part of Woof, so if the translation works, please email it to Barry Kauler so that it may be included in Woof for all future Puppy builds. File \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to Barry at: \Zbbkauler@gmail.com\ZB -- thanks, that will be very helpful for internationalization of Puppy!"
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} is part of Woof, so if the translation file works, please email it to Barry Kauler so that it may be included in Woof for all future Puppy builds.
+${TARBALLMSG}
+You are welcome to email the tarball to Barry at: \Zbbkauler@gmail.com\ZB -- thanks, that will be very helpful for internationalization of Puppy!"
     ;;
     UNKNOWN)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} does not seem to be part of Woof, nor can it be determined if it is part of a package. if you know who the author of the script is, you might wish to send the translation file to that person -- file \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to someone."
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} does not seem to be part of Woof, nor can it be determined if it is part of a package. if you know who the author of the script is, you might wish to send the translation file to that person.
+${TARBALLMSG}
+You can email the tarball to someone."
     ;;
     *)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} appears to be part of package ${APKGNAME}, and you may wish to send the translation file to the author of that package -- file \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to someone."
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} appears to be part of package ${APKGNAME}, and you may wish to send the translation file to the author of that package.
+${TARBALLMSG}
+You can email the tarball to the author of the package."
     ;;
    esac
-   pupdialog --background green --colors --backtitle "MoManager: mo edit completed" --msgbox "${DONEMSG}
-${GZNOTE}" 0 0
+   pupdialog --background green --colors --backtitle "MoManager: mo edit completed" --msgbox "${DONEMSG}" 0 0
   else
    pupdialog --background pink --backtitle "MoManager: mo edit aborted" --msgbox "You have declined to update the mo file. Ok, the previous one has been retained." 0 0
   fi
   export LANG=$ORIGLANG
   exec momanager reenter
@@ -347,29 +490,38 @@
   defaulttexteditor /tmp/momanager/${ATEXTDOMAIN}.po
   rxvt -e msgfmt --check --output-file=/tmp/momanager/${ATEXTDOMAIN}.mo /tmp/momanager/${ATEXTDOMAIN}.po
   pupdialog --background yellow --colors --backtitle "MoManager: post-edit mo" --yes-label "OK" --no-label "Cancel" --yesno "The file /tmp/momanager/${ATEXTDOMAIN}.po has been edited and converted to /tmp/momanager/${ATEXTDOMAIN}.mo (the former being the editable translation file and the latter being the compiled translation file). If all went well, click the \ZbOK\ZB button to copy it to \Zb${AMOSPEC}\ZB." 0 0
   if [ $? -eq 0 ];then
    cp -f /tmp/momanager/${ATEXTDOMAIN}.mo "${AMOSPEC}"
-   cd /tmp/momanager
-   rm -f ${ATEXTDOMAIN}.mo.gz 2>/dev/null
-   gzip ${ATEXTDOMAIN}.mo
+   #output as a tarball that user can email to pkg author...
+   mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/locale/${ATRANSLANG}/LC_MESSAGES
+   cp -f /tmp/momanager/${ATEXTDOMAIN}.mo /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/locale/${ATRANSLANG}/LC_MESSAGES/
    ASTAT="`stat --format=%y "$ASCRIPT" | cut -f 1 -d ' ' | tr -d '-' `" #so can check against file version in latest Woof.
    [ -f ${PATHPREFIX}${ASCRIPT} ] && ASTAT="`stat --format=%y "${PATHPREFIX}$ASCRIPT" | cut -f 1 -d ' ' | tr -d '-' `" #get orig modify date.
-   mv -f /tmp/momanager/${ATEXTDOMAIN}.mo.gz /root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz
+   echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_SCRIPT=${ASTAT} SCRIPT='${ASCRIPT}' MO_FILE='${AMOSPEC}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
+   cd /root
+   mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+   dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+   TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
    case $APKGNAME in
     WOOF)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} is part of Woof, so if the translation works, please email it to Barry Kauler so that it may be included in Woof for all future Puppy builds. File \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to Barry at: \Zbbkauler@gmail.com\ZB -- thanks, that will be very helpful for internationalization of Puppy!"
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} is part of Woof, so if the translation file works, please email it to Barry Kauler so that it may be included in Woof for all future Puppy builds.
+${TARBALLMSG}
+You are welcome to email the tarball to Barry at: \Zbbkauler@gmail.com\ZB -- thanks, that will be very helpful for internationalization of Puppy!"
     ;;
     UNKNOWN)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} does not seem to be part of Woof, nor can it be determined if it is part of a package. if you know who the author of the script is, you might wish to send the translation file to that person -- file \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to someone."
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} does not seem to be part of Woof, nor can it be determined if it is part of a package. if you know who the author of the script is, you might wish to send the translation file to that person.
+${TARBALLMSG}
+You can email the tarball to someone."
     ;;
     *)
-     DONEMSG="Ok, the new .mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} appears to be part of package ${APKGNAME}, and you may wish to send the translation file to the author of that package -- file \Zb/root/${ASTAT}_${ADATE}_${ATRANSLANG}_${ATEXTDOMAIN}.mo.gz\ZB has been created, that you can email to someone."
+     DONEMSG="Ok, the new mo file is in place, and if you wish you may run the script to test it. The script ${ANAME} appears to be part of package ${APKGNAME}, and you may wish to send the translation file to the author of that package.
+${TARBALLMSG}
+You can email the tarball to the author of the package."
     ;;
    esac
-   pupdialog --background green --colors --backtitle "MoManager: mo edit completed" --msgbox "${DONEMSG}
-${GZNOTE}" 0 0
+   pupdialog --background green --colors --backtitle "MoManager: mo edit completed" --msgbox "${DONEMSG}" 0 0
   else
    pupdialog --background pink --backtitle "MoManager: mo edit aborted" --msgbox "You have declined to use the mo file. Ok, it has been left at /tmp/momanager/${ATEXTDOMAIN}.mo and will not be used." 0 0
   fi
   export LANG=$ORIGLANG
   exec momanager reenter
@@ -405,35 +557,209 @@
   if [ "$xASTAT1" = "$xASTAT2" ];then
    export LANG=$ORIGLANG
    exec momanager reenter
   fi
   yaf-splash -bg '#80FF80' -timeout 3 -text "The menu is being updated..." &
-  /usr/sbin/fixmenus
+  LANG=$ORIGLANG /usr/sbin/fixmenus
   if [ "`pidof jwm`" != "" ];then
    JWMVER=`jwm -v|head -n1|cut -d ' ' -f2|cut -d - -f2`
    if vercmp $JWMVER lt 574;then
     jwm -restart
    else
     jwm -reload
    fi
   fi
   cp -f /usr/share/applications/$DESKFILE /root/
+  #add translation to tarball that user can email to pkg author...
+  cd /root
+  mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/applications
+  cp -f /usr/share/applications/$DESKFILE /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/applications/
+  echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_FILE=${ASTAT} DESKTOP_FILE='/usr/share/applications/${DESKFILE}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
+  cd /root
+  mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+  dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+  TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
+  case $APKGNAME in
+   WOOF)
+    DONEMSG="As this menu file is from Woof, please email the tarball to Barry Kauler \Zbbkauler@gmail.com\ZB, so that all future builds of Puppy may benefit from your translation!"
+   ;;
+   UNKNOWN)
+    DONEMSG="It is not known which package this menu file is from. However, if you can find out, please email the tarball to the maintainer of that package."
+   ;;
+   *)
+    DONEMSG="The menu file is part of package ${APKGNAME}. If you can find out the email address of the maintainer of that package, please email the tarball, it will be appreciated!"
+   ;;
+  esac
+  pupdialog --background green --colors --backtitle "MoManager: Menu edit completed" --msgbox "You have edited \Zb${DESKFILE}\ZB and the menu has been refreshed.
+${TARBALLMSG}
+${DONEMSG}" 0 0
+  export LANG=$ORIGLANG
+  exec momanager reenter
+ ;;
+ edit_top|create_top) #menu categories.
+  APKGNAME='WOOF'
+  if [ "$EXIT" = "edit_top" ];then
+   TOPFILE="$YESTOP_COMBO"
+   cp -f -a /usr/share/desktop-directories/$TOPFILE /tmp/momanager/
+  else
+   TOPFILE="$NOTOP_COMBO"
+   cp -f -a /usr/share/desktop-directories/$TOPFILE /tmp/momanager/
+   sed -i -e "s%^Name=%Name[${ORIGLANG1}]=PLEASE INSERT YOUR TRANSLATION HERE\\nName=%" /usr/share/desktop-directories/$TOPFILE
+  fi
+  sync
+  killall geany 2>/dev/null
+  echo '#!/bin/sh
+  sleep 3
+  yaf-splash -bg yellow -placement top -timeout 9 -text "The menu-category file is now open in a text editor. Edit, then Save, then Quit text editor..."
+  ' > /tmp/momanager/yafmsg4
+  chmod 755 /tmp/momanager/yafmsg4
+  /tmp/momanager/yafmsg4 & #msg has delay so will appear on top of text editor window.
+  ASTAT="`stat --format=%y "/usr/share/desktop-directories/$TOPFILE" | cut -f 1 -d ' ' | tr -d '-' `" #so can check against file version in latest Woof.
+  [ -f ${PATHPREFIX}/usr/share/desktop-directories/$TOPFILE ] && ASTAT="`stat --format=%y "${PATHPREFIX}/usr/share/desktop-directories/$TOPFILE" | cut -f 1 -d ' ' | tr -d '-' `" #get orig modify date.
+  xASTAT1="`stat --format=%Y "/usr/share/desktop-directories/$TOPFILE"`" #seconds since epoch.
+  defaulttexteditor /usr/share/desktop-directories/$TOPFILE
+  xASTAT2="`stat --format=%Y "/usr/share/desktop-directories/$TOPFILE"`" #seconds since epoch.
+
+  if [ "`grep 'PLEASE INSERT YOUR TRANSLATION HERE' /usr/share/desktop-directories/$TOPFILE`" != "" ];then
+   mv -f /tmp/momanager/$TOPFILE /usr/share/desktop-directories/
+   xASTAT2="$xASTAT1"
+  fi
+  if [ "$xASTAT1" = "$xASTAT2" ];then
+   export LANG=$ORIGLANG
+   exec momanager reenter
+  fi
+  yaf-splash -bg '#80FF80' -timeout 3 -text "The menu is being updated..." &
+  LANG=$ORIGLANG /usr/sbin/fixmenus
+  if [ "`pidof jwm`" != "" ];then
+   JWMVER=`jwm -v|head -n1|cut -d ' ' -f2|cut -d - -f2`
+   if vercmp $JWMVER lt 574;then
+    jwm -restart
+   else
+    jwm -reload
+   fi
+  fi
+  cp -f /usr/share/desktop-directories/$TOPFILE /root/
+  #add translation to tarball that user can email to pkg author...
+  cd /root
+  mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/applications
+  cp -f /usr/share/desktop-directories/$TOPFILE /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/applications/
+  echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_FILE=${ASTAT} CATEGORY_FILE='/usr/share/desktop-directories/${TOPFILE}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
   cd /root
-  gzip $DESKFILE
-  mv -f ${DESKFILE}.gz ${ASTAT}_${ADATE}_${ATRANSLANG}_${DESKFILE}.gz
+  mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+  dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+  TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
   case $APKGNAME in
    WOOF)
-    DONEMSG="As this menu file is from Woof, please email it to Barry Kauler \Zbbkauler@gmail.com\ZB, so that all future builds of Puppy may benefit from your translation!"
+    DONEMSG="As this menu file is from Woof, please email the tarball to Barry Kauler \Zbbkauler@gmail.com\ZB, so that all future builds of Puppy may benefit from your translation!"
    ;;
    UNKNOWN)
-    DONEMSG="It is not known which package this menu file is from. However, if you can find out, please email your translated menu file to the maintainer of that package."
+    DONEMSG="It is not known which package this menu file is from. However, if you can find out, please email the tarball to the maintainer of that package."
    ;;
    *)
-    DONEMSG="The menu file is part of package ${APKGNAME}. If you can find out the email address of the maintainer of that package, please email your updated translation, it will be appreciated!"
+    DONEMSG="The menu file is part of package ${APKGNAME}. If you can find out the email address of the maintainer of that package, please email the tarball, it will be appreciated!"
    ;;
   esac
-  pupdialog --background green --colors --backtitle "MoManager: Menu edit completed" --msgbox "You have edited \Zb${DESKFILE}\ZB and the menu has been refreshed. The updated menu file has been gzipped and copied to the /root folder, as file \Zb${ASTAT}_${ADATE}_${ATRANSLANG}_${DESKFILE}.gz\ZB. ${DONEMSG}" 0 0
+  pupdialog --background green --colors --backtitle "MoManager: Menu edit completed" --msgbox "You have edited \Zb${TOPFILE}\ZB and the menu has been refreshed.
+${TARBALLMSG}
+${DONEMSG}" 0 0
+  export LANG=$ORIGLANG
+  exec momanager reenter
+ ;;
+ create_sss) #BK's Simple String Substitution method.
+  APKGNAME="WOOF"
+  SSSFILE="$NOSSS_COMBO" #ex: menu_strings (located at /usr/share/nls/menu_strings/)
+  cp -f /usr/share/nls/$SSSFILE/$SSSFILE /tmp/momanager/$SSSFILE.$ORIGLANG1
+  sync
+  killall geany 2>/dev/null
+  echo '#!/bin/sh
+  sleep 3
+  yaf-splash -bg yellow -placement top -timeout 9 -text "The SSS file is now open in a text editor. You must only edit the TRANSLATION variables. Edit, then Save, then Quit text editor..."
+  ' > /tmp/momanager/yafmsg5
+  chmod 755 /tmp/momanager/yafmsg5
+  /tmp/momanager/yafmsg5 & #msg has delay so will appear on top of text editor window.
+  ASTAT="`stat --format=%y "/usr/share/nls/$SSSFILE/$SSSFILE" | cut -f 1 -d ' ' | tr -d '-'`" #so can check against file version in latest Woof.
+  [ -f ${PATHPREFIX}/usr/share/nls/$SSSFILE/$SSSFILE ] && ASTAT="`stat --format=%y "${PATHPREFIX}/usr/share/nls/$SSSFILE/$SSSFILE" | cut -f 1 -d ' ' | tr -d '-' `" #get orig modify date.
+  xASTAT1="`stat --format=%Y "/tmp/momanager/$SSSFILE.$ORIGLANG1"`" #seconds since epoch.
+  defaulttexteditor /tmp/momanager/$SSSFILE.$ORIGLANG1
+  xASTAT2="`stat --format=%Y "/tmp/momanager/$SSSFILE.$ORIGLANG1"`" #seconds since epoch.
+  if [ "$xASTAT1" = "$xASTAT2" ];then
+   export LANG=$ORIGLANG
+   exec momanager reenter
+  fi
+  cp -f /tmp/momanager/$SSSFILE.$ORIGLANG1 /usr/share/nls/$SSSFILE/
+  yaf-splash -bg '#80FF80' -timeout 3 -text "The menus are being updated..." &
+  LANG=$ORIGLANG /usr/sbin/fixmenus
+  if [ "`pidof jwm`" != "" ];then
+   JWMVER=`jwm -v|head -n1|cut -d ' ' -f2|cut -d - -f2`
+   if vercmp $JWMVER lt 574;then
+    jwm -restart
+   else
+    jwm -reload
+   fi
+  fi
+  echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_FILE=${ASTAT} SSS_FILE='/usr/share/nls/${SSSFILE}/${SSSFILE}.${ORIGLANG1}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
+  mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/nls/${SSSFILE}/
+  cp -f /tmp/momanager/$SSSFILE.$ORIGLANG1 /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/nls/${SSSFILE}/
+  cd /root
+  mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+  dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+  TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
+  DONEMSG="As this SSS file is from Woof, please email the tarball to Barry Kauler \Zbbkauler@gmail.com\ZB, so that all future builds of Puppy may benefit from your translation!"
+  pupdialog --background green --colors --backtitle "MoManager: SSS edit completed" --msgbox "You have edited \Zb${SSSFILE}.${ORIGLANG1}\ZB and the menu has been refreshed.
+${TARBALLMSG}
+${DONEMSG}" 0 0
+  export LANG=$ORIGLANG
+  exec momanager reenter
+ ;;
+ edit_sss)
+  APKGNAME="WOOF"
+  SSSFILE="$YESSSS_COMBO" #ex: menu_strings.de (located at /usr/share/nls/menu_strings/)
+  SSSFILE="`echo -n "$SSSFILE" | rev | cut -f 2-9 -d '.' | rev`" #dump the extension, ex: menu_strings.de -> menu_strings
+  cp -f /usr/share/nls/$SSSFILE/$SSSFILE.$ORIGLANG1 /tmp/momanager/$SSSFILE.$ORIGLANG1
+  #sync with orig SSS file (/usr/share/nls/$SSSFILE/$SSSFILE)...
+  #***TODO***
+  #need to check that all lines in translation file exist/same-as in orig.
+  sync
+  killall geany 2>/dev/null
+  echo '#!/bin/sh
+  sleep 3
+  yaf-splash -bg yellow -placement top -timeout 9 -text "The SSS file is now open in a text editor. You must only edit the TRANSLATION variables. Edit, then Save, then Quit text editor..."
+  ' > /tmp/momanager/yafmsg5
+  chmod 755 /tmp/momanager/yafmsg5
+  /tmp/momanager/yafmsg5 & #msg has delay so will appear on top of text editor window.
+  ASTAT="`stat --format=%y "/usr/share/nls/$SSSFILE/$SSSFILE.$ORIGLANG1" | cut -f 1 -d ' ' | tr -d '-'`" #so can check against file version in latest Woof.
+  [ -f ${PATHPREFIX}/usr/share/nls/$SSSFILE/$SSSFILE.$ORIGLANG1 ] && ASTAT="`stat --format=%y "${PATHPREFIX}/usr/share/nls/$SSSFILE/$SSSFILE.$ORIGLANG1" | cut -f 1 -d ' ' | tr -d '-' `" #get orig modify date.
+  xASTAT1="`stat --format=%Y "/tmp/momanager/$SSSFILE.$ORIGLANG1"`" #seconds since epoch.
+  defaulttexteditor /tmp/momanager/$SSSFILE.$ORIGLANG1
+  xASTAT2="`stat --format=%Y "/tmp/momanager/$SSSFILE.$ORIGLANG1"`" #seconds since epoch.
+  if [ "$xASTAT1" = "$xASTAT2" ];then
+   export LANG=$ORIGLANG
+   exec momanager reenter
+  fi
+  cp -f /tmp/momanager/$SSSFILE.$ORIGLANG1 /usr/share/nls/$SSSFILE/
+  yaf-splash -bg '#80FF80' -timeout 3 -text "The menus are being updated..." &
+  LANG=$ORIGLANG /usr/sbin/fixmenus
+  if [ "`pidof jwm`" != "" ];then
+   JWMVER=`jwm -v|head -n1|cut -d ' ' -f2|cut -d - -f2`
+   if vercmp $JWMVER lt 574;then
+    jwm -restart
+   else
+    jwm -reload
+   fi
+  fi
+  echo "MACTION=${EXIT} TODAY_DATE=${ADATE} ORIG_DATE_FILE=${ASTAT} SSS_FILE='/usr/share/nls/${SSSFILE}/${SSSFILE}.${ORIGLANG1}' AUTHOR='${AUTHORSPECS}'" >> /root/MoManager-${ORIGLANG12}-${APKGNAME}/write.log
+  mkdir -p /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/nls/${SSSFILE}/
+  cp -f /tmp/momanager/$SSSFILE.$ORIGLANG1 /root/MoManager-${ORIGLANG12}-${APKGNAME}/usr/share/nls/${SSSFILE}/
+  cd /root
+  mv -f MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz MoManager-${ORIGLANG12}-${APKGNAME}.tar.gzOLD 2>/dev/null
+  dir2tgz MoManager-${ORIGLANG12}-${APKGNAME}/
+  TARBALLMSG="Translation files that you have created with MoManager have been copied into folder \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}\ZB, and a tarball has been created, \Zb/root/MoManager-${ORIGLANG12}-${APKGNAME}.tar.gz\ZB. Note, it contains \Zbwrite.log\ZB which records the details of each translation file."
+  DONEMSG="As this SSS file is from Woof, please email the tarball to Barry Kauler \Zbbkauler@gmail.com\ZB, so that all future builds of Puppy may benefit from your translation!"
+  pupdialog --background green --colors --backtitle "MoManager: SSS edit completed" --msgbox "You have edited \Zb${SSSFILE}.${ORIGLANG1}\ZB and the menu has been refreshed.
+${TARBALLMSG}
+${DONEMSG}" 0 0
   export LANG=$ORIGLANG
   exec momanager reenter
  ;;
 esac
 
+###END###

Changes to woof-code/rootfs-skeleton/usr/share/nls/menu_strings/menu_strings

@@ -1,1 +1,21 @@
+#These are menu strings that get replaced in Window Manager and tray applications.
+#if a non-English locale, say 'de', /usr/sbin/fixmenus reads /usr/share/nls/menu_strings/menu_strings.de and translates the files.
+#Each code-block below has an identifier, ex [_root_.jwmrc], which identifies the file to be translated -- fixmenus understands this identifier.
+#For anyone who wants to create a menu_strings.* for their language, only the TRANSLATION variables need to be edited, leave the rest as-is.
+# -- the best way to create and edit these SSS files is with MoManager (see Uility menu).
+#CODESTRING: this is a string in the target file, where INSERTMARKER is the text to be translated.
+#ENGLISH: The original target file is already in English, meaning that INSERTMARKER already has the $ENGLISH value.
+#TRANSLATION: INSERTMARKER gets replaced with $TRANSLATION in the non-English target file.
+
+[_root_.jwmrc]
+CODESTRING='<RootMenu label="INSERTMARKER"' ; ENGLISH='Menu'               ; TRANSLATION=''
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Help'               ; TRANSLATION=''
+CODESTRING='<Menu label="INSERTMARKER"'     ; ENGLISH='Shutdown'           ; TRANSLATION=''
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Exit to prompt'     ; TRANSLATION=''
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Reboot computer'    ; TRANSLATION=''
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Power-off computer' ; TRANSLATION=''
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Restart X server'   ; TRANSLATION=''
+CODESTRING='<Restart label="INSERTMARKER"'  ; ENGLISH='Restart JWM'        ; TRANSLATION=''
+
+[_root_.icewm_menu]
 

Changes to woof-code/rootfs-skeleton/usr/share/nls/menu_strings/menu_strings.de

@@ -1,1 +1,22 @@
+#These are menu strings that get replaced in Window Manager and tray applications.
+#if a non-English locale, say 'de', /usr/sbin/fixmenus reads /usr/share/nls/menu_strings/menu_strings.de
+#and translates the files.
+#Each code-block below has an identifier, ex [_root_.jwmrc], which identifies the file to be translated -- fixmenus understands this identifier.
+#For anyone who wants to create a menu_strings.* for their language, only the TRANSLATION variables need to be edited, leave the rest as-is.
+# -- the best way to create and edit these SSS files is with MoManager (see Uility menu).
+#CODESTRING: this is a string in the target file, where INSERTMARKER is the text to be translated.
+#ENGLISH: The original target file is already in English, meaning that INSERTMARKER already has the $ENGLISH value.
+#TRANSLATION: INSERTMARKER gets replaced with $TRANSLATION in the non-English target file.
+
+[_root_.jwmrc]
+CODESTRING='<RootMenu label="INSERTMARKER"' ; ENGLISH='Menu'               ; TRANSLATION='Menü'
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Help'               ; TRANSLATION='Hilfe'
+CODESTRING='<Menu label="INSERTMARKER"'     ; ENGLISH='Shutdown'           ; TRANSLATION='Herunterfahren'
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Exit to prompt'     ; TRANSLATION='Zurück zur Textkonsole'
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Reboot computer'    ; TRANSLATION='Computer neu starten'
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Power-off computer' ; TRANSLATION='Computer ausschalten'
+CODESTRING='<Program label="INSERTMARKER"'  ; ENGLISH='Restart X server'   ; TRANSLATION='X Server neustarten'
+CODESTRING='<Restart label="INSERTMARKER"'  ; ENGLISH='Restart JWM'        ; TRANSLATION='JWM neustarten'
+
+[_root_.icewm_menu]
 

Changes to woof-distro/x86/Packages-puppy-common-official

@@ -353,11 +353,11 @@
 woo-ff-0.1.1|woo-ff|0.1.1||Multimedia|48K||woo-ff-0.1.1.pet|+ffmpeg,+gtkdialog3|woo-ff - multimedia converter||||
 xarchive-0.2.8-8-p4|xarchive|0.2.8-8-p4||Setup|212K||xarchive-0.2.8-8-p4.pet|+gtk+|XArchive archiver|puppy|4||
 xclip-0.10|xclip|0.10||BuildingBlock|60K||xclip-0.10.pet||copy/paste x-selection and clipboard from script|puppy|4||
 xcur2png-0.7.0-p4|xcur2png|0.7.0-p4||BuildingBlock|28K||xcur2png-0.7.0-p4.pet||converter cursor image to png|puppy|4||
 xdelta-30p-w5|xdelta|30p-w5||BuildingBlock|108K||xdelta-30p-w5.pet||Opensource binary diff deltadifferential compression tools|puppy|wary5||
-xdg_puppy-0.7.6-12-p4|xdg_puppy|0.7.6-12-p4||BuildingBlock|328K||xdg_puppy-0.7.6-12-p4.pet||essential XDG utilities developed by rarsa|puppy|4||
+xdg_puppy-0.7.6-13-p4|xdg_puppy|0.7.6-13-p4||BuildingBlock|328K||xdg_puppy-0.7.6-13-p4.pet||essential XDG utilities developed by rarsa, -13 has internationalization support|puppy|4||
 xdialog-2.3.1.pup2|xdialog|2.3.1.pup2||BuildingBlock|70K||xdialog-2.3.1.pup2.pet|+gtk+|gui frontend for scripts|puppy|||
 xlock_gui-0.2-4|xlock_gui|0.2-4||Desktop|60K||xlock_gui-0.2-4.pet|+xlockmore|screen lock and screensaver||||
 xlockmore-5.31-w1|xlockmore|5.31-w1||BuildingBlock|212K||xlockmore-5.31-w1.pet|+xorg_base|screen lock and screensaver|t2|8.0rc||
 xz-4.999.9beta-124-gb637-q1|xz|4.999.9beta-124-gb637-q1||BuildingBlock|280K|pet_packages-quirky|xz-4.999.9beta-124-gb637-q1.pet||file compression/decompression utilities|t2|8.0rc|official|
 xz_DEV-4.999.9beta-124-gb637-q1|xz_DEV|4.999.9beta-124-gb637-q1||BuildingBlock|968K|pet_packages-quirky|xz_DEV-4.999.9beta-124-gb637-q1.pet|+xz|file compression/decompression library|t2|8.0rc|official|