]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
New Glade backend.
authorBruno Haible <bruno@clisp.org>
Mon, 11 Feb 2002 12:10:58 +0000 (12:10 +0000)
committerBruno Haible <bruno@clisp.org>
Sun, 21 Jun 2009 23:18:39 +0000 (01:18 +0200)
12 files changed:
ChangeLog
configure.in
doc/ChangeLog
doc/gettext.texi
src/ChangeLog
src/Makefile.am
src/x-glade.c [new file with mode: 0644]
src/x-glade.h [new file with mode: 0644]
src/xgettext.c
tests/ChangeLog
tests/xgettext-19 [new file with mode: 0755]
tests/xgettext-20 [new file with mode: 0755]

index 89e64152495c112beceab8cd949d95d37e899150..4eadda7822ec39987188a57bc1d76b4654c76fae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2002-01-14  Bruno Haible  <bruno@clisp.org>
+
+       * configure.in: Add check for libexpat.
+
 2002-02-02  Bruno Haible  <bruno@clisp.org>
 
        * Makefile.am (SUBDIRS): Add libuniname.
index fecd9524ced00eec91d8ff4735388b3bc7dae6bc..455087617988fbd401b8249177e8367b705929f3 100644 (file)
@@ -93,6 +93,25 @@ dnl These are the only lines required to internationalize the package.
 dnl (OK, not quite, the AC_OUTPUT has also some parts.)
 AM_GNU_GETTEXT(use-libtool, need-ngettext)
 
+dnl Check for the expat XML parser.
+dnl On operating systems where binary distribution vendors are likely to
+dnl ship both gettext and expat, we use dynamic loading to avoid a hard
+dnl dependency from gettext to expat.
+case "$host_os" in
+  linux*)
+    AC_DEFINE([DYNLOAD_LIBEXPAT], 1,
+      [Define to 1 if libexpat shall be dynamically loaded via dlopen().])
+    LIBEXPAT="-ldl"
+    LTLIBEXPAT="-ldl"
+    AC_SUBST(LIBEXPAT)
+    AC_SUBST(LTLIBEXPAT)
+    ;;
+  *)
+    AC_LIB_HAVE_LINKFLAGS([expat], [],
+      [#include <expat.h>], [XML_ExpatVersion();])
+    ;;
+esac
+
 dnl Check for Emacs and where to install .elc files.
 AM_PATH_LISPDIR
 
index b8f8079aa6875a87a0ac6ada74d43063fc3de3b1..91801f4985cda03f1a0266597c5487b4ff520a6e 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-14  Bruno Haible  <bruno@clisp.org>
+
+       * gettext.texi (Glade): New node.
+
 2002-01-27  Bruno Haible  <bruno@clisp.org>
 
        * gettext.texi (gawk): Update.
index 6edc36dec6d99affa0c5ab62d0205b7c88598fcc..1a4ccbe8c333a7306070bc9baebab0aea80af7c0 100644 (file)
@@ -315,6 +315,7 @@ Internationalizable Data
 
 * POT::                         POT - Portable Object Template
 * RST::                         Resource String Table
+* Glade::                       Glade - GNOME user interface description
 
 Concluding Remarks
 
@@ -7320,6 +7321,7 @@ using GNU gettext.
 @menu
 * POT::                         POT - Portable Object Template
 * RST::                         Resource String Table
+* Glade::                       Glade - GNOME user interface description
 @end menu
 
 @node POT, RST, List of Data Formats, List of Data Formats
@@ -7336,7 +7338,7 @@ gettext
 @code{xgettext}
 @end table
 
-@node RST,  , POT, List of Data Formats
+@node RST, Glade, POT, List of Data Formats
 @subsection Resource String Table
 @cindex RST
 
@@ -7351,6 +7353,20 @@ fpk
 @code{xgettext}, @code{rstconv}
 @end table
 
+@node Glade,  , RST, List of Data Formats
+@subsection Glade - GNOME user interface description
+
+@table @asis
+@item RPMs
+glade, libglade, xml-i18n-tools
+
+@item File extension
+@code{glade}
+
+@item Extractor
+@code{xgettext}, @code{libglade-xgettext}
+@end table
+
 @c This is the template for new data formats.
 @ignore
 
index ef6eb4ce1b11c48e05fa5de4a60aefc04a980d11..dea45cd0d09124a2f04de8a4e055ce3c54eb862e 100644 (file)
@@ -1,3 +1,15 @@
+2002-01-14  Bruno Haible  <bruno@clisp.org>
+
+       * x-glade.h: New file.
+       * x-glade.c: New file.
+       * xgettext.c: Include x-glade.h.
+       (main): Call x_glade_extract_all, x_glade_keyword.
+       (language_to_scanner): Add glade rule.
+       (extension_to_language): Add glade rule.
+       * Makefile.am (noinst_HEADERS): Add x-glade.h.
+       (xgettext_SOURCES): Add x-glade.c.
+       (xgettext_LDADD): Add @LTLIBEXPAT@.
+
 2002-01-27  Bruno Haible  <bruno@clisp.org>
 
        * message.h (format_type): New enum value 'format_awk'.
index 1b5ed1fb22e45416a347462375abde5eeaa23f1f..9eeaca99dcae18151973955d9958c40d7e7cb426 100644 (file)
@@ -33,7 +33,7 @@ po-gram-gen.h po-hash-gen.h msgl-charset.h msgl-equal.h msgl-iconv.h \
 msgl-ascii.h msgl-cat.h msgl-english.h msgfmt.h msgunfmt.h read-mo.h \
 write-mo.h read-java.h write-java.h po-time.h plural-table.h format.h \
 xgettext.h x-c.h x-po.h x-python.h x-lisp.h x-elisp.h x-librep.h x-java.h \
-x-awk.h x-ycp.h x-rst.h
+x-awk.h x-ycp.h x-rst.h x-glade.h
 
 EXTRA_DIST = FILES project-id \
 gnu/gettext/DumpResource.java gnu/gettext/GetURL.java
@@ -88,7 +88,7 @@ msgmerge_SOURCES = msgmerge.c
 msgunfmt_SOURCES = msgunfmt.c read-mo.c read-java.c
 xgettext_SOURCES = xgettext.c \
   x-c.c x-po.c x-python.c x-lisp.c x-elisp.c x-librep.c x-java.l x-awk.c \
-  x-ycp.c x-rst.c
+  x-ycp.c x-rst.c x-glade.c
 msgattrib_SOURCES = msgattrib.c
 msgcat_SOURCES = msgcat.c
 msgcomm_SOURCES = msgcomm.c
@@ -118,7 +118,7 @@ msgcmp_LDADD = libgettextsrc.la
 msgfmt_LDADD = libgettextsrc.la
 msgmerge_LDADD = libgettextsrc.la
 msgunfmt_LDADD = libgettextsrc.la
-xgettext_LDADD = libgettextsrc.la $(LIBUNINAME)
+xgettext_LDADD = libgettextsrc.la $(LIBUNINAME) @LTLIBEXPAT@
 msgattrib_LDADD = libgettextsrc.la
 msgcat_LDADD = libgettextsrc.la
 msgcomm_LDADD = libgettextsrc.la
diff --git a/src/x-glade.c b/src/x-glade.c
new file mode 100644 (file)
index 0000000..10d1f2f
--- /dev/null
@@ -0,0 +1,451 @@
+/* xgettext glade backend.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+
+   This file was written by Bruno Haible <haible@clisp.cons.org>, 2002.
+
+   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, 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 <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if DYNLOAD_LIBEXPAT
+# include <dlfcn.h>
+#else
+# if HAVE_LIBEXPAT
+#  include <expat.h>
+# endif
+#endif
+
+#include "message.h"
+#include "x-glade.h"
+#include "xgettext.h"
+#include "error.h"
+#include "xerror.h"
+#include "basename.h"
+#include "progname.h"
+#include "xmalloc.h"
+#include "exit.h"
+#include "hash.h"
+#include "po-charset.h"
+#include "msgl-ascii.h"
+#include "msgl-iconv.h"
+#include "gettext.h"
+
+#define _(s) gettext(s)
+
+
+/* glade is an XML based format.  Some example files are contained in
+   libglade-0.16.  */
+
+
+/* Prototypes for local functions.  Needed to ensure compiler checking of
+   function argument counts despite of K&R C function definition syntax.  */
+static void init_keywords PARAMS ((void));
+
+
+/* ====================== Keyword set customization.  ====================== */
+
+/* If true extract all strings.  */
+static bool extract_all = false;
+
+static hash_table keywords;
+static bool default_keywords = true;
+
+
+void
+x_glade_extract_all ()
+{
+  extract_all = true;
+}
+
+
+void
+x_glade_keyword (name)
+     const char *name;
+{
+  if (name == NULL)
+    default_keywords = false;
+  else
+    {
+      if (keywords.table == NULL)
+       init_hash (&keywords, 100);
+
+      insert_entry (&keywords, name, strlen (name), NULL);
+    }
+}
+
+/* Finish initializing the keywords hash table.
+   Called after argument processing, before each file is processed.  */
+static void
+init_keywords ()
+{
+  if (default_keywords)
+    {
+      x_glade_keyword ("label");
+      x_glade_keyword ("title");
+      x_glade_keyword ("text");
+      x_glade_keyword ("format");
+      x_glade_keyword ("copyright");
+      x_glade_keyword ("comments");
+      x_glade_keyword ("preview_text");
+      x_glade_keyword ("tooltip");
+      default_keywords = false;
+    }
+}
+
+
+/* ===================== Dynamic loading of libexpat.  ===================== */
+
+#if DYNLOAD_LIBEXPAT
+
+/* Prototypes for local functions.  Needed to ensure compiler checking of
+   function argument counts despite of K&R C function definition syntax.  */
+static bool load_libexpat PARAMS ((void));
+
+typedef void *XML_Parser;
+typedef char XML_Char;
+typedef char XML_LChar;
+enum XML_Error { XML_ERROR_NONE };
+typedef void (*XML_StartElementHandler) PARAMS ((void *userData, const XML_Char *name, const XML_Char **atts));
+typedef void (*XML_EndElementHandler) PARAMS ((void *userData, const XML_Char *name));
+typedef void (*XML_CharacterDataHandler) PARAMS ((void *userData, const XML_Char *s, int len));
+typedef void (*XML_CommentHandler) PARAMS ((void *userData, const XML_Char *data));
+
+static XML_Parser (*p_XML_ParserCreate) PARAMS ((const XML_Char *encoding));
+static void (*p_XML_SetElementHandler) PARAMS ((XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end));
+static void (*p_XML_SetCharacterDataHandler) PARAMS ((XML_Parser parser, XML_CharacterDataHandler handler));
+static void (*p_XML_SetCommentHandler) PARAMS ((XML_Parser parser, XML_CommentHandler handler));
+static int (*p_XML_Parse) PARAMS ((XML_Parser parser, const char *s, int len, int isFinal));
+static enum XML_Error (*p_XML_GetErrorCode) PARAMS ((XML_Parser parser));
+static int (*p_XML_GetCurrentLineNumber) PARAMS ((XML_Parser parser));
+static int (*p_XML_GetCurrentColumnNumber) PARAMS ((XML_Parser parser));
+static void (*p_XML_ParserFree) PARAMS ((XML_Parser parser));
+static const XML_LChar * (*p_XML_ErrorString) PARAMS ((int code));
+
+#define XML_ParserCreate (*p_XML_ParserCreate)
+#define XML_SetElementHandler (*p_XML_SetElementHandler)
+#define XML_SetCharacterDataHandler (*p_XML_SetCharacterDataHandler)
+#define XML_SetCommentHandler (*p_XML_SetCommentHandler)
+#define XML_Parse (*p_XML_Parse)
+#define XML_GetErrorCode (*p_XML_GetErrorCode)
+#define XML_GetCurrentLineNumber (*p_XML_GetCurrentLineNumber)
+#define XML_GetCurrentColumnNumber (*p_XML_GetCurrentColumnNumber)
+#define XML_ParserFree (*p_XML_ParserFree)
+#define XML_ErrorString (*p_XML_ErrorString)
+
+static int libexpat_loaded = 0;
+
+static bool
+load_libexpat ()
+{
+  if (libexpat_loaded == 0)
+    {
+      void *handle = dlopen ("libexpat.so.0", RTLD_LAZY);
+      if (handle != NULL
+         && (p_XML_ParserCreate = dlsym (handle, "XML_ParserCreate")) != NULL
+         && (p_XML_SetElementHandler = dlsym (handle, "XML_SetElementHandler")) != NULL
+         && (p_XML_SetCharacterDataHandler = dlsym (handle, "XML_SetCharacterDataHandler")) != NULL
+         && (p_XML_SetCommentHandler = dlsym (handle, "XML_SetCommentHandler")) != NULL
+         && (p_XML_Parse = dlsym (handle, "XML_Parse")) != NULL
+         && (p_XML_GetErrorCode = dlsym (handle, "XML_GetErrorCode")) != NULL
+         && (p_XML_GetCurrentLineNumber = dlsym (handle, "XML_GetCurrentLineNumber")) != NULL
+         && (p_XML_GetCurrentColumnNumber = dlsym (handle, "XML_GetCurrentColumnNumber")) != NULL
+         && (p_XML_ParserFree = dlsym (handle, "XML_ParserFree")) != NULL
+         && (p_XML_ErrorString = dlsym (handle, "XML_ErrorString")) != NULL)
+       libexpat_loaded = 1;
+      else
+       libexpat_loaded = -1;
+    }
+  return libexpat_loaded >= 0;
+}
+
+#define LIBEXPAT_AVAILABLE() (load_libexpat ())
+
+#elif HAVE_LIBEXPAT
+
+#define LIBEXPAT_AVAILABLE() true
+
+#endif
+
+/* ============================= XML parsing.  ============================= */
+
+#if DYNLOAD_LIBEXPAT || HAVE_LIBEXPAT
+
+/* Prototypes for local functions.  Needed to ensure compiler checking of
+   function argument counts despite of K&R C function definition syntax.  */
+static void ensure_stack_size PARAMS ((size_t size));
+static void start_element_handler PARAMS ((void *userData, const char *name,
+                                          const char **attributes));
+static void end_element_handler PARAMS ((void *userData, const char *name));
+static void character_data_handler PARAMS ((void *userData, const char *s,
+                                           int len));
+static void comment_handler PARAMS ((void *userData, const char *data));
+static void do_extract_glade PARAMS ((FILE *fp, const char *real_filename,
+                                     const char *logical_filename,
+                                     msgdomain_list_ty *mdlp));
+
+
+/* Accumulator for the extracted messages.  */
+static message_list_ty *mlp; 
+
+/* Logical filename, used to label the extracted messages.  */
+static char *logical_file_name;
+
+/* XML parser.  */
+static XML_Parser parser;
+
+struct element_state
+{
+  bool extract_string;
+  int lineno;
+  char *buffer;
+  size_t bufmax;
+  size_t buflen;
+};
+static struct element_state *stack;
+static size_t stack_size;
+
+/* Ensures stack_size >= size.  */
+static void
+ensure_stack_size (size)
+     size_t size;
+{
+  if (size > stack_size)
+    {
+      stack_size = 2 * stack_size;
+      if (stack_size < size)
+       stack_size = size;
+      stack =
+       (struct element_state *)
+       xrealloc (stack, stack_size * sizeof (struct element_state));
+    }
+}
+
+static size_t stack_depth;
+
+/* Callback called when <element> is seen.  */
+static void
+start_element_handler (userData, name, attributes)
+     void *userData;
+     const char *name;
+     const char **attributes;
+{
+  struct element_state *p;
+  void *hash_result;
+
+  /* Increase stack depth.  */
+  stack_depth++;
+  ensure_stack_size (stack_depth + 1);
+
+  /* Don't extract a string for the containing element.  */
+  stack[stack_depth - 1].extract_string = false;
+
+  p = &stack[stack_depth];
+  p->extract_string =
+    (find_entry (&keywords, name, strlen (name), &hash_result) == 0);
+  p->lineno = XML_GetCurrentLineNumber (parser);
+  p->buffer = NULL;
+  p->bufmax = 0;
+  p->buflen = 0;
+  if (!p->extract_string)
+    xgettext_comment_reset ();
+}
+
+/* Callback called when </element> is seen.  */
+static void
+end_element_handler (userData, name)
+     void *userData;
+     const char *name;
+{
+  struct element_state *p = &stack[stack_depth];
+
+  /* Actually extract string.  */
+  if (p->extract_string)
+    {
+      /* Don't extract the empty string.  */
+      if (p->buflen > 0)
+       {
+         lex_pos_ty pos;
+
+         if (p->buflen == p->bufmax)
+           p->buffer = (char *) xrealloc (p->buffer, p->buflen + 1);
+         p->buffer[p->buflen] = '\0';
+
+         pos.file_name = logical_file_name;
+         pos.line_number = p->lineno;
+
+         remember_a_message (mlp, p->buffer, &pos);
+         p->buffer = NULL;
+       }
+    }
+
+  /* Free memory for this stack level.  */
+  if (p->buffer != NULL)
+    free (p->buffer);
+
+  /* Decrease stack depth.  */
+  stack_depth--;
+
+  xgettext_comment_reset ();
+}
+
+/* Callback called when some text is seen.  */
+static void
+character_data_handler (userData, s, len)
+     void *userData;
+     const char *s;
+     int len;
+{
+  struct element_state *p = &stack[stack_depth];
+
+  /* Accumulate character data.  */
+  if (len > 0)
+    {
+      if (p->buflen + len > p->bufmax)
+       {
+         p->bufmax = 2 * p->bufmax;
+         if (p->bufmax < p->buflen + len)
+           p->bufmax = p->buflen + len;
+         p->buffer = (char *) xrealloc (p->buffer, p->bufmax);
+       }
+      memcpy (p->buffer + p->buflen, s, len);
+      p->buflen += len;
+    }
+}
+
+/* Callback called when some comment text is seen.  */
+static void
+comment_handler (userData, data)
+     void *userData;
+     const char *data;
+{
+  /* Split multiline comment into lines, and remove leading and trailing
+     whitespace.  */
+  char *copy = xstrdup (data);
+  char *p = copy;
+  char *q;
+
+  for (p = copy; (q = strchr (p, '\n')) != NULL; p = q + 1)
+    {
+      while (p[0] == ' ' || p[0] == '\t')
+       p++;
+      while (q > p && (q[-1] == ' ' || q[-1] == '\t'))
+       q--;
+      *q = '\0';
+      xgettext_comment_add (p);
+    }
+  q = p + strlen (p);
+  while (p[0] == ' ' || p[0] == '\t')
+    p++;
+  while (q > p && (q[-1] == ' ' || q[-1] == '\t'))
+    q--;
+  *q = '\0';
+  xgettext_comment_add (p);
+  free (copy);
+}
+
+
+static void
+do_extract_glade (fp, real_filename, logical_filename, mdlp)
+     FILE *fp;
+     const char *real_filename;
+     const char *logical_filename;
+     msgdomain_list_ty *mdlp;
+{
+  mlp = mdlp->item[0]->messages;
+
+  logical_file_name = xstrdup (logical_filename);
+
+  init_keywords ();
+
+  parser = XML_ParserCreate (NULL);
+  if (parser == NULL)
+    error (EXIT_FAILURE, 0, _("memory exhausted"));
+
+  XML_SetElementHandler (parser, start_element_handler, end_element_handler);
+  XML_SetCharacterDataHandler (parser, character_data_handler);
+  XML_SetCommentHandler (parser, comment_handler);
+
+  while (!feof (fp))
+    {
+      char buf[4096];
+      int count = fread (buf, 1, sizeof buf, fp);
+
+      if (count == 0)
+       {
+         if (ferror (fp))
+           error (EXIT_FAILURE, errno, _("\
+error while reading \"%s\""), real_filename);
+         /* EOF reached.  */
+         break;
+       }
+
+      if (XML_Parse (parser, buf, count, 0) == 0)
+       error (EXIT_FAILURE, 0, _("%s:%d:%d: %s"), logical_filename,
+              XML_GetCurrentLineNumber (parser),
+              XML_GetCurrentColumnNumber (parser) + 1,
+              XML_ErrorString (XML_GetErrorCode (parser)));
+    }
+
+  if (XML_Parse (parser, NULL, 0, 1) == 0)
+    error (EXIT_FAILURE, 0, _("%s:%d:%d: %s"), logical_filename,
+          XML_GetCurrentLineNumber (parser),
+          XML_GetCurrentColumnNumber (parser) + 1,
+          XML_ErrorString (XML_GetErrorCode (parser)));
+
+  XML_ParserFree (parser);
+
+  /* expat feeds us strings in UTF-8 encoding.  If not all the strings
+     were plain ASCII, set the charset in the header to UTF-8.  */
+  if (!is_ascii_message_list (mlp))
+    {
+      const char *canon_utf_8 = po_charset_canonicalize ("UTF-8");
+      iconv_message_list (mlp, canon_utf_8, canon_utf_8);
+    }
+
+  /* Close scanner.  */
+  logical_file_name = NULL;
+  parser = NULL;
+}
+
+#endif
+
+void
+extract_glade (fp, real_filename, logical_filename, mdlp)
+     FILE *fp;
+     const char *real_filename;
+     const char *logical_filename;
+     msgdomain_list_ty *mdlp;
+{
+#if DYNLOAD_LIBEXPAT || HAVE_LIBEXPAT
+  if (LIBEXPAT_AVAILABLE ())
+    do_extract_glade (fp, real_filename, logical_filename, mdlp);
+  else
+#endif
+    {
+      multiline_error (xstrdup (""),
+                      xasprintf (_("\
+Language \"glade\" is not supported. %s relies on expat.\n\
+This version was built without expat.\n"),
+                                 basename (program_name)));
+      exit (EXIT_FAILURE);
+    }
+}
diff --git a/src/x-glade.h b/src/x-glade.h
new file mode 100644 (file)
index 0000000..3d9672a
--- /dev/null
@@ -0,0 +1,35 @@
+/* xgettext glade backend.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2002.
+
+   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, 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.  */
+
+
+#define EXTENSIONS_GLADE \
+  { "glade",     "glade"    },                                         \
+
+#define SCANNERS_GLADE \
+  { "glade",      extract_glade, NULL },                               \
+
+/* Scan a glade XML file and add its translatable strings to mdlp.  */
+extern void extract_glade PARAMS ((FILE *fp, const char *real_filename,
+                                  const char *logical_filename,
+                                  msgdomain_list_ty *mdlp));
+
+
+/* Handling of options specific to this language.  */
+
+extern void x_glade_extract_all PARAMS ((void));
+extern void x_glade_keyword PARAMS ((const char *name));
index 11f174ddd53edc8437099d75c19c3ccb4145ca4e..c9381be3ae9f371c1a3b922d8104590ae6d3a395 100644 (file)
@@ -67,6 +67,7 @@
 #include "x-awk.h"
 #include "x-ycp.h"
 #include "x-rst.h"
+#include "x-glade.h"
 
 
 /* If nonzero add all comments immediately preceding one of the keywords. */
@@ -231,6 +232,7 @@ main (argc, argv)
        x_librep_extract_all ();
        x_java_extract_all ();
        x_awk_extract_all ();
+       x_glade_extract_all ();
        break;
       case 'c':
        if (optarg == NULL)
@@ -287,6 +289,7 @@ main (argc, argv)
            x_librep_keyword (optarg);
            x_java_keyword (optarg);
            x_awk_keyword (optarg);
+           x_glade_keyword (optarg);
          }
        break;
       case 'K':
@@ -1258,6 +1261,7 @@ language_to_extractor (name)
     SCANNERS_AWK
     SCANNERS_YCP
     SCANNERS_RST
+    SCANNERS_GLADE
     /* Here will follow more languages and their scanners: perl, etc...
        Make sure new scanners honor the --exclude-file option.  */
   };
@@ -1302,6 +1306,7 @@ extension_to_language (extension)
     EXTENSIONS_AWK
     EXTENSIONS_YCP
     EXTENSIONS_RST
+    EXTENSIONS_GLADE
     /* Here will follow more file extensions: sh, pl, tcl ... */
   };
 
index 762397c17435dd641272600a9b4b46469b054284..90422d5a1d3e2842b2130d15514d5ea94405519c 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-28  Bruno Haible  <bruno@clisp.org>
+
+       * xgettext-19: New file.
+       * xgettext-20: New file.
+       * Makefile.am (TESTS): Add them.
+
 2002-01-27  Bruno Haible  <bruno@clisp.org>
 
        * format-awk-1: New file.
diff --git a/tests/xgettext-19 b/tests/xgettext-19
new file mode 100755 (executable)
index 0000000..eb575d6
--- /dev/null
@@ -0,0 +1,1569 @@
+#!/bin/sh
+
+# Test of Glade support.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles empty.glade"
+cat <<EOF > empty.glade
+<?xml version="1.0"?>
+<GTK-Interface/>
+EOF
+
+tmpfiles="$tmpfiles xg-test19.pot"
+: ${XGETTEXT=xgettext}
+${XGETTEXT} -o xg-test19.pot empty.glade 2>/dev/null
+test $? = 0 || { echo "SKIP: xgettext-19"; rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles widgets.glade"
+cat <<EOF > widgets.glade
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+  <name>project1</name>
+  <directory></directory>
+  <source_directory>src</source_directory>
+  <pixmaps_directory></pixmaps_directory>
+  <language>C</language>
+  <gnome_support>True</gnome_support>
+  <gettext_support>True</gettext_support>
+  <use_widget_names>False</use_widget_names>
+  <output_main_file>True</output_main_file>
+  <output_support_files>True</output_support_files>
+  <output_build_files>True</output_build_files>
+  <backup_source_files>True</backup_source_files>
+  <main_source_file>interface.c</main_source_file>
+  <main_header_file>interface.h</main_header_file>
+  <handler_source_file>callbacks.c</handler_source_file>
+  <handler_header_file>callbacks.h</handler_header_file>
+  <support_source_file>support.c</support_source_file>
+  <support_header_file>support.h</support_header_file>
+</project>
+
+<widget>
+  <class>GnomeApp</class>
+  <name>appwin</name>
+  <signal>
+    <name>destroy</name>
+    <handler>gtk_main_quit</handler>
+    <last_modification_time>Thu, 17 Jun 1999 15:06:07 GMT</last_modification_time>
+  </signal>
+  <title>Libglade-GNOME Test</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+  <enable_layout_config>True</enable_layout_config>
+
+  <widget>
+    <class>GnomeDock</class>
+    <child_name>GnomeApp:dock</child_name>
+    <name>dock1</name>
+    <allow_floating>True</allow_floating>
+    <child>
+      <padding>0</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+
+    <widget>
+      <class>GnomeDockItem</class>
+      <name>dockitem1</name>
+      <border_width>2</border_width>
+      <placement>GNOME_DOCK_TOP</placement>
+      <band>0</band>
+      <position>0</position>
+      <offset>0</offset>
+      <locked>False</locked>
+      <exclusive>False</exclusive>
+      <never_floating>False</never_floating>
+      <never_vertical>True</never_vertical>
+      <never_horizontal>False</never_horizontal>
+      <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+      <widget>
+       <class>GtkMenuBar</class>
+       <name>menubar1</name>
+       <shadow_type>GTK_SHADOW_NONE</shadow_type>
+
+       <widget>
+         <class>GtkMenuItem</class>
+         <name>file1</name>
+         <stock_item>GNOMEUIINFO_MENU_FILE_TREE</stock_item>
+
+         <widget>
+           <class>GtkMenu</class>
+           <name>file1_menu</name>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>open2</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>filesel</object>
+               <last_modification_time>Thu, 17 Jun 1999 15:03:18 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_OPEN_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkMenuItem</class>
+             <name>show_tests1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>testwin</object>
+               <last_modification_time>Thu, 17 Jun 1999 14:52:01 GMT</last_modification_time>
+             </signal>
+             <label>Show _Tests</label>
+             <right_justify>False</right_justify>
+           </widget>
+
+           <widget>
+             <class>GtkMenuItem</class>
+             <name>druid_test1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>druidwin</object>
+               <last_modification_time>Thu, 28 Oct 1999 15:53:37 GMT</last_modification_time>
+             </signal>
+             <label>Druid Test</label>
+             <right_justify>False</right_justify>
+           </widget>
+
+           <widget>
+             <class>GtkMenuItem</class>
+             <name>separator2</name>
+             <right_justify>False</right_justify>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>exit1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>closebox</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:44:23 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_EXIT_ITEM</stock_item>
+           </widget>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GtkMenuItem</class>
+         <name>edit1</name>
+         <stock_item>GNOMEUIINFO_MENU_EDIT_TREE</stock_item>
+
+         <widget>
+           <class>GtkMenu</class>
+           <name>edit1_menu</name>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>undo1</name>
+             <stock_item>GNOMEUIINFO_MENU_UNDO_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>redo1</name>
+             <stock_item>GNOMEUIINFO_MENU_REDO_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkMenuItem</class>
+             <name>separator3</name>
+             <right_justify>False</right_justify>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>cut1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_editable_cut_clipboard</handler>
+               <object>textbox</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:34:00 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_CUT_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>copy1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_editable_copy_clipboard</handler>
+               <object>textbox</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:34:21 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_COPY_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>paste1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_editable_paste_clipboard</handler>
+               <object>textbox</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:34:47 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_PASTE_ITEM</stock_item>
+           </widget>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>clear1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_editable_delete_selection</handler>
+               <object>textbox</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:35:04 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_CLEAR_ITEM</stock_item>
+           </widget>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GtkMenuItem</class>
+         <name>settings1</name>
+         <stock_item>GNOMEUIINFO_MENU_SETTINGS_TREE</stock_item>
+
+         <widget>
+           <class>GtkMenu</class>
+           <name>settings1_menu</name>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>preferences1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>propbox</object>
+               <last_modification_time>Tue, 28 Sep 1999 04:29:36 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_PREFERENCES_ITEM</stock_item>
+           </widget>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GtkMenuItem</class>
+         <name>help1</name>
+         <stock_item>GNOMEUIINFO_MENU_HELP_TREE</stock_item>
+
+         <widget>
+           <class>GtkMenu</class>
+           <name>help1_menu</name>
+
+           <widget>
+             <class>GtkPixmapMenuItem</class>
+             <name>about1</name>
+             <signal>
+               <name>activate</name>
+               <handler>gtk_widget_show</handler>
+               <object>aboutwin</object>
+               <last_modification_time>Thu, 17 Jun 1999 07:38:13 GMT</last_modification_time>
+             </signal>
+             <stock_item>GNOMEUIINFO_MENU_ABOUT_ITEM</stock_item>
+           </widget>
+         </widget>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GnomeDockItem</class>
+      <name>dockitem2</name>
+      <border_width>1</border_width>
+      <placement>GNOME_DOCK_TOP</placement>
+      <band>1</band>
+      <position>0</position>
+      <offset>0</offset>
+      <locked>False</locked>
+      <exclusive>False</exclusive>
+      <never_floating>False</never_floating>
+      <never_vertical>False</never_vertical>
+      <never_horizontal>False</never_horizontal>
+      <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+      <widget>
+       <class>GtkToolbar</class>
+       <name>toolbar1</name>
+       <border_width>1</border_width>
+       <orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
+       <type>GTK_TOOLBAR_BOTH</type>
+       <space_size>16</space_size>
+       <space_style>GTK_TOOLBAR_SPACE_LINE</space_style>
+       <relief>GTK_RELIEF_NONE</relief>
+       <tooltips>True</tooltips>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button1</name>
+         <label>New</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_NEW</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button2</name>
+         <label>Open</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_OPEN</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button3</name>
+         <label>Save</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_SAVE</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button4</name>
+         <signal>
+           <name>clicked</name>
+           <handler>gtk_editable_cut_clipboard</handler>
+           <object>textbox</object>
+           <last_modification_time>Thu, 17 Jun 1999 07:31:19 GMT</last_modification_time>
+         </signal>
+         <label>Cut</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_CUT</stock_pixmap>
+         <child>
+           <new_group>True</new_group>
+         </child>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button5</name>
+         <signal>
+           <name>clicked</name>
+           <handler>gtk_editable_copy_clipboard</handler>
+           <object>textbox</object>
+           <last_modification_time>Thu, 17 Jun 1999 07:32:16 GMT</last_modification_time>
+         </signal>
+         <label>Copy</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_COPY</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button6</name>
+         <signal>
+           <name>clicked</name>
+           <handler>gtk_editable_paste_clipboard</handler>
+           <object>textbox</object>
+           <last_modification_time>Thu, 17 Jun 1999 07:33:13 GMT</last_modification_time>
+         </signal>
+         <label>Paste</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_PASTE</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>button7</name>
+         <signal>
+           <name>clicked</name>
+           <handler>gtk_editable_delete_selection</handler>
+           <object>textbox</object>
+           <last_modification_time>Thu, 17 Jun 1999 07:33:30 GMT</last_modification_time>
+         </signal>
+         <label>Clear</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_CLEAR</stock_pixmap>
+       </widget>
+
+       <widget>
+         <class>GtkToggleButton</class>
+         <child_name>Toolbar:button</child_name>
+         <name>togglebutton1</name>
+         <label>Tog</label>
+         <stock_pixmap>GNOME_STOCK_PIXMAP_ATTACH</stock_pixmap>
+         <active>False</active>
+         <child>
+           <new_group>True</new_group>
+         </child>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkText</class>
+      <child_name>GnomeDock:contents</child_name>
+      <name>textbox</name>
+      <can_focus>True</can_focus>
+      <has_focus>True</has_focus>
+      <editable>True</editable>
+      <text>The cut copy paste and clear buttons should work correctly.</text>
+    </widget>
+  </widget>
+
+  <widget>
+    <class>GnomeAppBar</class>
+    <child_name>GnomeApp:appbar</child_name>
+    <name>appbar1</name>
+    <has_progress>False</has_progress>
+    <has_status>True</has_status>
+    <child>
+      <padding>0</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+  </widget>
+</widget>
+
+<widget>
+  <class>GnomeAbout</class>
+  <name>aboutwin</name>
+  <visible>False</visible>
+  <signal>
+    <name>clicked</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Thu, 17 Jun 1999 07:37:41 GMT</last_modification_time>
+  </signal>
+  <modal>True</modal>
+  <copyright>Copyright (C) 1999</copyright>
+  <authors>James Henstridge &lt;james@daa.com.au&gt;
+</authors>
+  <comments>A simple program demonstrating what is possible with GNOME and
+libglade.  This interface has been coded entirely with GLADE, and
+no C code specific to this interface has been written.</comments>
+</widget>
+
+<widget>
+  <class>GnomeMessageBox</class>
+  <name>closebox</name>
+  <visible>False</visible>
+  <message_box_type>GNOME_MESSAGE_BOX_QUESTION</message_box_type>
+  <message>Are you sure you want to quit
+the application?</message>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>False</allow_grow>
+  <auto_shrink>False</auto_shrink>
+  <auto_close>True</auto_close>
+  <hide_on_close>False</hide_on_close>
+
+  <widget>
+    <class>GtkVBox</class>
+    <child_name>GnomeDialog:vbox</child_name>
+    <name>dialog-vbox1</name>
+    <homogeneous>False</homogeneous>
+    <spacing>8</spacing>
+    <child>
+      <padding>4</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+
+    <widget>
+      <class>GtkHButtonBox</class>
+      <child_name>GnomeDialog:action_area</child_name>
+      <name>dialog-action_area1</name>
+      <layout_style>GTK_BUTTONBOX_END</layout_style>
+      <spacing>8</spacing>
+      <child_min_width>85</child_min_width>
+      <child_min_height>27</child_min_height>
+      <child_ipad_x>7</child_ipad_x>
+      <child_ipad_y>0</child_ipad_y>
+      <child>
+       <padding>0</padding>
+       <expand>False</expand>
+       <fill>True</fill>
+       <pack>GTK_PACK_END</pack>
+      </child>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>button8</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <signal>
+         <name>clicked</name>
+         <handler>gtk_main_quit</handler>
+         <last_modification_time>Sat, 19 Jun 1999 13:56:42 GMT</last_modification_time>
+       </signal>
+       <stock_button>GNOME_STOCK_BUTTON_YES</stock_button>
+      </widget>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>button9</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <signal>
+         <name>clicked</name>
+         <handler>gtk_widget_hide</handler>
+         <object>closebox</object>
+         <last_modification_time>Sat, 19 Jun 1999 13:56:56 GMT</last_modification_time>
+       </signal>
+       <stock_button>GNOME_STOCK_BUTTON_NO</stock_button>
+      </widget>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>button11</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <label>X</label>
+       <stock_pixmap>GNOME_STOCK_PIXMAP_OPEN</stock_pixmap>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>testwin</name>
+  <visible>False</visible>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Thu, 17 Jun 1999 14:53:15 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_true</handler>
+    <last_modification_time>Thu, 17 Jun 1999 14:53:29 GMT</last_modification_time>
+  </signal>
+  <title>Widget Tests</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkNotebook</class>
+    <name>notebook1</name>
+    <can_focus>True</can_focus>
+    <show_tabs>True</show_tabs>
+    <show_border>True</show_border>
+    <tab_pos>GTK_POS_TOP</tab_pos>
+    <scrollable>True</scrollable>
+    <tab_hborder>2</tab_hborder>
+    <tab_vborder>2</tab_vborder>
+    <popup_enable>False</popup_enable>
+
+    <widget>
+      <class>GnomeColorPicker</class>
+      <name>colorpicker1</name>
+      <border_width>100</border_width>
+      <can_focus>True</can_focus>
+      <dither>True</dither>
+      <use_alpha>False</use_alpha>
+      <title>Pick a colour</title>
+      <tooltip>Pick a colour</tooltip>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label1</name>
+      <label>Colour Picker</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeFontPicker</class>
+      <name>fontpicker1</name>
+      <border_width>75</border_width>
+      <can_focus>True</can_focus>
+      <title>Pick a Font</title>
+      <preview_text>AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz</preview_text>
+      <mode>GNOME_FONT_PICKER_MODE_FONT_INFO</mode>
+      <show_size>True</show_size>
+      <use_font>True</use_font>
+      <use_font_size>14</use_font_size>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label2</name>
+      <label>Font Picker</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeIconEntry</class>
+      <name>iconentry1</name>
+      <!-- The welcome greeting -->
+      <title>Hello</title>
+      <history_id>iconent_hist</history_id>
+      <max_saved>10</max_saved>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label3</name>
+      <label>Icon Sel</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeHRef</class>
+      <name>href1</name>
+      <border_width>150</border_width>
+      <can_focus>True</can_focus>
+      <url>http://www.daa.com.au/~james/gnome/</url>
+      <label>My Gnome Site</label>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label4</name>
+      <label>HRef</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeEntry</class>
+      <name>entry1</name>
+      <history_id>EntTest</history_id>
+      <max_saved>10</max_saved>
+
+      <widget>
+       <class>GtkEntry</class>
+       <child_name>GnomeEntry:entry</child_name>
+       <name>entry2</name>
+       <can_focus>True</can_focus>
+       <editable>True</editable>
+       <text_visible>True</text_visible>
+       <text_max_length>0</text_max_length>
+       <text></text>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label5</name>
+      <label>Entry</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeFileEntry</class>
+      <name>fileentry1</name>
+      <border_width>50</border_width>
+      <history_id>FileEntTest</history_id>
+      <max_saved>10</max_saved>
+      <directory>False</directory>
+      <modal>False</modal>
+
+      <widget>
+       <class>GtkEntry</class>
+       <child_name>GnomeEntry:entry</child_name>
+       <name>entry3</name>
+       <can_focus>True</can_focus>
+       <editable>True</editable>
+       <text_visible>True</text_visible>
+       <text_max_length>0</text_max_length>
+       <text></text>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label6</name>
+      <label>File Entry</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GtkDial</class>
+      <name>dial1</name>
+      <view_only>False</view_only>
+      <update_policy>GTK_UPDATE_CONTINUOUS</update_policy>
+      <value>0</value>
+      <lower>0</lower>
+      <upper>100</upper>
+      <step>0</step>
+      <page>0</page>
+      <page_size>0</page_size>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label7</name>
+      <label>Dial</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GtkClock</class>
+      <name>clock1</name>
+      <!-- This comment is ignored.  -->
+      <type>GTK_CLOCK_REALTIME</type>
+      <!-- This is a comment for the translators.  -->
+      <!-- This should be an strftime format,
+          as described in the strftime(3) manual page. -->
+      <format>%H:%M</format>
+      <seconds>0</seconds>
+      <interval>60</interval>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label8</name>
+      <label>Clock</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeAnimator</class>
+      <name>animator1</name>
+      <width>0</width>
+      <height>0</height>
+      <loop_type>GNOME_ANIMATOR_LOOP_NONE</loop_type>
+      <playback_direction>False</playback_direction>
+      <playback_speed>1</playback_speed>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label9</name>
+      <label>Animator</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeCalculator</class>
+      <name>calculator1</name>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label10</name>
+      <label>Calculator</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeLess</class>
+      <name>less1</name>
+      <font>-b&amp;h-lucidatypewriter-bold-r-normal-*-*-140-*-*-m-*-iso8859-1</font>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label11</name>
+      <label>Less</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomePaperSelector</class>
+      <name>paperselector1</name>
+      <border_width>50</border_width>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label12</name>
+      <label>PaperSel</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GnomeSpell</class>
+      <name>spell1</name>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label13</name>
+      <label>GnomeSpell</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkFileSelection</class>
+  <name>filesel</name>
+  <border_width>10</border_width>
+  <visible>False</visible>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Thu, 17 Jun 1999 14:58:58 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_true</handler>
+    <last_modification_time>Thu, 17 Jun 1999 14:59:07 GMT</last_modification_time>
+  </signal>
+  <title>Select File</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+  <show_file_op_buttons>True</show_file_op_buttons>
+
+  <widget>
+    <class>GtkButton</class>
+    <child_name>FileSel:ok_button</child_name>
+    <name>ok_button1</name>
+    <can_default>True</can_default>
+    <can_focus>True</can_focus>
+    <signal>
+      <name>clicked</name>
+      <handler>gtk_widget_hide</handler>
+      <object>filesel</object>
+      <last_modification_time>Thu, 17 Jun 1999 15:02:33 GMT</last_modification_time>
+    </signal>
+    <signal>
+      <name>clicked</name>
+      <handler>gtk_widget_show</handler>
+      <object>msgdialog</object>
+      <last_modification_time>Thu, 17 Jun 1999 15:02:51 GMT</last_modification_time>
+    </signal>
+    <label>OK</label>
+  </widget>
+
+  <widget>
+    <class>GtkButton</class>
+    <child_name>FileSel:cancel_button</child_name>
+    <name>cancel_button1</name>
+    <can_default>True</can_default>
+    <has_default>True</has_default>
+    <can_focus>True</can_focus>
+    <signal>
+      <name>clicked</name>
+      <handler>gtk_widget_hide</handler>
+      <object>filesel</object>
+      <last_modification_time>Thu, 17 Jun 1999 14:59:25 GMT</last_modification_time>
+    </signal>
+    <label>Cancel</label>
+  </widget>
+</widget>
+
+<widget>
+  <class>GnomeDialog</class>
+  <name>msgdialog</name>
+  <visible>False</visible>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>False</allow_grow>
+  <auto_shrink>False</auto_shrink>
+  <auto_close>True</auto_close>
+  <hide_on_close>True</hide_on_close>
+
+  <widget>
+    <class>GtkVBox</class>
+    <child_name>GnomeDialog:vbox</child_name>
+    <name>dialog-vbox2</name>
+    <homogeneous>False</homogeneous>
+    <spacing>8</spacing>
+    <child>
+      <padding>4</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+
+    <widget>
+      <class>GtkLabel</class>
+      <name>label14</name>
+      <label>If this was a real application, clicking on the
+OK button would probably have done something
+useful, rather than just displaying this dialog.</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+      <child>
+       <padding>0</padding>
+       <expand>False</expand>
+       <fill>False</fill>
+      </child>
+    </widget>
+
+    <widget>
+      <class>GtkHButtonBox</class>
+      <child_name>GnomeDialog:action_area</child_name>
+      <name>dialog-action_area2</name>
+      <layout_style>GTK_BUTTONBOX_END</layout_style>
+      <spacing>8</spacing>
+      <child_min_width>85</child_min_width>
+      <child_min_height>27</child_min_height>
+      <child_ipad_x>7</child_ipad_x>
+      <child_ipad_y>0</child_ipad_y>
+      <child>
+       <padding>0</padding>
+       <expand>False</expand>
+       <fill>True</fill>
+       <pack>GTK_PACK_END</pack>
+      </child>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>button10</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
+      </widget>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>button10</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <label>Nothing</label>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GnomePropertyBox</class>
+  <name>propbox</name>
+  <visible>False</visible>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Tue, 28 Sep 1999 04:29:52 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_true</handler>
+    <last_modification_time>Tue, 28 Sep 1999 04:30:00 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>clicked</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Tue, 28 Sep 1999 04:30:37 GMT</last_modification_time>
+  </signal>
+
+  <widget>
+    <class>GtkNotebook</class>
+    <child_name>GnomePropertyBox:notebook</child_name>
+    <name>notebook2</name>
+    <can_focus>True</can_focus>
+    <show_tabs>True</show_tabs>
+    <show_border>True</show_border>
+    <tab_pos>GTK_POS_TOP</tab_pos>
+    <scrollable>False</scrollable>
+    <tab_hborder>2</tab_hborder>
+    <tab_vborder>2</tab_vborder>
+    <popup_enable>False</popup_enable>
+    <child>
+      <padding>0</padding>
+      <expand>True</expand>
+      <fill>True</fill>
+    </child>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame1</name>
+      <border_width>5</border_width>
+      <label_xalign>0</label_xalign>
+      <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+      <widget>
+       <class>GtkVBox</class>
+       <name>vbox1</name>
+       <border_width>5</border_width>
+       <homogeneous>False</homogeneous>
+       <spacing>3</spacing>
+
+       <widget>
+         <class>GtkCombo</class>
+         <name>combo1</name>
+         <value_in_list>False</value_in_list>
+         <ok_if_empty>True</ok_if_empty>
+         <case_sensitive>False</case_sensitive>
+         <use_arrows>True</use_arrows>
+         <use_arrows_always>False</use_arrows_always>
+         <items></items>
+         <child>
+           <padding>0</padding>
+           <expand>False</expand>
+           <fill>False</fill>
+         </child>
+
+         <widget>
+           <class>GtkEntry</class>
+           <child_name>GtkCombo:entry</child_name>
+           <name>combo-entry1</name>
+           <can_focus>True</can_focus>
+           <signal>
+             <name>changed</name>
+             <handler>gnome_property_box_changed</handler>
+             <object>propbox</object>
+             <last_modification_time>Tue, 28 Sep 1999 04:25:07 GMT</last_modification_time>
+           </signal>
+           <editable>True</editable>
+           <text_visible>True</text_visible>
+           <text_max_length>0</text_max_length>
+           <text></text>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GnomeFileEntry</class>
+         <name>fileentry2</name>
+         <max_saved>10</max_saved>
+         <directory>False</directory>
+         <modal>False</modal>
+         <child>
+           <padding>0</padding>
+           <expand>False</expand>
+           <fill>False</fill>
+         </child>
+
+         <widget>
+           <class>GtkEntry</class>
+           <child_name>GnomeEntry:entry</child_name>
+           <name>combo-entry3</name>
+           <can_focus>True</can_focus>
+           <signal>
+             <name>changed</name>
+             <handler>gnome_property_box_changed</handler>
+             <object>propbox</object>
+             <last_modification_time>Tue, 28 Sep 1999 04:25:19 GMT</last_modification_time>
+           </signal>
+           <editable>True</editable>
+           <text_visible>True</text_visible>
+           <text_max_length>0</text_max_length>
+           <text></text>
+         </widget>
+       </widget>
+
+       <widget>
+         <class>GnomePixmapEntry</class>
+         <name>pixmapentry1</name>
+         <preview>True</preview>
+         <child>
+           <padding>0</padding>
+           <expand>False</expand>
+           <fill>False</fill>
+         </child>
+
+         <widget>
+           <class>GnomeFileEntry</class>
+           <child_name>GnomePixmapEntry:file-entry</child_name>
+           <name>entry4</name>
+           <max_saved>10</max_saved>
+           <directory>False</directory>
+           <modal>False</modal>
+
+           <widget>
+             <class>GtkEntry</class>
+             <child_name>GnomeEntry:entry</child_name>
+             <name>combo-entry2</name>
+             <can_focus>True</can_focus>
+             <signal>
+               <name>changed</name>
+               <handler>gnome_property_box_changed</handler>
+               <object>propbox</object>
+               <last_modification_time>Tue, 28 Sep 1999 04:25:38 GMT</last_modification_time>
+             </signal>
+             <editable>True</editable>
+             <text_visible>True</text_visible>
+             <text_max_length>0</text_max_length>
+             <text></text>
+           </widget>
+         </widget>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label15</name>
+      <label>_Entry</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+
+    <widget>
+      <class>GtkFrame</class>
+      <name>frame2</name>
+      <border_width>5</border_width>
+      <label_xalign>0</label_xalign>
+      <shadow_type>GTK_SHADOW_OUT</shadow_type>
+
+      <widget>
+       <class>GtkDial</class>
+       <name>dial2</name>
+       <view_only>False</view_only>
+       <update_policy>GTK_UPDATE_CONTINUOUS</update_policy>
+       <value>0</value>
+       <lower>0</lower>
+       <upper>100</upper>
+       <step>0</step>
+       <page>0</page>
+       <page_size>0</page_size>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkLabel</class>
+      <child_name>Notebook:tab</child_name>
+      <name>label16</name>
+      <label>_Dial</label>
+      <justify>GTK_JUSTIFY_CENTER</justify>
+      <wrap>False</wrap>
+      <xalign>0.5</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+    </widget>
+  </widget>
+</widget>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>druidwin</name>
+  <visible>False</visible>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_widget_hide</handler>
+    <last_modification_time>Thu, 28 Oct 1999 15:52:59 GMT</last_modification_time>
+  </signal>
+  <signal>
+    <name>delete_event</name>
+    <handler>gtk_true</handler>
+    <last_modification_time>Thu, 28 Oct 1999 15:53:09 GMT</last_modification_time>
+  </signal>
+  <title>GnomeDruid</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>False</modal>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GnomeDruid</class>
+    <name>druid1</name>
+    <signal>
+      <name>cancel</name>
+      <handler>gtk_widget_hide</handler>
+      <object>druidwin</object>
+      <last_modification_time>Thu, 28 Oct 1999 15:55:01 GMT</last_modification_time>
+    </signal>
+
+    <widget>
+      <class>GnomeDruidPageStart</class>
+      <name>druidpagestart1</name>
+      <title>Test GnomeDruid</title>
+      <text>This is a simple test of the GnomeDruid
+code in gnome-libs and the wrapper
+for said code in libglade.</text>
+      <title_color>255,255,255</title_color>
+      <text_color>0,0,0</text_color>
+      <background_color>254,226,40</background_color>
+      <logo_background_color>255,0,20</logo_background_color>
+      <textbox_color>95,254,235</textbox_color>
+    </widget>
+
+    <widget>
+      <class>GnomeDruidPageStandard</class>
+      <name>druidpagestandard1</name>
+      <title>A dial in a druid</title>
+      <title_color>255,255,255</title_color>
+      <background_color>55,190,93</background_color>
+      <logo_background_color>255,5,234</logo_background_color>
+
+      <widget>
+       <class>GtkVBox</class>
+       <child_name>GnomeDruidPageStandard:vbox</child_name>
+       <name>druid-vbox1</name>
+       <border_width>50</border_width>
+       <homogeneous>False</homogeneous>
+       <spacing>0</spacing>
+       <child>
+         <padding>0</padding>
+         <expand>True</expand>
+         <fill>True</fill>
+       </child>
+
+       <widget>
+         <class>GtkDial</class>
+         <name>dial3</name>
+         <view_only>False</view_only>
+         <update_policy>GTK_UPDATE_CONTINUOUS</update_policy>
+         <value>0</value>
+         <lower>0</lower>
+         <upper>100</upper>
+         <step>0</step>
+         <page>0</page>
+         <page_size>0</page_size>
+         <child>
+           <padding>0</padding>
+           <expand>True</expand>
+           <fill>True</fill>
+         </child>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GnomeDruidPageFinish</class>
+      <name>druidpagefinish1</name>
+      <signal>
+       <name>finish</name>
+       <handler>gtk_widget_hide</handler>
+       <object>druidwin</object>
+       <last_modification_time>Thu, 28 Oct 1999 15:55:24 GMT</last_modification_time>
+      </signal>
+      <title>Last Page</title>
+      <text>This is the end of the druid example</text>
+      <background_color>25,25,112</background_color>
+      <logo_background_color>255,147,6</logo_background_color>
+      <textbox_color>190,190,190</textbox_color>
+      <text_color>0,0,0</text_color>
+      <title_color>255,255,255</title_color>
+    </widget>
+  </widget>
+</widget>
+
+</GTK-Interface>
+EOF
+
+tmpfiles="$tmpfiles xg-test19.pot"
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --add-comments -o - widgets.glade | grep -v 'POT-Creation-Date' > xg-test19.pot
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles xg-test19.ok"
+cat <<EOF > xg-test19.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: widgets.glade:33
+msgid "Libglade-GNOME Test"
+msgstr ""
+
+#: widgets.glade:103
+msgid "Show _Tests"
+msgstr ""
+
+#: widgets.glade:116
+msgid "Druid Test"
+msgstr ""
+
+#: widgets.glade:295
+msgid "New"
+msgstr ""
+
+#: widgets.glade:303
+msgid "Open"
+msgstr ""
+
+#: widgets.glade:311
+msgid "Save"
+msgstr ""
+
+#: widgets.glade:325
+msgid "Cut"
+msgstr ""
+
+#: widgets.glade:342
+msgid "Copy"
+msgstr ""
+
+#: widgets.glade:356
+msgid "Paste"
+msgstr ""
+
+#: widgets.glade:370
+msgid "Clear"
+msgstr ""
+
+#: widgets.glade:378
+msgid "Tog"
+msgstr ""
+
+#: widgets.glade:395
+msgid "The cut copy paste and clear buttons should work correctly."
+msgstr ""
+
+#: widgets.glade:423
+msgid "Copyright (C) 1999"
+msgstr ""
+
+#: widgets.glade:426
+msgid ""
+"A simple program demonstrating what is possible with GNOME and\n"
+"libglade.  This interface has been coded entirely with GLADE, and\n"
+"no C code specific to this interface has been written."
+msgstr ""
+
+#: widgets.glade:508
+msgid "X"
+msgstr ""
+
+#: widgets.glade:529
+msgid "Widget Tests"
+msgstr ""
+
+#: widgets.glade:556 widgets.glade:557
+msgid "Pick a colour"
+msgstr ""
+
+#: widgets.glade:564
+msgid "Colour Picker"
+msgstr ""
+
+#: widgets.glade:578
+msgid "Pick a Font"
+msgstr ""
+
+#: widgets.glade:579
+msgid "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"
+msgstr ""
+
+#: widgets.glade:590
+msgid "Font Picker"
+msgstr ""
+
+#. The welcome greeting
+#: widgets.glade:603
+msgid "Hello"
+msgstr ""
+
+#: widgets.glade:612
+msgid "Icon Sel"
+msgstr ""
+
+#: widgets.glade:627
+msgid "My Gnome Site"
+msgstr ""
+
+#: widgets.glade:634
+msgid "HRef"
+msgstr ""
+
+#: widgets.glade:665
+msgid "Entry"
+msgstr ""
+
+#: widgets.glade:699
+msgid "File Entry"
+msgstr ""
+
+#: widgets.glade:725
+msgid "Dial"
+msgstr ""
+
+#. This is a comment for the translators.
+#. This should be an strftime format,
+#. as described in the strftime(3) manual page.
+#: widgets.glade:742
+msgid "%H:%M"
+msgstr ""
+
+#: widgets.glade:751
+msgid "Clock"
+msgstr ""
+
+#: widgets.glade:774
+msgid "Animator"
+msgstr ""
+
+#: widgets.glade:792
+msgid "Calculator"
+msgstr ""
+
+#: widgets.glade:811
+msgid "Less"
+msgstr ""
+
+#: widgets.glade:830
+msgid "PaperSel"
+msgstr ""
+
+#: widgets.glade:848
+msgid "GnomeSpell"
+msgstr ""
+
+#: widgets.glade:874
+msgid "Select File"
+msgstr ""
+
+#: widgets.glade:901
+msgid "OK"
+msgstr ""
+
+#: widgets.glade:917
+msgid "Cancel"
+msgstr ""
+
+#: widgets.glade:949
+msgid ""
+"If this was a real application, clicking on the\n"
+"OK button would probably have done something\n"
+"useful, rather than just displaying this dialog."
+msgstr ""
+
+#: widgets.glade:995
+msgid "Nothing"
+msgstr ""
+
+#: widgets.glade:1159
+msgid "_Entry"
+msgstr ""
+
+#: widgets.glade:1193
+msgid "_Dial"
+msgstr ""
+
+#: widgets.glade:1218
+msgid "GnomeDruid"
+msgstr ""
+
+#: widgets.glade:1239
+msgid "Test GnomeDruid"
+msgstr ""
+
+#: widgets.glade:1240
+msgid ""
+"This is a simple test of the GnomeDruid\n"
+"code in gnome-libs and the wrapper\n"
+"for said code in libglade."
+msgstr ""
+
+#: widgets.glade:1253
+msgid "A dial in a druid"
+msgstr ""
+
+#: widgets.glade:1300
+msgid "Last Page"
+msgstr ""
+
+#: widgets.glade:1301
+msgid "This is the end of the druid example"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-test19.ok xg-test19.pot
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/tests/xgettext-20 b/tests/xgettext-20
new file mode 100755 (executable)
index 0000000..0483a44
--- /dev/null
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+# Test of Glade support, in particular ISO-8859-1 to UTF-8 conversion
+# and ASCII entities (&lt; &gt; &quot;).
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles empty.glade"
+cat <<EOF > empty.glade
+<?xml version="1.0"?>
+<GTK-Interface/>
+EOF
+
+tmpfiles="$tmpfiles xg-test20.pot"
+: ${XGETTEXT=xgettext}
+${XGETTEXT} -o xg-test20.pot empty.glade 2>/dev/null
+test $? = 0 || { echo "SKIP: xgettext-20"; rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles simple.glade"
+cat <<\EOF > simple.glade
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GTK-Interface>
+
+
+<widget>
+  <class>GtkWindow</class>
+  <name>HelloWindow</name>
+  <border_width>5</border_width>
+  <Signal>
+    <name>destroy</name>
+    <handler>gtk_main_quit</handler>
+  </Signal>
+  <title>Hello</title>
+  <type>GTK_WINDOW_TOPLEVEL</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <allow_shrink>True</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkButton</class>
+    <name>Hello World</name>
+    <can_focus>True</can_focus>
+    <Signal>
+      <name>clicked</name>
+      <handler>gtk_widget_destroy</handler>
+      <object>HelloWindow</object>
+    </Signal>
+    <!-- Der übliche Programm-Gruß -->
+    <label>Hello World</label>
+    <comments>This &lt;button&gt; diplays &quot;Hello World&quot;.</comments>
+  </widget>
+</widget>
+
+</GTK-Interface>
+EOF
+
+tmpfiles="$tmpfiles xg-test20.tmp xg-test20.pot"
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --add-comments -o xg-test20.tmp simple.glade 
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+grep -v 'POT-Creation-Date' < xg-test20.tmp > xg-test20.pot
+
+tmpfiles="$tmpfiles xg-test20.ok"
+cat <<EOF > xg-test20.ok
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: simple.glade:13
+msgid "Hello"
+msgstr ""
+
+#. Der übliche Programm-Gruß
+#: simple.glade:30
+msgid "Hello World"
+msgstr ""
+
+#: simple.glade:31
+msgid "This <button> diplays \"Hello World\"."
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-test20.ok xg-test20.pot
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result