[Libvir] gettext i18n support for libvirt

Daniel P. Berrange berrange at redhat.com
Wed Sep 20 19:05:29 UTC 2006


On Wed, Sep 20, 2006 at 07:48:11PM +0100, Daniel P. Berrange wrote:
> Attached is an updated version of my previous patch to add gettext support
> to libvirt. It should be pretty self-explanatory - basically wrapping all
> strings with _(..) or gettext_noop(...)  where appropriate. I also took
> the opportunity to make some of the messages more consistent with each
> other.

Opps, used old skool diff format. Re-attaching as a unified diff this time...

Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
Index: Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/Makefile.am,v
retrieving revision 1.11
diff -u -r1.11 Makefile.am
--- Makefile.am	28 Jun 2006 18:19:13 -0000	1.11
+++ Makefile.am	20 Sep 2006 19:55:46 -0000
@@ -1,6 +1,8 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS = src include docs @PYTHON_SUBDIR@ tests proxy
+SUBDIRS = src include docs @PYTHON_SUBDIR@ tests proxy po
+
+ACLOCAL_AMFLAGS = -I m4
 
 EXTRA_DIST = libvirt.spec.in libvirt.spec COPYING.LIB \
              libvirt.pc.in libvirt.pc TODO AUTHORS ChangeLog \
Index: autogen.sh
===================================================================
RCS file: /data/cvs/libvirt/autogen.sh,v
retrieving revision 1.4
diff -u -r1.4 autogen.sh
--- autogen.sh	6 Jul 2006 09:29:34 -0000	1.4
+++ autogen.sh	20 Sep 2006 19:55:46 -0000
@@ -8,6 +8,14 @@
 cd $srcdir
 DIE=0
 
+(autopoint --version) < /dev/null > /dev/null 2>&1 || {
+        echo
+        echo "You must have autopoint installed to compile libvirt."
+        echo "Download the appropriate package for your distribution,"
+        echo "or see http://www.gnu.org/software/gettext"
+        DIE=1
+}
+
 (autoconf --version) < /dev/null > /dev/null 2>&1 || {
 	echo
 	echo "You must have autoconf installed to compile libvirt."
@@ -46,6 +54,8 @@
         echo "to pass any to it, please specify them on the $0 command line."
 fi
 
+autopoint --force
+#rm -rf m4
 libtoolize --copy --force
 aclocal $ACLOCAL_FLAGS
 automake --add-missing
Index: config.h.in
===================================================================
RCS file: /data/cvs/libvirt/config.h.in,v
retrieving revision 1.4
diff -u -r1.4 config.h.in
--- config.h.in	10 Feb 2006 10:11:21 -0000	1.4
+++ config.h.in	20 Sep 2006 19:55:46 -0000
@@ -1,8 +1,30 @@
 /* config.h.in.  Generated from configure.in by autoheader.  */
 
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+   CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+   the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+#undef HAVE_DCGETTEXT
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
Index: configure.in
===================================================================
RCS file: /data/cvs/libvirt/configure.in,v
retrieving revision 1.43
diff -u -r1.43 configure.in
--- configure.in	12 Sep 2006 01:16:22 -0000	1.43
+++ configure.in	20 Sep 2006 19:55:46 -0000
@@ -246,6 +246,10 @@
 AC_SUBST(PYTHON_INCLUDES)
 AC_SUBST(PYTHON_SITE_PACKAGES)
 
+AM_GNU_GETTEXT_VERSION([0.14.1])
+AM_GNU_GETTEXT([external])
+ALL_LINGUAS=en_GB
+
 # very annoying
 rm -f COPYING
 cp COPYING.LIB COPYING
@@ -254,6 +258,7 @@
           docs/examples/Makefile docs/devhelp/Makefile \
 	  docs/examples/python/Makefile \
           libvirt.pc libvirt.spec \
+          po/Makefile.in \
 	  include/libvirt/Makefile include/libvirt/libvirt.h \
 	  python/Makefile python/tests/Makefile \
           tests/Makefile proxy/Makefile \
Index: proxy/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/proxy/Makefile.am,v
retrieving revision 1.6
diff -u -r1.6 Makefile.am
--- proxy/Makefile.am	9 Aug 2006 15:21:16 -0000	1.6
+++ proxy/Makefile.am	20 Sep 2006 19:55:50 -0000
@@ -2,8 +2,8 @@
 
 INCLUDES = -I$(top_builddir)/include -I at top_srcdir@/include \
            -I at top_srcdir@/proxy -I at top_srcdir@/src @LIBXML_CFLAGS@ \
-	   -DPROXY
-
+	   -DPROXY  -DLOCALEBASEDIR=\""$(datadir)/locale"\" \
+           -DGETTEXT_PACKAGE=\"$(PACKAGE)\"
 
 libexec_PROGRAMS = libvirt_proxy
 
Index: proxy/libvirt_proxy.c
===================================================================
RCS file: /data/cvs/libvirt/proxy/libvirt_proxy.c,v
retrieving revision 1.9
diff -u -r1.9 libvirt_proxy.c
--- proxy/libvirt_proxy.c	5 Sep 2006 06:48:44 -0000	1.9
+++ proxy/libvirt_proxy.c	20 Sep 2006 19:55:51 -0000
@@ -715,6 +715,19 @@
 int main(int argc, char **argv) {
     int i;
 
+    if (!setlocale(LC_ALL, "")) {
+        perror("setlocale");
+	return -1;
+    }
+    if (!bindtextdomain(GETTEXT_PACKAGE, LOCALEBASEDIR)) {
+        perror("bindtextdomain");
+	return -1;
+    }
+    if (!textdomain(GETTEXT_PACKAGE)) {
+        perror("textdomain");
+	return -1;
+    }
+
     for (i = 1; i < argc; i++) {
          if (!strcmp(argv[i], "-v")) {
 	     debug++;
@@ -725,7 +738,8 @@
 	     exit(1);
 	 }
     }
-    
+
+
     if (geteuid() != 0) {
         fprintf(stderr, "%s must be run as root or suid\n", argv[0]);
 	/* exit(1); */
Index: src/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/src/Makefile.am,v
retrieving revision 1.27
diff -u -r1.27 Makefile.am
--- src/Makefile.am	29 Aug 2006 22:27:07 -0000	1.27
+++ src/Makefile.am	20 Sep 2006 19:55:51 -0000
@@ -1,7 +1,8 @@
 ## Process this file with automake to produce Makefile.in
 
 INCLUDES = -I$(top_builddir)/include -I at top_srcdir@/include @LIBXML_CFLAGS@ \
-	   -DBINDIR=\""$(libexecdir)"\"
+	   -DBINDIR=\""$(libexecdir)"\" -DLOCALEBASEDIR=\""$(datadir)/locale"\" \
+           -DGETTEXT_PACKAGE=\"$(PACKAGE)\"
 DEPS = libvirt.la
 LDADDS = @STATIC_BINARIES@ libvirt.la
 VIRSH_LIBS = @VIRSH_LIBS@
Index: src/conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/conf.c,v
retrieving revision 1.3
diff -u -r1.3 conf.c
--- src/conf.c	3 Sep 2006 17:46:32 -0000	1.3
+++ src/conf.c	20 Sep 2006 19:55:51 -0000
@@ -159,7 +159,7 @@
 
     ret = (virConfPtr) malloc(sizeof(virConf));
     if (ret == NULL) {
-        virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration", 0);
+        virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
         return(NULL);
     }
     memset(ret, 0, sizeof(virConf));
@@ -193,7 +193,7 @@
     
     ret = (virConfEntryPtr) malloc(sizeof(virConfEntry));
     if (ret == NULL) {
-        virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration", 0);
+        virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
         return(NULL);
     }
     memset(ret, 0, sizeof(virConfEntry));
@@ -328,7 +328,7 @@
         NEXT;
     }
     if ((ctxt->cur >= ctxt->end) || (!IS_DIGIT(CUR))) {
-	virConfError(NULL, VIR_ERR_CONF_SYNTAX, "unterminated number",
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("unterminated number"),
 		     ctxt->line);
 	return(-1);
     }
@@ -360,7 +360,7 @@
 	while ((ctxt->cur < ctxt->end) && (CUR != '\'') && (!IS_EOL(CUR)))
 	    NEXT;
 	if (CUR != '\'') {
-	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, "unterminated string",
+	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("unterminated string"),
 			 ctxt->line);
 	    return(NULL);
 	}
@@ -377,7 +377,7 @@
 	}
 	if ((ctxt->cur[0] != '"') || (ctxt->cur[1] != '"') ||
 	    (ctxt->cur[2] != '"')) {
-	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, "unterminated string",
+	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("unterminated string"),
 			 ctxt->line);
 	    return(NULL);
 	}
@@ -389,7 +389,7 @@
 	while ((ctxt->cur < ctxt->end) && (CUR != '"') && (!IS_EOL(CUR)))
 	    NEXT;
 	if (CUR != '"') {
-	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, "unterminated string",
+	    virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("unterminated string"),
 			 ctxt->line);
 	    return(NULL);
 	}
@@ -417,7 +417,7 @@
 
     SKIP_SPACES;
     if (ctxt->cur >= ctxt->end) {
-        virConfError(NULL, VIR_ERR_CONF_SYNTAX, "expecting a value",
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("expecting a value"),
 	             ctxt->line);
 	return(NULL);
     }
@@ -437,7 +437,7 @@
 	while ((ctxt->cur < ctxt->end) && (CUR != ']')) {
 	    if (CUR != ',') {
 		virConfError(NULL, VIR_ERR_CONF_SYNTAX,
-		             "expecting a separator in list", ctxt->line);
+		             _("expecting a separator in list"), ctxt->line);
 	        virConfFreeList(lst);
 		return(NULL);
 	    }
@@ -460,7 +460,7 @@
 	    NEXT;
 	} else {
 	    virConfError(NULL, VIR_ERR_CONF_SYNTAX,
-			 "list is not closed with ] ", ctxt->line);
+			 _("list is not closed with ] "), ctxt->line);
 	    virConfFreeList(lst);
 	    return(NULL);
 	}
@@ -470,13 +470,13 @@
 	}
         type = VIR_CONF_LONG;
     } else {
-        virConfError(NULL, VIR_ERR_CONF_SYNTAX, "expecting a value",
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("expecting a value"),
 	             ctxt->line);
 	return(NULL);
     }
     ret = (virConfValuePtr) malloc(sizeof(virConfValue));
     if (ret == NULL) {
-        virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration", 0);
+        virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
 	if (str != NULL)
 	    free(str);
         return(NULL);
@@ -508,14 +508,14 @@
     base = ctxt->cur;
     /* TODO: probably need encoding support and UTF-8 parsing ! */
     if (!IS_CHAR(CUR)) {
-        virConfError(NULL, VIR_ERR_CONF_SYNTAX, "expecting a name", ctxt->line);
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("expecting a name"), ctxt->line);
 	return(NULL);
     }
     while ((ctxt->cur < ctxt->end) && ((IS_CHAR(CUR)) || (IS_DIGIT(CUR)) || (CUR == '_')))
         NEXT;
     ret = strndup(base, ctxt->cur - base);
     if (ret == NULL) {
-        virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration",
+        virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"),
 	             ctxt->line);
         return(NULL);
     }
@@ -543,7 +543,7 @@
     while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
     comm = strndup(base, ctxt->cur - base);
     if (comm == NULL) {
-        virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration",
+        virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"),
 	             ctxt->line);
         return(-1);
     }
@@ -571,7 +571,7 @@
 	NEXT;
 	SKIP_BLANKS;
     } else {
-	virConfError(NULL, VIR_ERR_CONF_SYNTAX, "expecting a separator",
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("expecting a separator"),
 		     ctxt->line);
 	return(-1);
     }
@@ -603,7 +603,7 @@
         return(-1);
     SKIP_SPACES;
     if (CUR != '=') {
-        virConfError(NULL, VIR_ERR_CONF_SYNTAX, "expecting an assignment",
+        virConfError(NULL, VIR_ERR_CONF_SYNTAX, _("expecting an assignment"),
 	             ctxt->line);
         return(-1);
     }
@@ -621,7 +621,7 @@
 	while ((ctxt->cur < ctxt->end) && (!IS_EOL(CUR))) NEXT;
 	comm = strndup(base, ctxt->cur - base);
 	if (comm == NULL) {
-	    virConfError(NULL, VIR_ERR_NO_MEMORY, "Allocating configuration",
+	    virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"),
 	                 ctxt->line);
 	    free(name);
 	    virConfFreeValue(value);
@@ -816,7 +816,7 @@
     
     fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR );
     if (fd < 0) {
-        virConfError(NULL, VIR_ERR_WRITE_FAILED, "failed to open file", 0);
+        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to open file"), 0);
         ret = -1;
 	goto error;
     }
@@ -824,7 +824,7 @@
     ret = write(fd, buf->content, buf->use);
     close(fd);
     if (ret != (int) buf->use) {
-        virConfError(NULL, VIR_ERR_WRITE_FAILED, "failed to save content", 0);
+        virConfError(NULL, VIR_ERR_WRITE_FAILED, _("failed to save content"), 0);
         ret = -1;
 	goto error;
     }
Index: src/hash.c
===================================================================
RCS file: /data/cvs/libvirt/src/hash.c,v
retrieving revision 1.9
diff -u -r1.9 hash.c
--- src/hash.c	29 May 2006 18:03:27 -0000	1.9
+++ src/hash.c	20 Sep 2006 19:55:51 -0000
@@ -528,7 +528,7 @@
 
     ret = (virConnectPtr) malloc(sizeof(virConnect));
     if (ret == NULL) {
-        virHashError(NULL, VIR_ERR_NO_MEMORY, "Allocating connection");
+        virHashError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
         goto failed;
     }
     memset(ret, 0, sizeof(virConnect));
@@ -625,13 +625,13 @@
      */
     ret = (virDomainPtr) malloc(sizeof(virDomain));
     if (ret == NULL) {
-        virHashError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	goto error;
     }
     memset(ret, 0, sizeof(virDomain));
     ret->name = strdup(name);
     if (ret->name == NULL) {
-        virHashError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	goto error;
     }
     ret->magic = VIR_DOMAIN_MAGIC;
@@ -642,7 +642,7 @@
 
     if (virHashAddEntry(conn->domains, name, ret) < 0) {
         virHashError(conn, VIR_ERR_INTERNAL_ERROR,
-	             "Failed to add domain to connectio hash table");
+	             _("failed to add domain to connection hash table"));
 	goto error;
     }
     conn->uses++;
@@ -694,7 +694,7 @@
 
     if (virHashRemoveEntry(conn->domains, domain->name, NULL) < 0) {
         virHashError(conn, VIR_ERR_INTERNAL_ERROR,
-	             "domain missing from connection hash table");
+	             _("domain missing from connection hash table"));
         goto done;
     }
     domain->magic = -1;
Index: src/internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/internal.h,v
retrieving revision 1.23
diff -u -r1.23 internal.h
--- src/internal.h	28 Jun 2006 18:19:13 -0000	1.23
+++ src/internal.h	20 Sep 2006 19:55:53 -0000
@@ -16,11 +16,16 @@
 #include "libvirt/libvirt.h"
 #include "libvirt/virterror.h"
 #include "driver.h"
+#include <libintl.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#define _(str) dgettext(GETTEXT_PACKAGE, (str))
+#define _N(str) dgettext(GETTEXT_PACKAGE, (str))
+#define gettext_noop(str) (str)
+
 /**
  * ATTRIBUTE_UNUSED:
  *
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libvirt/src/libvirt.c,v
retrieving revision 1.45
diff -u -r1.45 libvirt.c
--- src/libvirt.c	30 Aug 2006 14:21:03 -0000	1.45
+++ src/libvirt.c	20 Sep 2006 19:55:53 -0000
@@ -60,10 +60,13 @@
         return(0);
     initialized = 1;
 
+    if (!bindtextdomain(GETTEXT_PACKAGE, LOCALEBASEDIR))
+        return (-1);
+
     /*
      * should not be needed but...
      */
-    for (i = 0;i < MAX_DRIVERS;i++) 
+    for (i = 0;i < MAX_DRIVERS;i++)
          virDriverTab[i] = NULL;
 
     /*
@@ -140,7 +143,8 @@
     int i;
 
     if (!initialized)
-        virInitialize();
+        if (virInitialize() < 0)
+	    return -1;
 
     if (driver == NULL) {
         virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
@@ -182,7 +186,8 @@
     int i;
 
     if (!initialized)
-        virInitialize();
+        if (virInitialize() < 0)
+	    return -1;
 
     if (libVer == NULL)
         return (-1);
@@ -223,7 +228,8 @@
     virConnectPtr ret = NULL;
 
     if (!initialized)
-        virInitialize();
+        if (virInitialize() < 0)
+	    return NULL;
 
     if (name == NULL) {
         name = "Xen";
@@ -234,7 +240,7 @@
 
     ret = virGetConnect();
     if (ret == NULL) {
-        virLibConnError(NULL, VIR_ERR_NO_MEMORY, "Allocating connection");
+        virLibConnError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
         goto failed;
     }
 
@@ -290,14 +296,15 @@
     virConnectPtr ret = NULL;
 
     if (!initialized)
-        virInitialize();
+        if (virInitialize() < 0)
+	    return NULL;
 
     if (name == NULL)
         name = "Xen";
 
     ret = virGetConnect();
     if (ret == NULL) {
-        virLibConnError(NULL, VIR_ERR_NO_MEMORY, "Allocating connection");
+        virLibConnError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
         goto failed;
     }
 
@@ -313,7 +320,7 @@
     if (ret->nb_drivers == 0) {
 	if (name == NULL)
 	    virLibConnError(NULL, VIR_ERR_NO_CONNECT,
-			    "could not connect to Xen Daemon nor Xen Store");
+			    _("Xen Daemon or Xen Store"));
 	else
 	    /* we failed to find an adequate driver */
 	    virLibConnError(NULL, VIR_ERR_NO_SUPPORT, name);
Index: src/proxy_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/proxy_internal.c,v
retrieving revision 1.10
diff -u -r1.10 proxy_internal.c
--- src/proxy_internal.c	30 Aug 2006 14:21:03 -0000	1.10
+++ src/proxy_internal.c	20 Sep 2006 19:55:54 -0000
@@ -190,7 +190,7 @@
         setsid();
         if (fork() == 0) {
             execl(proxyPath, proxyPath, NULL);
-            fprintf(stderr, "failed to exec %s\n", proxyPath);
+            fprintf(stderr, _("failed to exec %s\n"), proxyPath);
         }
         /*
          * calling exit() generate troubles for termination handlers
@@ -284,7 +284,7 @@
 
     ret = close(fd);
     if (ret != 0)
-	fprintf(stderr, "Failed to close socket %d\n", fd);
+        fprintf(stderr, _("Failed to close socket %d\n"), fd);
     else if (debug > 0)
 	fprintf(stderr, "Closed socket %d\n", fd);
     return(ret);
@@ -317,7 +317,7 @@
 	    goto retry;
 	}
 	if (!quiet)
-	    fprintf(stderr, "Failed to read socket %d\n", fd);
+            fprintf(stderr, _("Failed to read socket %d\n"), fd);
 	return(-1);
     }
 
@@ -351,7 +351,7 @@
 		        fd, len);
 	    goto retry;
 	}
-        fprintf(stderr, "Failed to write to socket %d\n", fd);
+        fprintf(stderr, _("Failed to write to socket %d\n"), fd);
 	return(-1);
     }
     if (debug)
@@ -413,7 +413,7 @@
 	    return(-1);
 	if (ret != sizeof(virProxyPacket)) {
 	    fprintf(stderr,
-		"Communication error with proxy: got %d bytes of %d\n",
+		    _("Communication error with proxy: got %d bytes of %d\n"),
 		    ret, (int) sizeof(virProxyPacket));
 	    xenProxyClose(conn);
 	    return(-1);
@@ -421,7 +421,7 @@
 	res = request;
 	if (res->len != sizeof(virProxyPacket)) {
 	    fprintf(stderr,
-		"Communication error with proxy: expected %d bytes got %d\n",
+		    _("Communication error with proxy: expected %d bytes got %d\n"),
 		    (int) sizeof(virProxyPacket), res->len);
 	    xenProxyClose(conn);
 	    return(-1);
@@ -434,7 +434,7 @@
 	    return(-1);
 	if (ret != sizeof(virProxyPacket)) {
 	    fprintf(stderr,
-		"Communication error with proxy: got %d bytes of %d\n",
+		    _("Communication error with proxy: got %d bytes of %d\n"),
 		    ret, (int) sizeof(virProxyPacket));
 	    xenProxyClose(conn);
 	    return(-1);
@@ -443,7 +443,7 @@
 	if ((res->len < sizeof(virProxyPacket)) ||
 	    (res->len > sizeof(virProxyFullPacket))) {
 	    fprintf(stderr,
-		"Communication error with proxy: got %d bytes packet\n",
+		    _("Communication error with proxy: got %d bytes packet\n"),
 		    res->len);
 	    xenProxyClose(conn);
 	    return(-1);
@@ -454,7 +454,7 @@
 	                                    res->len - ret, quiet);
 	    if (ret != (int) (res->len - sizeof(virProxyPacket))) {
 		fprintf(stderr,
-		    "Communication error with proxy: got %d bytes of %d\n",
+			_("Communication error with proxy: got %d bytes of %d\n"),
 			ret, (int) sizeof(virProxyPacket));
 		xenProxyClose(conn);
 		return(-1);
@@ -467,13 +467,13 @@
     if ((res == NULL) || (res->version != PROXY_PROTO_VERSION) ||
         (res->len < sizeof(virProxyPacket))) {
 	fprintf(stderr,
-	    "Communication error with proxy: malformed packet\n");
+		_("Communication error with proxy: malformed packet\n"));
 	xenProxyClose(conn);
 	return(-1);
     }
     if (res->serial != serial) {
         TODO /* Asynchronous communication */
-	fprintf(stderr, "gor asynchronous packet number %d\n", res->serial);
+	fprintf(stderr, _("got asynchronous packet number %d\n"), res->serial);
         goto retry;
     }
     return(0);
@@ -787,7 +787,7 @@
     res = virGetDomain(conn, name, uuid);
 
     if (res == NULL)
-        virProxyError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virProxyError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
     else
 	res->handle = id;
     
@@ -834,7 +834,7 @@
     res = virGetDomain(conn, name, uuid);
 
     if (res == NULL)
-        virProxyError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virProxyError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
     else
 	res->handle = req.data.arg;
     
@@ -885,7 +885,7 @@
     res = virGetDomain(conn, name, (const unsigned char *)&req.extra.str[0]);
 
     if (res == NULL)
-        virProxyError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virProxyError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
     else
 	res->handle = req.data.arg;
     
Index: src/sexpr.c
===================================================================
RCS file: /data/cvs/libvirt/src/sexpr.c,v
retrieving revision 1.4
diff -u -r1.4 sexpr.c
--- src/sexpr.c	26 Aug 2006 15:30:44 -0000	1.4
+++ src/sexpr.c	20 Sep 2006 19:55:54 -0000
@@ -56,7 +56,7 @@
 
     ret = (struct sexpr *) malloc(sizeof(*ret));
     if (ret == NULL) {
-        virSexprError(VIR_ERR_NO_MEMORY, "failed to allocate a node");
+        virSexprError(VIR_ERR_NO_MEMORY, _("failed to allocate a node"));
         return (NULL);
     }
     ret->kind = SEXPR_NIL;
@@ -349,7 +349,7 @@
             ret->value = strndup(start, ptr - start);
             if (ret->value == NULL) {
                 virSexprError(VIR_ERR_NO_MEMORY,
-                              "failed to copy a string");
+                              _("failed to copy a string"));
             }
 
             if (*ptr == '\'')
@@ -364,7 +364,7 @@
             ret->value = strndup(start, ptr - start);
             if (ret->value == NULL) {
                 virSexprError(VIR_ERR_NO_MEMORY,
-                              "failed to copy a string");
+                              _("failed to copy a string"));
             }
         }
 
Index: src/test.c
===================================================================
RCS file: /data/cvs/libvirt/src/test.c,v
retrieving revision 1.9
diff -u -r1.9 test.c
--- src/test.c	30 Aug 2006 14:21:03 -0000	1.9
+++ src/test.c	20 Sep 2006 19:55:55 -0000
@@ -197,26 +197,26 @@
   virDomainRestart onCrash = VIR_DOMAIN_RENAME_RESTART;
 
   if (gettimeofday(&tv, NULL) < 0) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
+    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
     return -1;
   }
 
   root = xmlDocGetRootElement(xml);
   if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "domain"))) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed root element");
+    testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain"));
     goto error;
   }
 
   ctxt = xmlXPathNewContext(xml);
   if (ctxt == NULL) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "cannot create xpath context");
+    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, _("creating xpath context"));
     goto error;
   }
 
   obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
   if ((obj == NULL) || (obj->type != XPATH_STRING) ||
       (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing name element on domain");
+    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, _("domain name"));
     goto error;
   }
   name = strdup((const char *)obj->stringval);
@@ -225,12 +225,12 @@
   obj = xmlXPathEval(BAD_CAST "string(/domain/uuid[1])", ctxt);
   if ((obj == NULL) || (obj->type != XPATH_STRING) ||
       (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing uuid element on domain");
+    testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
     goto error;
   }
   dst_uuid = (char *) &rawuuid[0];
   if (!(virParseUUID((char **)&dst_uuid, (const char *)obj->stringval))) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed uuid data in domain");
+    testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
     goto error;
   }
   xmlXPathFreeObject(obj);
@@ -238,12 +238,12 @@
   obj = xmlXPathEval(BAD_CAST "string(/domain/memory[1])", ctxt);
   if ((obj == NULL) || (obj->type != XPATH_STRING) ||
       (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "missing memory element on domain");
+    testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain memory"));
     goto error;
   }
   memory = strtoll((const char*)obj->stringval, &conv, 10);
   if (conv == (const char*)obj->stringval) {
-    testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed memory value for domain");
+    testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain memory"));
     goto error;
   }
   xmlXPathFreeObject(obj);
@@ -255,7 +255,7 @@
   } else {
     nrVirtCpu = strtoll((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed vcpus value for domain");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain vcpus"));
       goto error;
     }
   }
@@ -266,7 +266,7 @@
   if ((obj != NULL) && (obj->type == XPATH_STRING) &&
       (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
     if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_reboot value for domain");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain reboot behaviour"));
       goto error;
     }
   }
@@ -277,7 +277,7 @@
   if ((obj != NULL) && (obj->type == XPATH_STRING) &&
       (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
     if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_poweroff value for domain");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain poweroff behaviour"));
       goto error;
     }
   }
@@ -288,7 +288,7 @@
   if ((obj != NULL) && (obj->type == XPATH_STRING) &&
       (obj->stringval != NULL) && (obj->stringval[0] != 0)) {
     if (!(onReboot = testRestartStringToFlag((const char *)obj->stringval))) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed on_crash value for domain");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("domain crash behaviour"));
       goto error;
     }
   }
@@ -331,7 +331,7 @@
   if (!(xml = xmlReadDoc(BAD_CAST doc, "domain.xml", NULL,
 			 XML_PARSE_NOENT | XML_PARSE_NONET |
 			 XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse domain definition");
+    testError(NULL, NULL, VIR_ERR_XML_ERROR, _("domain"));
     return -1;
   }
 
@@ -349,14 +349,14 @@
   xmlDocPtr xml;
 
   if ((fd = open(file, O_RDONLY)) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot load domain definition");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("load domain definition file"));
     return -1;
   }
 
   if (!(xml = xmlReadFd(fd, file, NULL,
 			XML_PARSE_NOENT | XML_PARSE_NONET |
 			XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse domain definition");
+    testError(NULL, NULL, VIR_ERR_XML_ERROR, _("domain"));
     close(fd);
     return -1;
   }
@@ -376,7 +376,7 @@
   struct timeval tv;
 
   if (gettimeofday(&tv, NULL) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
     return -1;
   }
 
@@ -431,14 +431,14 @@
   virNodeInfoPtr nodeInfo;
 
   if ((fd = open(file, O_RDONLY)) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot load host definition");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("loading host definition file"));
     return -1;
   }
 
   if (!(xml = xmlReadFd(fd, file, NULL,
 			XML_PARSE_NOENT | XML_PARSE_NONET |
 			XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot parse host definition");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("host"));
     goto error;
   }
   close(fd);
@@ -446,13 +446,13 @@
 
   root = xmlDocGetRootElement(xml);
   if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "node"))) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "malformed root element");
+    testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node"));
     goto error;
   }
 
   ctxt = xmlXPathNewContext(xml);
   if (ctxt == NULL) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot create xpath context");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("creating xpath context"));
     goto error;
   }
 
@@ -468,7 +468,7 @@
     char *conv = NULL;
     nodeInfo->nodes = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed nodes value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu numa nodes"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -480,7 +480,7 @@
     char *conv = NULL;
     nodeInfo->sockets = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed sockets value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu sockets"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -492,7 +492,7 @@
     char *conv = NULL;
     nodeInfo->cores = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed cores value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu cores"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -504,7 +504,7 @@
     char *conv = NULL;
     nodeInfo->threads = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed threads value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu threads"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -516,7 +516,7 @@
     char *conv = NULL;
     unsigned int active = strtol((const char*)obj->stringval, &conv, 10);    
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed active value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node active cpu"));
       goto error;
     }
     if (active < nodeInfo->cpus) {
@@ -530,7 +530,7 @@
     char *conv = NULL;
     nodeInfo->mhz = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed threads value for node cpu");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu mhz"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -549,7 +549,7 @@
     char *conv = NULL;
     nodeInfo->memory = strtol((const char*)obj->stringval, &conv, 10);
     if (conv == (const char*)obj->stringval) {
-      testError(conn, NULL, VIR_ERR_INTERNAL_ERROR, "malformed memory value for node");
+      testError(conn, NULL, VIR_ERR_XML_ERROR, _("node memory"));
       goto error;
     }
     xmlXPathFreeObject(obj);
@@ -558,7 +558,7 @@
   obj = xmlXPathEval(BAD_CAST "/node/domain", ctxt);
   if ((obj == NULL) || (obj->type != XPATH_NODESET) ||
       (obj->nodesetval == NULL)) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot extract domain list");
+    testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node domain list"));
     goto error;
   }
 
@@ -567,7 +567,7 @@
     char *absFile = testBuildFilename(file, (const char *)domFile);
     free(domFile);
     if (!absFile) {
-      testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot resolve filename");
+      testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("resolving domain filename"));
       goto error;
     }
     if (testLoadDomainFromFile(conn, i, absFile) != 0) {
@@ -605,7 +605,7 @@
   if (node == NULL) {
     node = calloc(1, sizeof(testNode));
     if (!node) {
-      testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot allocate memory");
+      testError(NULL, NULL, VIR_ERR_NO_MEMORY, _("allocating node"));
       return -1;
     }
   }
@@ -645,7 +645,7 @@
 
 
   if ((connid = getNextConnection()) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "too many connections");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many connections"));
     return -1;
   }
 
@@ -722,7 +722,7 @@
 	return NULL;
       dom = virGetDomain(conn, con->domains[i].name, con->domains[i].uuid);
       if (dom == NULL) {
-	testError(conn, NULL, VIR_ERR_NO_MEMORY, "allocating domain");
+	testError(conn, NULL, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	return NULL;
       }
       con->numDomains++;
@@ -730,7 +730,7 @@
     }
   }
   
-  testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "too many domains");
+  testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("too many domains"));
   return (NULL);
 }
 
@@ -747,7 +747,7 @@
 
   dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
   if (dom == NULL) {
-    testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
+    testError(conn, NULL, VIR_ERR_NO_MEMORY, _("allocating domain"));
     return(NULL);
   }
   dom->handle = id;
@@ -770,7 +770,7 @@
   if (id >= 0) {
     dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
     if (dom == NULL) {
-      testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
+      testError(conn, NULL, VIR_ERR_NO_MEMORY, _("allocating domain"));
       return(NULL);
     }
     dom->handle = id;
@@ -794,7 +794,7 @@
   if (id >= 0) {
     dom = virGetDomain(conn, con->domains[id].name, con->domains[id].uuid);
     if (dom == NULL) {
-      testError(conn, NULL, VIR_ERR_NO_MEMORY, "Allocating domain");
+      testError(conn, NULL, VIR_ERR_NO_MEMORY, _("allocating domain"));
       return(NULL);
     }
     dom->handle = id;
@@ -892,7 +892,7 @@
   con = &node->connections[domain->conn->handle];
 
   if (gettimeofday(&tv, NULL) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
     return (-1);
   }
 
@@ -920,7 +920,7 @@
   con = &node->connections[domain->conn->handle];
 
   if (gettimeofday(&tv, NULL) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
     return (-1);
   }
 
@@ -947,7 +947,7 @@
   con = &node->connections[domain->conn->handle];
 
   if (gettimeofday(&tv, NULL) < 0) {
-    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, "cannot get timeofday");
+    testError(NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("getting time of day"));
     return (-1);
   }
 
@@ -1038,7 +1038,7 @@
   con = &node->connections[domain->conn->handle];
 
   if (memory > con->domains[domain->handle].info.maxMem) {
-    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, "memory over maximum limit");
+    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
     return (-1);
   }
 
@@ -1064,7 +1064,7 @@
 
   /* We allow more cpus in guest than host */
   if (nrCpus > 32) {
-    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, "too many virtual cpus");
+    testError(domain->conn, domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
     return (-1);
   }
 
Index: src/virsh.c
===================================================================
RCS file: /data/cvs/libvirt/src/virsh.c,v
retrieving revision 1.38
diff -u -r1.38 virsh.c
--- src/virsh.c	3 Sep 2006 17:34:04 -0000	1.38
+++ src/virsh.c	20 Sep 2006 19:55:55 -0000
@@ -230,9 +230,9 @@
  */
 static vshCmdInfo info_help[] = {
     {"syntax", "help [<command>]"},
-    {"help", "print help"},
-    {"desc", "Prints global help or command specific help."},
-    {"version", "Prints version information."},
+    {"help", gettext_noop("print help")},
+    {"desc", gettext_noop("Prints global help or command specific help.")},
+
     {NULL, NULL}
 };
 
@@ -249,10 +249,10 @@
     if (!cmdname) {
         vshCmdDef *def;
 
-        vshPrint(ctl, "Commands:\n\n");
+        vshPrint(ctl, _("Commands:\n\n"));
         for (def = commands; def->name; def++)
             vshPrint(ctl, "    %-15s %s\n", def->name,
-                     vshCmddefGetInfo(def, "help"));
+                     _N(vshCmddefGetInfo(def, "help")));
         return TRUE;
     }
     return vshCmddefHelp(ctl, cmdname, FALSE);
@@ -263,15 +263,15 @@
  */
 static vshCmdInfo info_connect[] = {
     {"syntax", "connect [name] [--readonly]"},
-    {"help", "(re)connect to hypervisor"},
+    {"help", gettext_noop("(re)connect to hypervisor")},
     {"desc",
-     "Connect to local hypervisor. This is build-in command after shell start up."},
+     gettext_noop("Connect to local hypervisor. This is built-in command after shell start up.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_connect[] = {
-    {"name",     VSH_OT_DATA, 0, "optional argument currently unused (or used for tests only)"},
-    {"readonly", VSH_OT_BOOL, 0, "read-only connection"},
+    {"name",     VSH_OT_DATA, 0, gettext_noop("hypervisor connection URI")},
+    {"readonly", VSH_OT_BOOL, 0, gettext_noop("read-only connection")},
     {NULL, 0, 0, NULL}
 };
 
@@ -283,7 +283,7 @@
     if (ctl->conn) {
         if (virConnectClose(ctl->conn) != 0) {
             vshError(ctl, FALSE,
-                     "failed to disconnect from the hypervisor");
+                     _("Failed to disconnect from the hypervisor"));
             return FALSE;
         }
         ctl->conn = NULL;
@@ -299,7 +299,7 @@
         ctl->conn = virConnectOpenReadOnly(ctl->name);
 
     if (!ctl->conn)
-        vshError(ctl, FALSE, "failed to connect to the hypervisor");
+        vshError(ctl, FALSE, _("Failed to connect to the hypervisor"));
 
     return ctl->conn ? TRUE : FALSE;
 }
@@ -309,14 +309,14 @@
  */
 static vshCmdInfo info_list[] = {
     {"syntax", "list"},
-    {"help", "list domains"},
-    {"desc", "Returns list of domains."},
+    {"help", gettext_noop("list domains")},
+    {"desc", gettext_noop("Returns list of domains.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_list[] = {
-    {"inactive", VSH_OT_BOOL, 0, "list inactive domains"},
-    {"all", VSH_OT_BOOL, 0, "list inactive & active domains"},
+    {"inactive", VSH_OT_BOOL, 0, gettext_noop("list inactive domains")},
+    {"all", VSH_OT_BOOL, 0, gettext_noop("list inactive & active domains")},
     {NULL, 0, 0, NULL}
 };
 
@@ -354,14 +354,14 @@
     if (active) {
       maxid = virConnectNumOfDomains(ctl->conn);
       if (maxid < 0) {
-        vshError(ctl, FALSE, "failed to list active domains.");
+        vshError(ctl, FALSE, _("Failed to list active domains"));
         return FALSE;
       }
       if (maxid) {
         ids = vshMalloc(ctl, sizeof(int) * maxid);
 	
         if ((maxid = virConnectListDomains(ctl->conn, &ids[0], maxid)) < 0) {
-	  vshError(ctl, FALSE, "failed to list active domains.");
+	  vshError(ctl, FALSE, _("Failed to list active domains"));
 	  free(ids);
 	  return FALSE;
         }
@@ -372,7 +372,7 @@
     if (inactive) {
       maxname = virConnectNumOfDefinedDomains(ctl->conn);
       if (maxname < 0) {
-        vshError(ctl, FALSE, "failed to list inactive domains.");
+        vshError(ctl, FALSE, _("Failed to list inactive domains"));
 	if (ids)
 	  free(ids);
         return FALSE;
@@ -381,7 +381,7 @@
         names = vshMalloc(ctl, sizeof(char *) * maxname);
 	
         if ((maxname = virConnectListDefinedDomains(ctl->conn, names, maxname)) < 0) {
-	  vshError(ctl, FALSE, "failed to list inactive domains.");
+	  vshError(ctl, FALSE, _("Failed to list inactive domains"));
 	  if (ids)
 	    free(ids);
 	  free(names);
@@ -391,7 +391,7 @@
 	qsort(&names[0], maxname, sizeof(char*), domnamesorter);
       }
     }
-    vshPrintExtra(ctl, "%3s %-20s %s\n", "Id", "Name", "State");
+    vshPrintExtra(ctl, "%3s %-20s %s\n", _("Id"), _("Name"), _("State"));
     vshPrintExtra(ctl, "----------------------------------\n");
 
     for (i = 0; i < maxid; i++) {
@@ -408,7 +408,7 @@
                  virDomainGetID(dom),
                  virDomainGetName(dom),
                  ret <
-                 0 ? "no state" : vshDomainStateToString(info.state));
+                 0 ? _("no state") : _N(vshDomainStateToString(info.state)));
         virDomainFree(dom);
     }
     for (i = 0; i < maxname; i++) {
@@ -436,6 +436,7 @@
 		   ret <
 		   0 ? "no state" : vshDomainStateToString(info.state));
 	}
+
         virDomainFree(dom);
     }
     if (ids)
@@ -450,13 +451,13 @@
  */
 static vshCmdInfo info_domstate[] = {
     {"syntax", "domstate <domain>"},
-    {"help", "domain state"},
-    {"desc", "Returns state about a running domain."},
+    {"help", gettext_noop("domain state")},
+    {"desc", gettext_noop("Returns state about a running domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_domstate[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -475,7 +476,7 @@
 
     if (virDomainGetInfo(dom, &info) == 0)
         vshPrint(ctl, "%s\n",
-                 vshDomainStateToString(info.state));
+                 _N(vshDomainStateToString(info.state)));
     else
         ret = FALSE;
 
@@ -488,13 +489,13 @@
  */
 static vshCmdInfo info_suspend[] = {
     {"syntax", "suspend <domain>"},
-    {"help", "suspend a domain"},
-    {"desc", "Suspend a running domain."},
+    {"help", gettext_noop("suspend a domain")},
+    {"desc", gettext_noop("Suspend a running domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_suspend[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -512,9 +513,9 @@
         return FALSE;
 
     if (virDomainSuspend(dom) == 0) {
-        vshPrint(ctl, "Domain %s suspended\n", name);
+        vshPrint(ctl, _("Domain %s suspended\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to suspend domain\n");
+        vshError(ctl, FALSE, _("Failed to suspend domain %s"), name);
         ret = FALSE;
     }
 
@@ -527,13 +528,13 @@
  */
 static vshCmdInfo info_create[] = {
     {"syntax", "create a domain from an XML <file>"},
-    {"help", "create a domain from an XML file"},
-    {"desc", "Create a domain."},
+    {"help", gettext_noop("create a domain from an XML file")},
+    {"desc", gettext_noop("Create a domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_create[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, "file conatining an XML domain description"},
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file conatining an XML domain description")},
     {NULL, 0, 0, NULL}
 };
 
@@ -556,22 +557,22 @@
 
     fd = open(from, O_RDONLY);
     if (fd < 0) {
-        vshError(ctl, FALSE, "Failed to read description file %s\n", from);
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
         return(FALSE);
     }
     l = read(fd, &buffer[0], sizeof(buffer));
     if ((l <= 0) || (l >= (int) sizeof(buffer))) {
-        vshError(ctl, FALSE, "Failed to read description file %s\n", from);
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
         close(fd);
         return(FALSE);
     }
     buffer[l] = 0;
     dom = virDomainCreateLinux(ctl->conn, &buffer[0], 0);
     if (dom != NULL) {
-        vshPrint(ctl, "Domain %s created from %s\n", 
+        vshPrint(ctl, _("Domain %s created from %s\n"),
                  virDomainGetName(dom), from);
     } else {
-        vshError(ctl, FALSE, "Failed to create domain\n");
+        vshError(ctl, FALSE, _("Failed to create domain from %s"), from);
         ret = FALSE;
     }
     return ret;
@@ -582,13 +583,13 @@
  */
 static vshCmdInfo info_define[] = {
     {"syntax", "define a domain from an XML <file>"},
-    {"help", "define (but don't start) a domain from an XML file"},
-    {"desc", "Define a domain."},
+    {"help", gettext_noop("define (but don't start) a domain from an XML file")},
+    {"desc", gettext_noop("Define a domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_define[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, "file conatining an XML domain description"},
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file conatining an XML domain description")},
     {NULL, 0, 0, NULL}
 };
 
@@ -611,22 +612,22 @@
 
     fd = open(from, O_RDONLY);
     if (fd < 0) {
-        vshError(ctl, FALSE, "Failed to read description file %s\n", from);
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
         return(FALSE);
     }
     l = read(fd, &buffer[0], sizeof(buffer));
     if ((l <= 0) || (l >= (int) sizeof(buffer))) {
-        vshError(ctl, FALSE, "Failed to read description file %s\n", from);
+        vshError(ctl, FALSE, _("Failed to read description file %s"), from);
         close(fd);
         return(FALSE);
     }
     buffer[l] = 0;
     dom = virDomainDefineXML(ctl->conn, &buffer[0]);
     if (dom != NULL) {
-        vshPrint(ctl, "Domain %s defined from %s\n",
+        vshPrint(ctl, _("Domain %s defined from %s\n"),
                  virDomainGetName(dom), from);
     } else {
-        vshError(ctl, FALSE, "Failed to define domain\n");
+        vshError(ctl, FALSE, _("Failed to define domain from %s"), from);
         ret = FALSE;
     }
     return ret;
@@ -637,13 +638,13 @@
  */
 static vshCmdInfo info_undefine[] = {
     {"syntax", "undefine <domain>"},
-    {"help", "Undefine an inactive domain"},
-    {"desc", "Undefine the configuration for an inactive domain"},
+    {"help", gettext_noop("undefine an inactive domain")},
+    {"desc", gettext_noop("Undefine the configuration for an inactive domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_undefine[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -661,9 +662,9 @@
         return FALSE;
 
     if (virDomainUndefine(dom) == 0) {
-        vshPrint(ctl, "Domain %s has been undefined\n", name);
+        vshPrint(ctl, _("Domain %s has been undefined\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to undefine domain\n");
+        vshError(ctl, FALSE, _("Failed to undefine domain %s"), name);
         ret = FALSE;
     }
 
@@ -676,13 +677,13 @@
  */
 static vshCmdInfo info_start[] = {
     {"syntax", "start a domain "},
-    {"help", "start a (previously defined) inactive domain"},
-    {"desc", "Start a domain."},
+    {"help", gettext_noop("start a (previously defined) inactive domain")},
+    {"desc", gettext_noop("Start a domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_start[] = {
-    {"name", VSH_OT_DATA, VSH_OFLAG_REQ, "name of the inactive domain" },
+    {"name", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("name of the inactive domain")},
     {NULL, 0, 0, NULL}
 };
 
@@ -706,15 +707,15 @@
         return FALSE;
 
     if (virDomainGetID(dom) != (unsigned int)-1) {
-        vshError(ctl, FALSE, "Domain is already active\n");
+        vshError(ctl, FALSE, _("Domain is already active"));
         return FALSE;
     }
 
     if (virDomainCreate(dom) == 0) {
-        vshPrint(ctl, "Domain %s started\n",
+        vshPrint(ctl, _("Domain %s started\n"),
                  name);
     } else {
-        vshError(ctl, FALSE, "Failed to start domain\n");
+      vshError(ctl, FALSE, _("Failed to start domain %s"), name);
         ret = FALSE;
     }
     return ret;
@@ -725,14 +726,14 @@
  */
 static vshCmdInfo info_save[] = {
     {"syntax", "save <domain> <file>"},
-    {"help", "save a domain state to a file"},
-    {"desc", "Save a running domain."},
+    {"help", gettext_noop("save a domain state to a file")},
+    {"desc", gettext_noop("Save a running domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_save[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, "where to save the data"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("where to save the data")},
     {NULL, 0, 0, NULL}
 };
 
@@ -754,9 +755,9 @@
         return FALSE;
 
     if (virDomainSave(dom, to) == 0) {
-        vshPrint(ctl, "Domain %s saved\n", name);
+        vshPrint(ctl, _("Domain %s saved to %s\n"), name, to);
     } else {
-        vshError(ctl, FALSE, "Failed to save domain\n");
+        vshError(ctl, FALSE, _("Failed to save domain %s to %s"), name, to);
         ret = FALSE;
     }
 
@@ -769,13 +770,13 @@
  */
 static vshCmdInfo info_restore[] = {
     {"syntax", "restore a domain from <file>"},
-    {"help", "restore a domain from a saved state in a file"},
-    {"desc", "Restore a domain."},
+    {"help", gettext_noop("restore a domain from a saved state in a file")},
+    {"desc", gettext_noop("Restore a domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_restore[] = {
-    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, "the state to restore"},
+    {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("the state to restore")},
     {NULL, 0, 0, NULL}
 };
 
@@ -794,9 +795,9 @@
         return FALSE;
 
     if (virDomainRestore(ctl->conn, from) == 0) {
-        vshPrint(ctl, "Domain restored from %s\n", from);
+        vshPrint(ctl, _("Domain restored from %s\n"), from);
     } else {
-        vshError(ctl, FALSE, "Failed to restore domain\n");
+        vshError(ctl, FALSE, _("Failed to restore domain from %s"), from);
         ret = FALSE;
     }
     return ret;
@@ -807,13 +808,13 @@
  */
 static vshCmdInfo info_resume[] = {
     {"syntax", "resume <domain>"},
-    {"help", "resume a domain"},
-    {"desc", "Resume a previously suspended domain."},
+    {"help", gettext_noop("resume a domain")},
+    {"desc", gettext_noop("Resume a previously suspended domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_resume[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -831,9 +832,9 @@
         return FALSE;
 
     if (virDomainResume(dom) == 0) {
-        vshPrint(ctl, "Domain %s resumed\n", name);
+        vshPrint(ctl, _("Domain %s resumed\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to resume domain\n");
+        vshError(ctl, FALSE, _("Failed to resume domain %s"), name);
         ret = FALSE;
     }
 
@@ -846,13 +847,13 @@
  */
 static vshCmdInfo info_shutdown[] = {
     {"syntax", "shutdown <domain>"},
-    {"help", "gracefully shutdown a domain"},
-    {"desc", "Run shutdown in the targetted domain"},
+    {"help", gettext_noop("gracefully shutdown a domain")},
+    {"desc", gettext_noop("Run shutdown in the target domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_shutdown[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -870,9 +871,9 @@
         return FALSE;
 
     if (virDomainShutdown(dom) == 0) {
-        vshPrint(ctl, "Domain %s is being shutdown\n", name);
+        vshPrint(ctl, _("Domain %s is being shutdown\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to shutdown domain\n");
+        vshError(ctl, FALSE, _("Failed to shutdown domain %s"), name);
         ret = FALSE;
     }
 
@@ -885,13 +886,13 @@
  */
 static vshCmdInfo info_reboot[] = {
     {"syntax", "reboot <domain>"},
-    {"help", "reboot a domain"},
-    {"desc", "Run a reboot command in the targetted domain"},
+    {"help", gettext_noop("reboot a domain")},
+    {"desc", gettext_noop("Run a reboot command in the target domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_reboot[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -909,9 +910,9 @@
         return FALSE;
 
     if (virDomainReboot(dom, 0) == 0) {
-        vshPrint(ctl, "Domain %s is being rebooted\n", name);
+        vshPrint(ctl, _("Domain %s is being rebooted\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to reboot domain\n");
+        vshError(ctl, FALSE, _("Failed to reboot domain %s"), name);
         ret = FALSE;
     }
 
@@ -924,13 +925,13 @@
  */
 static vshCmdInfo info_destroy[] = {
     {"syntax", "destroy <domain>"},
-    {"help", "destroy a domain"},
-    {"desc", "Destroy a given domain."},
+    {"help", gettext_noop("destroy a domain")},
+    {"desc", gettext_noop("Destroy a given domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_destroy[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -948,9 +949,9 @@
         return FALSE;
 
     if (virDomainDestroy(dom) == 0) {
-        vshPrint(ctl, "Domain %s destroyed\n", name);
+        vshPrint(ctl, _("Domain %s destroyed\n"), name);
     } else {
-        vshError(ctl, FALSE, "Failed to destroy domain\n");
+        vshError(ctl, FALSE, _("Failed to destroy domain %s"), name);
         ret = FALSE;
         virDomainFree(dom);
     }
@@ -963,13 +964,13 @@
  */
 static vshCmdInfo info_dominfo[] = {
     {"syntax", "dominfo <domain>"},
-    {"help", "domain information"},
-    {"desc", "Returns basic information about the domain."},
+    {"help", gettext_noop("domain information")},
+    {"desc", gettext_noop("Returns basic information about the domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_dominfo[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -990,35 +991,36 @@
 
     id = virDomainGetID(dom);
     if (id == ((unsigned int)-1))
-      vshPrint(ctl, "%-15s %s\n", "Id:", "-");
+      vshPrint(ctl, "%-15s %s\n", _("Id:"), "-");
     else
-      vshPrint(ctl, "%-15s %d\n", "Id:", id);
-    vshPrint(ctl, "%-15s %s\n", "Name:", virDomainGetName(dom));
+      vshPrint(ctl, "%-15s %d\n", _("Id:"), id);
+    vshPrint(ctl, "%-15s %s\n", _("Name:"), virDomainGetName(dom));
+
     if (virDomainGetUUIDString(dom, &uuid[0])==0)
-        vshPrint(ctl, "%-15s %s\n", "UUID:", uuid);
+        vshPrint(ctl, "%-15s %s\n", _("UUID:"), uuid);
 
     if ((str = virDomainGetOSType(dom))) {
-        vshPrint(ctl, "%-15s %s\n", "OS Type:", str);
+        vshPrint(ctl, "%-15s %s\n", _("OS Type:"), str);
         free(str);
     }
 
     if (virDomainGetInfo(dom, &info) == 0) {
-        vshPrint(ctl, "%-15s %s\n", "State:",
-                 vshDomainStateToString(info.state));
+        vshPrint(ctl, "%-15s %s\n", _("State:"),
+                 _N(vshDomainStateToString(info.state)));
 
-        vshPrint(ctl, "%-15s %d\n", "CPU(s):", info.nrVirtCpu);
+        vshPrint(ctl, "%-15s %d\n", _("CPU(s):"), info.nrVirtCpu);
 
         if (info.cpuTime != 0) {
 	    double cpuUsed = info.cpuTime;
 
             cpuUsed /= 1000000000.0;
 
-            vshPrint(ctl, "%-15s %.1lfs\n", "CPU time:", cpuUsed);
+            vshPrint(ctl, "%-15s %.1lfs\n", _("CPU time:"), cpuUsed);
         }
 
-        vshPrint(ctl, "%-15s %lu kB\n", "Max memory:",
+        vshPrint(ctl, "%-15s %lu kB\n", _("Max memory:"),
                  info.maxMem);
-        vshPrint(ctl, "%-15s %lu kB\n", "Used memory:",
+	vshPrint(ctl, "%-15s %lu kB\n", _("Used memory:"),
                  info.memory);
 
     } else {
@@ -1034,13 +1036,13 @@
  */
 static vshCmdInfo info_vcpuinfo[] = {
     {"syntax", "vcpuinfo <domain>"},
-    {"help", "domain vcpu information"},
-    {"desc", "Returns basic information about the domain virtual CPUs."},
+    {"help", gettext_noop("domain vcpu information")},
+    {"desc", gettext_noop("Returns basic information about the domain virtual CPUs.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_vcpuinfo[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1082,18 +1084,18 @@
         int n;
 	for (n = 0 ; n < ncpus ; n++) {
 	    unsigned int m;
-	    vshPrint(ctl, "%-15s %d\n", "VCPU:", n);
-	    vshPrint(ctl, "%-15s %d\n", "CPU:", cpuinfo[n].cpu);
-	    vshPrint(ctl, "%-15s %s\n", "State:",
-		     vshDomainVcpuStateToString(cpuinfo[n].state));
+	    vshPrint(ctl, "%-15s %d\n", _("VCPU:"), n);
+	    vshPrint(ctl, "%-15s %d\n", _("CPU:"), cpuinfo[n].cpu);
+	    vshPrint(ctl, "%-15s %s\n", _("State:"),
+		     _N(vshDomainVcpuStateToString(cpuinfo[n].state)));
 	    if (cpuinfo[n].cpuTime != 0) {
 	        double cpuUsed = cpuinfo[n].cpuTime;
 		
 		cpuUsed /= 1000000000.0;
 		
-		vshPrint(ctl, "%-15s %.1lfs\n", "CPU time:", cpuUsed);
+		vshPrint(ctl, "%-15s %.1lfs\n", _("CPU time:"), cpuUsed);
 	    }
-	    vshPrint(ctl, "%-15s ", "CPU Affinity:");
+	    vshPrint(ctl, "%-15s ", _("CPU Affinity:"));
 	    for (m = 0 ; m < VIR_NODEINFO_MAXCPUS(nodeinfo) ; m++) {
 	        vshPrint(ctl, "%c", VIR_CPU_USABLE(cpumap, cpumaplen, n, m) ? 'y' : '-');
 	    }
@@ -1117,15 +1119,15 @@
  */
 static vshCmdInfo info_vcpupin[] = {
     {"syntax", "vcpupin <domain>"},
-    {"help", "control domain vcpu affinity"},
-    {"desc", "Pin domain VCPUs to host physical CPUs"},
+    {"help", gettext_noop("control domain vcpu affinity")},
+    {"desc", gettext_noop("Pin domain VCPUs to host physical CPUs.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_vcpupin[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
-    {"vcpu", VSH_OT_DATA, VSH_OFLAG_REQ, "vcpu number"},
-    {"cpulist", VSH_OT_DATA, VSH_OFLAG_REQ, "host cpu number(s) (comma separated)"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"vcpu", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("vcpu number")},
+    {"cpulist", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("host cpu number(s) (comma separated)")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1203,14 +1205,14 @@
  */
 static vshCmdInfo info_setvcpus[] = {
     {"syntax", "setvcpus <domain> <count>"},
-    {"help", "change number of virtual CPUs"},
-    {"desc", "Change the number of virtual CPUs active in the guest domain"},
+    {"help", gettext_noop("change number of virtual CPUs")},
+    {"desc", gettext_noop("Change the number of virtual CPUs active in the guest domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_setvcpus[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
-    {"count", VSH_OT_DATA, VSH_OFLAG_REQ, "number of virtual CPUs"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"count", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("number of virtual CPUs")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1246,14 +1248,14 @@
  */
 static vshCmdInfo info_setmem[] = {
     {"syntax", "setmem <domain> <bytes>"},
-    {"help", "change memory allocation"},
-    {"desc", "Change the current memory allocation in the guest domain"},
+    {"help", gettext_noop("change memory allocation")},
+    {"desc", gettext_noop("Change the current memory allocation in the guest domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_setmem[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
-    {"bytes", VSH_OT_DATA, VSH_OFLAG_REQ, "number of bytes of memory"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"bytes", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("number of bytes of memory")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1289,14 +1291,14 @@
  */
 static vshCmdInfo info_setmaxmem[] = {
     {"syntax", "setmaxmem <domain> <bytes>"},
-    {"help", "change maximum memory limit"},
-    {"desc", "Change the maximum memory allocation limit in the guest domain"},
+    {"help", gettext_noop("change maximum memory limit")},
+    {"desc", gettext_noop("Change the maximum memory allocation limit in the guest domain.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_setmaxmem[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id or uuid"},
-    {"bytes", VSH_OT_DATA, VSH_OFLAG_REQ, "maxmimum memory limit in bytes"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"bytes", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("maxmimum memory limit in bytes")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1332,8 +1334,8 @@
  */
 static vshCmdInfo info_nodeinfo[] = {
     {"syntax", "nodeinfo"},
-    {"help", "node information"},
-    {"desc", "Returns basic information about the node."},
+    {"help", gettext_noop("node information")},
+    {"desc", gettext_noop("Returns basic information about the node.")},
     {NULL, NULL}
 };
 
@@ -1341,23 +1343,23 @@
 cmdNodeinfo(vshControl * ctl, vshCmd * cmd ATTRIBUTE_UNUSED)
 {
     virNodeInfo info;
-        
+
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
 
     if (virNodeGetInfo(ctl->conn, &info) < 0) {
-        vshError(ctl, FALSE, "failed to get node information");
+        vshError(ctl, FALSE, _("failed to get node information"));
         return FALSE;
-    }    
-    vshPrint(ctl, "%-20s %s\n", "CPU model:", info.model);
-    vshPrint(ctl, "%-20s %d\n", "CPU(s):", info.cpus);
-    vshPrint(ctl, "%-20s %d MHz\n", "CPU frequency:", info.mhz);
-    vshPrint(ctl, "%-20s %d\n", "CPU socket(s):", info.sockets);
-    vshPrint(ctl, "%-20s %d\n", "Core(s) per socket:", info.cores);
-    vshPrint(ctl, "%-20s %d\n", "Thread(s) per core:", info.threads);
-    vshPrint(ctl, "%-20s %d\n", "NUMA cell(s):", info.nodes);
-    vshPrint(ctl, "%-20s %lu kB\n", "Memory size:", info.memory);
-        
+    }
+    vshPrint(ctl, "%-20s %s\n", _("CPU model:"), info.model);
+    vshPrint(ctl, "%-20s %d\n", _("CPU(s):"), info.cpus);
+    vshPrint(ctl, "%-20s %d MHz\n", _("CPU frequency:"), info.mhz);
+    vshPrint(ctl, "%-20s %d\n", _("CPU socket(s):"), info.sockets);
+    vshPrint(ctl, "%-20s %d\n", _("Core(s) per socket:"), info.cores);
+    vshPrint(ctl, "%-20s %d\n", _("Thread(s) per core:"), info.threads);
+    vshPrint(ctl, "%-20s %d\n", _("NUMA cell(s):"), info.nodes);
+    vshPrint(ctl, "%-20s %lu kB\n", _("Memory size:"), info.memory);
+
     return TRUE;
 }
 
@@ -1366,13 +1368,13 @@
  */
 static vshCmdInfo info_dumpxml[] = {
     {"syntax", "dumpxml <name>"},
-    {"help", "domain information in XML"},
-    {"desc", "Ouput the domain information as an XML dump to stdout"},
+    {"help", gettext_noop("domain information in XML")},
+    {"desc", gettext_noop("Ouput the domain information as an XML dump to stdout.")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_dumpxml[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name, id, uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1406,12 +1408,12 @@
  */
 static vshCmdInfo info_domname[] = {
     {"syntax", "domname <domain>"},
-    {"help", "convert a domain Id or UUID to domain name"},
+    {"help", gettext_noop("convert a domain id or UUID to domain name")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_domname[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain id or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain id or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1436,12 +1438,12 @@
  */
 static vshCmdInfo info_domid[] = {
     {"syntax", "domid <domain>"},
-    {"help", "convert a domain name or UUID to domain Id"},
+    {"help", gettext_noop("convert a domain name or UUID to domain id")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_domid[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain name or uuid"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name or uuid")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1471,12 +1473,12 @@
  */
 static vshCmdInfo info_domuuid[] = {
     {"syntax", "domuuid <domain>"},
-    {"help", "convert a domain name or id to domain UUID"},
+    {"help", gettext_noop("convert a domain name or id to domain UUID")},
     {NULL, NULL}
 };
 
 static vshCmdOptDef opts_domuuid[] = {
-    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, "domain id or name"},
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain id or name")},
     {NULL, 0, 0, NULL}
 };
 
@@ -1488,15 +1490,15 @@
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
-    if (!(dom = vshCommandOptDomainBy(ctl, cmd, "domain", NULL, 
+    if (!(dom = vshCommandOptDomainBy(ctl, cmd, "domain", NULL,
                                     VSH_DOMBYNAME|VSH_DOMBYID)))
         return FALSE;
-    
+
     if (virDomainGetUUIDString(dom, uuid) != -1)
         vshPrint(ctl, "%s\n", uuid);
     else
-        vshError(ctl, FALSE, "failed to get domain UUID");
-    
+        vshError(ctl, FALSE, _("failed to get domain UUID"));
+
     return TRUE;
 }
 
@@ -1506,8 +1508,8 @@
  */
 static vshCmdInfo info_version[] = {
     {"syntax", "version"},
-    {"help", "show versions"},
-    {"desc", "Display the version information available"},
+    {"help", gettext_noop("show version")},
+    {"desc", gettext_noop("Display the system version information.")},
     {NULL, NULL}
 };
 
@@ -1530,7 +1532,7 @@
 
     hvType = virConnectGetType(ctl->conn);
     if (hvType == NULL) {
-        vshError(ctl, FALSE, "failed to get hypervisor type\n");
+        vshError(ctl, FALSE, _("failed to get hypervisor type"));
         return FALSE;
     }
 
@@ -1539,43 +1541,43 @@
     includeVersion %= 1000000;
     minor = includeVersion / 1000;
     rel = includeVersion % 1000;
-    vshPrint(ctl, "Compiled against library: libvir %d.%d.%d\n",
+    vshPrint(ctl, _("Compiled against library: libvir %d.%d.%d\n"),
              major, minor, rel);
 
     ret = virGetVersion(&libVersion, hvType, &apiVersion);
     if (ret < 0) {
-        vshError(ctl, FALSE, "failed to get the library version");
+        vshError(ctl, FALSE, _("failed to get the library version"));
         return FALSE;
     }
     major = libVersion / 1000000;
     libVersion %= 1000000;
     minor = libVersion / 1000;
     rel = libVersion % 1000;
-    vshPrint(ctl, "Using library: libvir %d.%d.%d\n",
+    vshPrint(ctl, _("Using library: libvir %d.%d.%d\n"),
              major, minor, rel);
 
     major = apiVersion / 1000000;
     apiVersion %= 1000000;
     minor = apiVersion / 1000;
     rel = apiVersion % 1000;
-    vshPrint(ctl, "Using API: %s %d.%d.%d\n", hvType,
+    vshPrint(ctl, _("Using API: %s %d.%d.%d\n"), hvType,
              major, minor, rel);
 
     ret = virConnectGetVersion(ctl->conn, &hvVersion);
     if (ret < 0) {
-        vshError(ctl, FALSE, "failed to get the hypervisor version");
+        vshError(ctl, FALSE, _("failed to get the hypervisor version"));
         return FALSE;
     }
     if (hvVersion == 0) {
         vshPrint(ctl,
-                 "cannot extract running %s hypervisor version\n", hvType);
+                 _("Cannot extract running %s hypervisor version\n"), hvType);
     } else {
         major = hvVersion / 1000000;
         hvVersion %= 1000000;
         minor = hvVersion / 1000;
         rel = hvVersion % 1000;
 
-        vshPrint(ctl, "Running hypervisor: %s %d.%d.%d\n",
+        vshPrint(ctl, _("Running hypervisor: %s %d.%d.%d\n"),
                  hvType, major, minor, rel);
     }
     return TRUE;
@@ -1586,7 +1588,7 @@
  */
 static vshCmdInfo info_quit[] = {
     {"syntax", "quit"},
-    {"help", "quit this interactive terminal"},
+    {"help", gettext_noop("quit this interactive terminal")},
     {NULL, NULL}
 };
 
@@ -1698,8 +1700,8 @@
             if (!ok) {
                 vshError(ctl, FALSE,
                          d->type == VSH_OT_DATA ?
-                         "command '%s' requires <%s> option" :
-                         "command '%s' requires --%s option",
+                         _("command '%s' requires <%s> option") :
+			 _("command '%s' requires --%s option"),
                          def->name, d->name);
                 err = 1;
             }
@@ -1726,39 +1728,39 @@
     vshCmdDef *def = vshCmddefSearch(cmdname);
 
     if (!def) {
-        vshError(ctl, FALSE, "command '%s' doesn't exist", cmdname);
+        vshError(ctl, FALSE, _("command '%s' doesn't exist"), cmdname);
         return FALSE;
     } else {
         vshCmdOptDef *opt;
-        const char *desc = vshCmddefGetInfo(def, "desc");
-        const char *help = vshCmddefGetInfo(def, "help");
+        const char *desc = _N(vshCmddefGetInfo(def, "desc"));
+        const char *help = _N(vshCmddefGetInfo(def, "help"));
         const char *syntax = vshCmddefGetInfo(def, "syntax");
 
-        fputs("  NAME\n", stdout);
+        fputs(_("  NAME\n"), stdout);
         fprintf(stdout, "    %s - %s\n", def->name, help);
 
         if (syntax) {
-            fputs("\n  SYNOPSIS\n", stdout);
+            fputs(("\n  SYNOPSIS\n"), stdout);
             if (!withprog)
                 fprintf(stdout, "    %s\n", syntax);
             else
                 fprintf(stdout, "    %s %s\n", progname, syntax);
         }
         if (desc) {
-            fputs("\n  DESCRIPTION\n", stdout);
+            fputs(_("\n  DESCRIPTION\n"), stdout);
             fprintf(stdout, "    %s\n", desc);
         }
         if (def->opts) {
-            fputs("\n  OPTIONS\n", stdout);
+            fputs(_("\n  OPTIONS\n"), stdout);
             for (opt = def->opts; opt->name; opt++) {
                 char buf[256];
 
                 if (opt->type == VSH_OT_BOOL)
                     snprintf(buf, sizeof(buf), "--%s", opt->name);
                 else if (opt->type == VSH_OT_INT)
-                    snprintf(buf, sizeof(buf), "--%s <number>", opt->name);
+                    snprintf(buf, sizeof(buf), _("--%s <number>"), opt->name);
                 else if (opt->type == VSH_OT_STRING)
-                    snprintf(buf, sizeof(buf), "--%s <string>", opt->name);
+                    snprintf(buf, sizeof(buf), _("--%s <string>"), opt->name);
                 else if (opt->type == VSH_OT_DATA)
                     snprintf(buf, sizeof(buf), "<%s>", opt->name);
 
@@ -1871,7 +1873,7 @@
     int id;
 
     if (!(n = vshCommandOptString(cmd, optname, NULL))) {
-        vshError(ctl, FALSE, "undefined domain name or id");
+        vshError(ctl, FALSE, _("undefined domain name or id"));
         return NULL;
     }
 
@@ -1904,7 +1906,7 @@
     }
 
     if (!dom)
-        vshError(ctl, FALSE, "failed to get domain '%s'", n);
+        vshError(ctl, FALSE, _("failed to get domain '%s'"), n);
 
     return dom;
 }
@@ -1932,7 +1934,7 @@
             return ret;
 
         if (ctl->timing)
-            vshPrint(ctl, "\n(Time: %.3f ms)\n\n",
+            vshPrint(ctl, _("\n(Time: %.3f ms)\n\n"),
                      DIFF_MSEC(&after, &before));
         else
             vshPrintExtra(ctl, "\n");
@@ -2006,7 +2008,7 @@
         sz++;
     }
     if (quote) {
-        vshError(ctl, FALSE, "missing \"");
+        vshError(ctl, FALSE, _("missing \""));
         return VSH_TK_ERROR;
     }
     if (tkstr == NULL || *tkstr == '\0' || p == NULL)
@@ -2067,19 +2069,19 @@
                 /* first token must be command name */
                 if (tk != VSH_TK_DATA) {
                     vshError(ctl, FALSE,
-                             "unexpected token (command name): '%s'",
+                             _("unexpected token (command name): '%s'"),
                              tkdata);
                     goto syntaxError;
                 }
                 if (!(cmd = vshCmddefSearch(tkdata))) {
-                    vshError(ctl, FALSE, "unknown command: '%s'", tkdata);
+                    vshError(ctl, FALSE, _("unknown command: '%s'"), tkdata);
                     goto syntaxError;   /* ... or ignore this command only? */
                 }
                 free(tkdata);
             } else if (tk == VSH_TK_OPTION) {
                 if (!(opt = vshCmddefGetOption(cmd, tkdata))) {
                     vshError(ctl, FALSE,
-                             "command '%s' doesn't support option --%s",
+                             _("command '%s' doesn't support option --%s"),
                              cmd->name, tkdata);
                     goto syntaxError;
                 }
@@ -2094,16 +2096,16 @@
                         goto syntaxError;
                     if (tk != VSH_TK_DATA) {
                         vshError(ctl, FALSE,
-                                 "expected syntax: --%s <%s>",
+                                 _("expected syntax: --%s <%s>"),
                                  opt->name,
                                  opt->type ==
-                                 VSH_OT_INT ? "number" : "string");
+                                 VSH_OT_INT ? _("number") : _("string"));
                         goto syntaxError;
                     }
                 }
             } else if (tk == VSH_TK_DATA) {
                 if (!(opt = vshCmddefGetData(cmd, data_ct++))) {
-                    vshError(ctl, FALSE, "unexpected data '%s'", tkdata);
+                    vshError(ctl, FALSE, _("unexpected data '%s'"), tkdata);
                     goto syntaxError;
                 }
             }
@@ -2125,7 +2127,7 @@
                 vshDebug(ctl, 4, "%s: %s(%s): %s\n",
                          cmd->name,
                          opt->name,
-                         tk == VSH_TK_OPTION ? "OPTION" : "DATA",
+                         tk == VSH_TK_OPTION ? _("OPTION") : _("DATA"),
                          arg->data);
             }
             if (!str)
@@ -2173,19 +2175,19 @@
 {
     switch (state) {
         case VIR_DOMAIN_RUNNING:
-            return "running ";
+            return gettext_noop("running");
         case VIR_DOMAIN_BLOCKED:
-            return "blocked ";
+            return gettext_noop("blocked");
         case VIR_DOMAIN_PAUSED:
-            return "paused ";
+            return gettext_noop("paused");
         case VIR_DOMAIN_SHUTDOWN:
-            return "in shutdown";
+            return gettext_noop("in shutdown");
         case VIR_DOMAIN_SHUTOFF:
-            return "shut off";
+            return gettext_noop("shut off");
         case VIR_DOMAIN_CRASHED:
-            return "crashed";
+            return gettext_noop("crashed");
         default:
-            return "no state";  /* = dom0 state */
+            return gettext_noop("no state");  /* = dom0 state */
     }
     return NULL;
 }
@@ -2195,13 +2197,13 @@
 {
     switch (state) {
         case VIR_VCPU_OFFLINE:
-            return "offline";
+            return gettext_noop("offline");
         case VIR_VCPU_BLOCKED:
-            return "blocked";
+            return gettext_noop("blocked");
         case VIR_VCPU_RUNNING:
-            return "running";
+            return gettext_noop("running");
         default:
-            return "no state";
+            return gettext_noop("no state");
     }
     return NULL;
 }
@@ -2214,7 +2216,7 @@
      */
     if (!conn) {
         if (showerror)
-            vshError(ctl, FALSE, "no valid connection.");
+            vshError(ctl, FALSE, _("no valid connection"));
         return FALSE;
     }
     return TRUE;
@@ -2253,9 +2255,9 @@
     va_list ap;
 
     if (doexit)
-        fprintf(stderr, "%s: error: ", progname);
+        fprintf(stderr, _("%s: error: "), progname);
     else
-        fputs("error: ", stderr);
+        fputs(_("error: "), stderr);
 
     va_start(ap, format);
     vfprintf(stderr, format, ap);
@@ -2277,8 +2279,8 @@
 
     if ((x = malloc(size)))
         return x;
-    vshError(ctl, TRUE, "%s: %d: failed to allocate %d bytes\n", 
-                filename, line, (int) size);
+    vshError(ctl, TRUE, _("%s: %d: failed to allocate %d bytes"),
+	     filename, line, (int) size);
     return NULL;
 }
 
@@ -2289,8 +2291,8 @@
 
     if ((x = calloc(nmemb, size)))
         return x;
-    vshError(ctl, TRUE, "%s: %d: failed to allocate %d bytes\n", 
-                filename, line, (int) (size*nmemb));
+    vshError(ctl, TRUE, _("%s: %d: failed to allocate %d bytes"),
+	     filename, line, (int) (size*nmemb));
     return NULL;
 }
 
@@ -2301,8 +2303,8 @@
 
     if ((x = strdup(s)))
         return x;
-    vshError(ctl, TRUE, "%s: %d: failed to allocate %d bytes\n", 
-                filename, line, strlen(s));
+    vshError(ctl, TRUE, _("%s: %d: failed to allocate %d bytes"),
+	     filename, line, strlen(s));
     return NULL;
 }
 
@@ -2329,7 +2331,7 @@
         ctl->conn = virConnectOpenReadOnly(ctl->name);
 
     if (!ctl->conn)
-        vshError(ctl, TRUE, "failed to connect to the hypervisor");
+        vshError(ctl, TRUE, _("failed to connect to the hypervisor"));
 
     return TRUE;
 }
@@ -2474,23 +2476,23 @@
 
     /* global help */
     if (!cmdname) {
-        fprintf(stdout, "\n%s [options] [commands]\n\n"
-                "  options:\n"
-                "    -c | --connect <name>   optional argument currently unused (or used for tests only)\n"
-                "    -d | --debug <num>      debug level [0-5]\n"
-                "    -h | --help             this help\n"
-                "    -q | --quiet            quiet mode\n"
-                "    -t | --timing           print timing information\n"
-                "    -v | --version          program version\n\n"
-                "  commands (non interactive mode):\n", progname);
+        fprintf(stdout, _("\n%s [options] [commands]\n\n"
+			  "  options:\n"
+			  "    -c | --connect <uri>    hypervisor connection URI\n"
+			  "    -d | --debug <num>      debug level [0-5]\n"
+			  "    -h | --help             this help\n"
+			  "    -q | --quiet            quiet mode\n"
+			  "    -t | --timing           print timing information\n"
+			  "    -v | --version          program version\n\n"
+			  "  commands (non interactive mode):\n"), progname);
 
         for (cmd = commands; cmd->name; cmd++)
             fprintf(stdout,
-                    "    %-15s %s\n", cmd->name, vshCmddefGetInfo(cmd,
-                                                                  "help"));
+                    "    %-15s %s\n", cmd->name, _N(vshCmddefGetInfo(cmd,
+								     "help")));
 
         fprintf(stdout,
-                "\n  (specify --help <command> for details about the command)\n\n");
+                _("\n  (specify --help <command> for details about the command)\n\n"));
         return;
     }
     if (!vshCmddefHelp(ctl, cmdname, TRUE))
@@ -2576,7 +2578,7 @@
                 exit(EXIT_SUCCESS);
             default:
                 vshError(ctl, TRUE,
-                  "unsupported option '-%c'. See --help.", arg);
+			 _("unsupported option '-%c'. See --help."), arg);
                 break;
         }
     }
@@ -2620,6 +2622,19 @@
     char *defaultConn;
     int ret = TRUE;
 
+    if (!setlocale(LC_ALL, "")) {
+        perror("setlocale");
+	return -1;
+    }
+    if (!bindtextdomain(GETTEXT_PACKAGE, LOCALEBASEDIR)) {
+        perror("bindtextdomain");
+	return -1;
+    }
+    if (!textdomain(GETTEXT_PACKAGE)) {
+        perror("textdomain");
+	return -1;
+    }
+
     if (!(progname = strrchr(argv[0], '/')))
         progname = argv[0];
     else
@@ -2644,11 +2659,11 @@
         /* interactive mode */
         if (!ctl->quiet) {
             vshPrint(ctl,
-                     "Welcome to %s, the virtualization interactive terminal.\n\n",
+                     _("Welcome to %s, the virtualization interactive terminal.\n\n"),
                      progname);
             vshPrint(ctl,
-                     "Type:  'help' for help with commands\n"
-                     "       'quit' to quit\n\n");
+                     _("Type:  'help' for help with commands\n"
+		       "       'quit' to quit\n\n"));
         }
         vshReadlineInit();
         do {
Index: src/virterror.c
===================================================================
RCS file: /data/cvs/libvirt/src/virterror.c,v
retrieving revision 1.17
diff -u -r1.17 virterror.c
--- src/virterror.c	29 Aug 2006 22:27:07 -0000	1.17
+++ src/virterror.c	20 Sep 2006 19:55:56 -0000
@@ -240,10 +240,10 @@
             lvl = "";
             break;
         case VIR_ERR_WARNING:
-            lvl = "warning";
+            lvl = _("warning");
             break;
         case VIR_ERR_ERROR:
-            lvl = "error";
+            lvl = _("error");
             break;
     }
     switch (err->domain) {
@@ -325,7 +325,7 @@
      * formats the message
      */
     if (msg == NULL) {
-        str = strdup("No error message provided");
+        str = strdup(_("No error message provided"));
     } else {
         VIR_GET_VAR_STR(msg, str);
     }
@@ -379,195 +379,195 @@
             return (NULL);
         case VIR_ERR_INTERNAL_ERROR:
             if (info != NULL)
-                errmsg = "internal error %s";
+	      errmsg = _("internal error %s");
             else
-                errmsg = "internal error";
+	      errmsg = _("internal error");
             break;
         case VIR_ERR_NO_MEMORY:
-            errmsg = "out of memory";
+            errmsg = _("out of memory");
             break;
         case VIR_ERR_NO_SUPPORT:
             if (info != NULL)
-		errmsg = "no support for hypervisor";
+		errmsg = _("no support for hypervisor");
 	    else
-		errmsg = "no support for hypervisor %s";
+		errmsg = _("no support for hypervisor %s");
             break;
         case VIR_ERR_NO_CONNECT:
             if (info == NULL)
-                errmsg = "could not connect to hypervisor";
+                errmsg = _("could not connect to hypervisor");
             else
-                errmsg = "could not connect to %s";
+                errmsg = _("could not connect to %s");
             break;
         case VIR_ERR_INVALID_CONN:
             if (info == NULL)
-		errmsg = "invalid connection pointer in";
+		errmsg = _("invalid connection pointer in");
 	    else
-		errmsg = "invalid connection pointer in %s";
+		errmsg = _("invalid connection pointer in %s");
             break;
         case VIR_ERR_INVALID_DOMAIN:
             if (info == NULL)
-		errmsg = "invalid domain pointer in";
+		errmsg = _("invalid domain pointer in");
 	    else
-	        errmsg = "invalid domain pointer in %s";
+	        errmsg = _("invalid domain pointer in %s");
             break;
         case VIR_ERR_INVALID_ARG:
             if (info == NULL)
-		errmsg = "invalid argument in";
+		errmsg = _("invalid argument in");
 	    else
-		errmsg = "invalid argument in %s";
+		errmsg = _("invalid argument in %s");
             break;
         case VIR_ERR_OPERATION_FAILED:
             if (info != NULL)
-                errmsg = "operation failed: %s";
+                errmsg = _("operation failed: %s");
             else
-                errmsg = "operation failed";
+                errmsg = _("operation failed");
             break;
         case VIR_ERR_GET_FAILED:
             if (info != NULL)
-                errmsg = "GET operation failed: %s";
+                errmsg = _("GET operation failed: %s");
             else
-                errmsg = "GET operation failed";
+                errmsg = _("GET operation failed");
             break;
         case VIR_ERR_POST_FAILED:
             if (info != NULL)
-                errmsg = "POST operation failed: %s";
+                errmsg = _("POST operation failed: %s");
             else
-                errmsg = "POST operation failed";
+                errmsg = _("POST operation failed");
             break;
         case VIR_ERR_HTTP_ERROR:
-            errmsg = "got unknown HTTP error code %d";
+            errmsg = _("got unknown HTTP error code %d");
             break;
         case VIR_ERR_UNKNOWN_HOST:
             if (info != NULL)
-		errmsg = "unknown host %s";
+		errmsg = _("unknown host %s");
 	    else
-		errmsg = "unknown host";
+		errmsg = _("unknown host");
             break;
         case VIR_ERR_SEXPR_SERIAL:
             if (info != NULL)
-                errmsg = "failed to serialize S-Expr: %s";
+                errmsg = _("failed to serialize S-Expr: %s");
             else
-                errmsg = "failed to serialize S-Expr";
+                errmsg = _("failed to serialize S-Expr");
             break;
         case VIR_ERR_NO_XEN:
             if (info == NULL)
-                errmsg = "could not use Xen hypervisor entry";
+                errmsg = _("could not use Xen hypervisor entry");
             else
-                errmsg = "could not use Xen hypervisor entry %s";
+                errmsg = _("could not use Xen hypervisor entry %s");
             break;
 	case VIR_ERR_NO_XENSTORE:
             if (info == NULL)
-                errmsg = "could not connect to Xen Store";
+                errmsg = _("could not connect to Xen Store");
             else
-                errmsg = "could not connect to Xen Store %s";
+                errmsg = _("could not connect to Xen Store %s");
             break;
         case VIR_ERR_XEN_CALL:
-            errmsg = "failed Xen syscall %s %d";
+            errmsg = _("failed Xen syscall %s %d");
             break;
         case VIR_ERR_OS_TYPE:
             if (info == NULL)
-                errmsg = "unknown OS type";
+                errmsg = _("unknown OS type");
             else
-                errmsg = "unknown OS type %s";
+                errmsg = _("unknown OS type %s");
             break;
         case VIR_ERR_NO_KERNEL:
-            errmsg = "missing kernel information";
+            errmsg = _("missing kernel information");
             break;
         case VIR_ERR_NO_ROOT:
             if (info == NULL)
-                errmsg = "missing root device information";
+                errmsg = _("missing root device information");
             else
-                errmsg = "missing root device information in %s";
+                errmsg = _("missing root device information in %s");
             break;
         case VIR_ERR_NO_SOURCE:
             if (info == NULL)
-                errmsg = "missing source information for device";
+                errmsg = _("missing source information for device");
             else
-                errmsg = "missing source information for device %s";
+                errmsg = _("missing source information for device %s");
             break;
         case VIR_ERR_NO_TARGET:
             if (info == NULL)
-                errmsg = "missing target information for device";
+                errmsg = _("missing target information for device");
             else
-                errmsg = "missing target information for device %s";
+                errmsg = _("missing target information for device %s");
             break;
         case VIR_ERR_NO_NAME:
             if (info == NULL)
-                errmsg = "missing domain name information";
+                errmsg = _("missing domain name information");
             else
-                errmsg = "missing domain name information in %s";
+                errmsg = _("missing domain name information in %s");
             break;
         case VIR_ERR_NO_OS:
             if (info == NULL)
-                errmsg = "missing operating system information";
+                errmsg = _("missing operating system information");
             else
-                errmsg = "missing operating system information for %s";
+                errmsg = _("missing operating system information for %s");
             break;
         case VIR_ERR_NO_DEVICE:
             if (info == NULL)
-                errmsg = "missing devices information";
+                errmsg = _("missing devices information");
             else
-                errmsg = "missing devices information for %s";
+                errmsg = _("missing devices information for %s");
             break;
         case VIR_ERR_DRIVER_FULL:
             if (info == NULL)
-                errmsg = "too many drivers registered";
+                errmsg = _("too many drivers registered");
             else
-                errmsg = "too many drivers registered in %s";
+                errmsg = _("too many drivers registered in %s");
             break;
         case VIR_ERR_CALL_FAILED:
             if (info == NULL)
-                errmsg = "library call failed, possibly not supported";
+                errmsg = _("library call failed, possibly not supported");
             else
-                errmsg = "library call %s failed, possibly not supported";
+                errmsg = _("library call %s failed, possibly not supported");
             break;
 	case VIR_ERR_XML_ERROR:
 	    if (info == NULL)
-	        errmsg = "XML description not well formed or invalid";
+	        errmsg = _("XML description not well formed or invalid");
 	    else
-	        errmsg = "XML description for %s is not well formed or invalid";
+	        errmsg = _("XML description for %s is not well formed or invalid");
             break;
 	case VIR_ERR_DOM_EXIST:
 	    if (info == NULL)
-	        errmsg = "this domain exists already";
+	        errmsg = _("this domain exists already");
 	    else
-	        errmsg = "domain %s exists already";
+	        errmsg = _("domain %s exists already");
             break;
 	case VIR_ERR_OPERATION_DENIED:
 	    if (info == NULL)
-	        errmsg = "operation forbidden for read only access";
+	        errmsg = _("operation forbidden for read only access");
 	    else
-	        errmsg = "operation %s forbidden for read only access";
+	        errmsg = _("operation %s forbidden for read only access");
             break;
 	case VIR_ERR_OPEN_FAILED:
 	    if (info == NULL)
-	        errmsg = "failed to open configuration file for reading";
+	        errmsg = _("failed to open configuration file for reading");
 	    else
-	        errmsg = "failed to open %s for reading";
+	        errmsg = _("failed to open %s for reading");
             break;
 	case VIR_ERR_READ_FAILED:
 	    if (info == NULL)
-	        errmsg = "failed to read configuration file";
+	        errmsg = _("failed to read configuration file");
 	    else
-	        errmsg = "failed to read configuration file %s";
+	        errmsg = _("failed to read configuration file %s");
             break;
 	case VIR_ERR_PARSE_FAILED:
 	    if (info == NULL)
-	        errmsg = "failed to parse configuration file";
+	        errmsg = _("failed to parse configuration file");
 	    else
-	        errmsg = "failed to parse configuration file %s";
+	        errmsg = _("failed to parse configuration file %s");
             break;
 	case VIR_ERR_CONF_SYNTAX:
 	    if (info == NULL)
-	        errmsg = "configuration file syntax error";
+	        errmsg = _("configuration file syntax error");
 	    else
-	        errmsg = "configuration file syntax error: %s";
+	        errmsg = _("configuration file syntax error: %s");
             break;
 	case VIR_ERR_WRITE_FAILED:
 	    if (info == NULL)
-	        errmsg = "failed to write configuration file";
+	        errmsg = _("failed to write configuration file");
 	    else
-	        errmsg = "failed to write configuration file: %s";
+	        errmsg = _("failed to write configuration file: %s");
             break;
     }
     return (errmsg);
Index: src/xen_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xen_internal.c,v
retrieving revision 1.40
diff -u -r1.40 xen_internal.c
--- src/xen_internal.c	19 Sep 2006 15:55:57 -0000	1.40
+++ src/xen_internal.c	20 Sep 2006 19:55:57 -0000
@@ -1238,7 +1238,7 @@
 retry:
     dominfos = malloc(maxids * sizeof(xen_v0_getdomaininfo));
     if (dominfos == NULL) {
-        virXenError(VIR_ERR_NO_MEMORY, "failed to allocate %d domain info",
+        virXenError(VIR_ERR_NO_MEMORY, _("allocating %d domain info"),
 	            maxids);
 	return(-1);
     }
@@ -1285,7 +1285,7 @@
 
     dominfos = malloc(maxids * sizeof(xen_v0_getdomaininfo));
     if (dominfos == NULL) {
-        virXenError(VIR_ERR_NO_MEMORY, "failed to allocate %d domain info",
+        virXenError(VIR_ERR_NO_MEMORY, "allocating %d domain info",
 	            maxids);
 	return(-1);
     }
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.62
diff -u -r1.62 xend_internal.c
--- src/xend_internal.c	14 Sep 2006 15:34:50 -0000	1.62
+++ src/xend_internal.c	20 Sep 2006 19:55:58 -0000
@@ -261,10 +261,10 @@
         if (len == -1) {
             if (do_read)
                 virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                             "faid to read from Xen Daemon");
+                             _("failed to read from Xen Daemon"));
             else
                 virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                             "faid to read from Xen Daemon");
+                             _("failed to read from Xen Daemon"));
 
             return (-1);
         }
@@ -1053,7 +1053,7 @@
     if (ptr == NULL) {
         /* this should be caught at the interface but ... */
         virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                     "Failed to urlencode the create S-Expr");
+                     _("failed to urlencode the create S-Expr"));
         return (-1);
     }
 
@@ -1094,20 +1094,20 @@
     value = sexpr_node(root, "domain/domid");
     if (value == NULL) {
         virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                     "domain information incomplete, missing domid");
+                     _("domain information incomplete, missing domid"));
         goto error;
     }
     ret = strtol(value, NULL, 0);
     if ((ret == 0) && (value[0] != '0')) {
         virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                     "domain information incorrect domid not numberic");
+                     _("domain information incorrect domid not numeric"));
         ret = -1;
     } else if (uuid != NULL) {
         char **ptr = (char **) &uuid;
 
         if (sexpr_uuid(ptr, root, "domain/uuid") == NULL) {
             virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                         "domain information incomplete, missing uuid");
+                         _("domain information incomplete, missing uuid"));
         }
     }
 
@@ -1147,7 +1147,7 @@
     name = sexpr_node(root, "domain/name");
     if (name == NULL) {
       virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                   "domain information incomplete, missing name");
+                   _("domain information incomplete, missing name"));
       goto error;
     }
     if (domname)
@@ -1156,7 +1156,7 @@
     dst_uuid = (char *)&uuid[0];
     if (sexpr_uuid(&dst_uuid, root, "domain/uuid") == NULL) {
       virXendError(xend, VIR_ERR_INTERNAL_ERROR,
-                   "domain information incomplete, missing uuid");
+                   _("domain information incomplete, missing uuid"));
       goto error;
     }
 
@@ -1405,7 +1405,7 @@
         tmp = sexpr_node(node, "domain/image/hvm/kernel");
         if (tmp == NULL) {
             virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                         "domain information incomplete, missing kernel");
+                         _("domain information incomplete, missing kernel"));
             return(-1);
 	}
         virBufferVSprintf(buf, "    <loader>%s</loader>\n", tmp);
@@ -1430,7 +1430,7 @@
         tmp = sexpr_node(node, "domain/image/linux/kernel");
         if (tmp == NULL) {
             virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                         "domain information incomplete, missing kernel");
+                         _("domain information incomplete, missing kernel"));
             return(-1);
 	}
         virBufferVSprintf(buf, "    <kernel>%s</kernel>\n", tmp);
@@ -1484,11 +1484,11 @@
 
     domid = sexpr_int(root, "domain/domid");
     virBufferVSprintf(&buf, "<domain type='xen' id='%d'>\n", domid);
-                      
+
     tmp = sexpr_node(root, "domain/name");
     if (tmp == NULL) {
         virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                     "domain information incomplete, missing name");
+                     _("domain information incomplete, missing name"));
         goto error;
     }
     virBufferVSprintf(&buf, "  <name>%s</name>\n", tmp);
@@ -1540,7 +1540,7 @@
             virBufferAdd(&buf, "    <pae/>\n", 11);
         virBufferAdd(&buf, "  </features>\n", 14);
     }
-       
+
     virBufferAdd(&buf, "  <devices>\n", 12);
 
     /* in case of HVM we have devices emulation */
@@ -1561,9 +1561,10 @@
 
                 if (dst == NULL) {
                     virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                                 "domain information incomplete, vbd has no dev");
+                                 _("domain information incomplete, vbd has no dev"));
                     goto error;
                 }
+
                 if (!strncmp(dst, "ioemu:", 6)) 
                     dst += 6;
                 /* New style disk config from Xen >= 3.0.3 */
@@ -1597,9 +1598,10 @@
 
                 if (dst == NULL) {
                     virXendError(NULL, VIR_ERR_INTERNAL_ERROR,
-                                 "domain information incomplete, vbd has no dev");
+                                 _("domain information incomplete, vbd has no dev"));
                     goto error;
                 }
+
                 if (!strncmp(dst, "ioemu:", 6)) 
                     dst += 6;
                 /* New style cdrom config from Xen >= 3.0.3 */
@@ -1859,7 +1861,7 @@
 
     ret = virGetDomain(conn, name, (const unsigned char *) &uuid[0]);
     if (ret == NULL) {
-        virXendError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virXendError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	return(NULL);
     }
     ret->handle = sexpr_int(root, "domain/domid");
@@ -1870,7 +1872,7 @@
 
 error:
     virXendError(conn, VIR_ERR_INTERNAL_ERROR,
-                 "failed to parse Xend domain information");
+                 _("failed to parse Xend domain information"));
     if (ret != NULL)
         virFreeDomain(conn, ret);
     return(NULL);
@@ -1949,7 +1951,7 @@
 	    ret = xenDaemonOpen_unix(conn, uri->path);
 	    if (ret < 0)
 	        goto failed;
-		
+
 	    ret = xenDaemonGetVersion(conn, &version);
 	    if (ret < 0)
 		goto failed;
@@ -2558,7 +2560,7 @@
 
     ret = virGetDomain(conn, name, uuid);
     if (ret == NULL) {
-        virXendError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virXendError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
         goto error;
     }
     ret->handle = id;
@@ -2766,7 +2768,7 @@
 
     ret = virGetDomain(conn, name, uuid);
     if (ret == NULL) {
-        virXendError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+      virXendError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
         goto error;
     }
     ret->handle = id;
@@ -2829,13 +2831,13 @@
     ret = xenDaemonDomainCreateLinux(conn, sexpr);
     free(sexpr);
     if (ret != 0) {
-        fprintf(stderr, "Failed to create domain %s\n", name);
+        fprintf(stderr, _("Failed to create domain %s\n"), name);
         goto error;
     }
 
     ret = xend_wait_for_devices(conn, name);
     if (ret != 0) {
-        fprintf(stderr, "Failed to get devices for domain %s\n", name);
+        fprintf(stderr, _("Failed to get devices for domain %s\n"), name);
         goto error;
     }
 
@@ -2846,7 +2848,7 @@
 
     ret = xenDaemonDomainResume(dom);
     if (ret != 0) {
-        fprintf(stderr, "Failed to resume new domain %s\n", name);
+        fprintf(stderr, _("Failed to resume new domain %s\n"), name);
         xenDaemonDomainDestroy(dom);
         goto error;
     }
Index: src/xml.c
===================================================================
RCS file: /data/cvs/libvirt/src/xml.c,v
retrieving revision 1.40
diff -u -r1.40 xml.c
--- src/xml.c	14 Sep 2006 15:34:50 -0000	1.40
+++ src/xml.c	20 Sep 2006 19:55:59 -0000
@@ -61,7 +61,7 @@
 
     newbuf = (char *) realloc(buf->content, size);
     if (newbuf == NULL) {
-        virXMLError(VIR_ERR_NO_MEMORY, "growing buffer", size);
+        virXMLError(VIR_ERR_NO_MEMORY, _("growing buffer"), size);
         return (-1);
     }
     buf->content = newbuf;
@@ -113,11 +113,11 @@
     virBufferPtr buf;
 
     if (!(buf = malloc(sizeof(*buf)))) {
-        virXMLError(VIR_ERR_NO_MEMORY, "allocate new buffer", sizeof(*buf));
+        virXMLError(VIR_ERR_NO_MEMORY, _("allocate new buffer"), sizeof(*buf));
         return NULL;
     }
     if (size && (buf->content = malloc(size))==NULL) {
-        virXMLError(VIR_ERR_NO_MEMORY, "allocate buffer content", size);
+        virXMLError(VIR_ERR_NO_MEMORY, _("allocate buffer content"), size);
         free(buf);
         return NULL;
     }
Index: src/xmlrpc.c
===================================================================
RCS file: /data/cvs/libvirt/src/xmlrpc.c,v
retrieving revision 1.4
diff -u -r1.4 xmlrpc.c
--- src/xmlrpc.c	10 May 2006 14:48:20 -0000	1.4
+++ src/xmlrpc.c	20 Sep 2006 19:55:59 -0000
@@ -60,8 +60,8 @@
 	if (node->type == XML_TEXT_NODE) {
 	    char *x = strdup((const char *)node->content);
 	    if (!x)
-		xmlRpcError(VIR_ERR_NO_MEMORY, "copying node content", 
-				strlen((const char *)node->content));
+                xmlRpcError(VIR_ERR_NO_MEMORY, _("copying node content"),
+                            strlen((const char *)node->content));
 	    return x;
 	}
     return NULL;
@@ -154,14 +154,14 @@
 
     if (!ret)
         return NULL;
-    
+
     for (cur = xmlFirstElement(node); cur; cur = xmlNextElement(cur))
 	n_elements += 1;
 
     ret->value.array.elements = malloc(n_elements * sizeof(xmlRpcValue));
     if (!ret->value.array.elements) {
-        xmlRpcError(VIR_ERR_NO_MEMORY, "allocate value array", 
-				n_elements * sizeof(xmlRpcValue));
+        xmlRpcError(VIR_ERR_NO_MEMORY, _("allocate value array"),
+                    n_elements * sizeof(xmlRpcValue));
 	free(ret);
 	return NULL;
     }
@@ -193,7 +193,7 @@
 	} else if (xmlStrEqual(cur->name, BAD_CAST "value")) {
 	    ret->value = xmlRpcValueUnmarshal(cur);
 	} else {
-	    xmlRpcError(VIR_ERR_XML_ERROR, "unexpected dict node", 0);
+            xmlRpcError(VIR_ERR_XML_ERROR, _("unexpected dict node"), 0);
 	    if (ret->name)
 		free(ret->name);
 	    if (ret->value)
@@ -265,7 +265,7 @@
     } else if (xmlStrEqual(node->name, BAD_CAST "nil")) {
 	ret = xmlRpcValueNew(XML_RPC_NIL);
     } else {
-	xmlRpcError(VIR_ERR_XML_ERROR, "unexpected value node", 0);
+        xmlRpcError(VIR_ERR_XML_ERROR, _("unexpected value node"), 0);
     }
 
     return ret;
@@ -426,22 +426,22 @@
 				&contentType,
 				NULL,
 				strlen(request));
-	
+
 	if (cxt == NULL) {
-		xmlRpcError(VIR_ERR_POST_FAILED, "send request", 0);
+                xmlRpcError(VIR_ERR_POST_FAILED, _("send request"), 0);
 		goto error;
 	}
 
 	if (contentType && strcmp(contentType, "text/xml") != 0) {
 		errno = EINVAL;
-		xmlRpcError(VIR_ERR_POST_FAILED, "unexpected mime type", 0);
+		xmlRpcError(VIR_ERR_POST_FAILED, _("unexpected mime type"), 0);
 		goto error;
 	}
 
 	len = xmlNanoHTTPContentLength(cxt);
 	response = malloc(len + 1);
 	if (response == NULL) {
-		xmlRpcError(VIR_ERR_NO_MEMORY, "allocate response", len);
+		xmlRpcError(VIR_ERR_NO_MEMORY, _("allocate response"), len);
 		goto error;
 	}
 	ret = xmlNanoHTTPRead(cxt, response, len);
@@ -449,7 +449,7 @@
 		errno = EINVAL;
 		free(response);
 		response = NULL;
-		xmlRpcError(VIR_ERR_POST_FAILED, "read response", 0);
+		xmlRpcError(VIR_ERR_POST_FAILED, _("read response"), 0);
 	}
 
 	response[len] = 0;
@@ -481,7 +481,7 @@
 	    size += strlen(value->value.array.elements[i]->value.string) + 1;
 
     if (!(ptr = malloc(size))) {
-	xmlRpcError(VIR_ERR_NO_MEMORY, "allocate string array", size);
+	xmlRpcError(VIR_ERR_NO_MEMORY, _("allocate string array"), size);
 	return NULL;
     }
     ret = (char **)ptr;
@@ -511,7 +511,7 @@
     
     *argc = strlen(fmt);
     if (!(argv = malloc(sizeof(*argv) * *argc))) {
-        xmlRpcError(VIR_ERR_NO_MEMORY, "read response", sizeof(*argv) * *argc);
+        xmlRpcError(VIR_ERR_NO_MEMORY, _("read response"), sizeof(*argv) * *argc);
         return NULL;
     }
     i = 0;
@@ -603,7 +603,7 @@
 
     if (xml == NULL) {
 	errno = EINVAL;
-	xmlRpcError(VIR_ERR_XML_ERROR, "parse server response failed", 0);
+	xmlRpcError(VIR_ERR_XML_ERROR, _("parse server response failed"), 0);
 	return -1;
     }
 
@@ -667,7 +667,7 @@
 	ret->uri = strdup(uri);
 	ret->faultMessage = NULL;
     } else
-	xmlRpcError(VIR_ERR_NO_MEMORY, "allocate new context", sizeof(*ret));
+        xmlRpcError(VIR_ERR_NO_MEMORY, _("allocate new context"), sizeof(*ret));
 
     return ret;
 }
Index: src/xs_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.c,v
retrieving revision 1.18
diff -u -r1.18 xs_internal.c
--- src/xs_internal.c	2 Sep 2006 21:23:14 -0000	1.18
+++ src/xs_internal.c	20 Sep 2006 19:55:59 -0000
@@ -315,7 +315,7 @@
     if (conn->xshandle == NULL) {
         if (!(flags & VIR_DRV_OPEN_QUIET))
             virXenStoreError(conn, VIR_ERR_NO_XEN, 
-	                     "failed to connect to Xen Store");
+	                     _("failed to connect to Xen Store"));
         return (-1);
     }
     return (0);
@@ -589,7 +589,7 @@
 
     ret = virGetDomain(conn, name, NULL);
     if (ret == NULL) {
-        virXenStoreError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
+        virXenStoreError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	if (path != NULL)
 	    free(path);
 	goto done;
Index: tests/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/tests/Makefile.am,v
retrieving revision 1.8
diff -u -r1.8 Makefile.am
--- tests/Makefile.am	12 Sep 2006 01:16:22 -0000	1.8
+++ tests/Makefile.am	20 Sep 2006 19:55:59 -0000
@@ -10,8 +10,8 @@
 	-I$(top_srcdir)/include \
 	-I$(top_srcdir)/src \
 	@LIBXML_CFLAGS@ \
-        -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L
-
+        -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L \
+        -DGETTEXT_PACKAGE=\"$(PACKAGE)\"
 LDADDS = \
 	@STATIC_BINARIES@ \
 	@LIBXML_LIBS@ \
Index: tests/virshdata/dominfo-fc4.txt
===================================================================
RCS file: /data/cvs/libvirt/tests/virshdata/dominfo-fc4.txt,v
retrieving revision 1.1
diff -u -r1.1 dominfo-fc4.txt
--- tests/virshdata/dominfo-fc4.txt	24 Aug 2006 21:46:28 -0000	1.1
+++ tests/virshdata/dominfo-fc4.txt	20 Sep 2006 19:55:59 -0000
@@ -2,7 +2,7 @@
 Name:           fc4
 UUID:           ef861801-45b9-11cb-88e3-afbfe5370493
 OS Type:        linux
-State:          running 
+State:          running
 CPU(s):         1
 Max memory:     131072 kB
 Used memory:    131072 kB
Index: tests/virshdata/domstate-fc4.txt
===================================================================
RCS file: /data/cvs/libvirt/tests/virshdata/domstate-fc4.txt,v
retrieving revision 1.1
diff -u -r1.1 domstate-fc4.txt
--- tests/virshdata/domstate-fc4.txt	24 Aug 2006 21:46:28 -0000	1.1
+++ tests/virshdata/domstate-fc4.txt	20 Sep 2006 19:55:59 -0000
@@ -1,2 +1,2 @@
-running 
+running
 
Index: tests/virshdata/list-custom.txt
===================================================================
RCS file: /data/cvs/libvirt/tests/virshdata/list-custom.txt,v
retrieving revision 1.1
diff -u -r1.1 list-custom.txt
--- tests/virshdata/list-custom.txt	24 Aug 2006 21:46:28 -0000	1.1
+++ tests/virshdata/list-custom.txt	20 Sep 2006 19:55:59 -0000
@@ -1,5 +1,5 @@
  Id Name                 State
 ----------------------------------
-  0 fv0                  running 
-  1 fc4                  running 
+  0 fv0                  running
+  1 fc4                  running
 
Index: tests/virshdata/list-default.txt
===================================================================
RCS file: /data/cvs/libvirt/tests/virshdata/list-default.txt,v
retrieving revision 1.1
diff -u -r1.1 list-default.txt
--- tests/virshdata/list-default.txt	24 Aug 2006 21:46:28 -0000	1.1
+++ tests/virshdata/list-default.txt	20 Sep 2006 19:55:59 -0000
@@ -1,4 +1,4 @@
  Id Name                 State
 ----------------------------------
-  0 Domain-0             running 
+  0 Domain-0             running
 


More information about the libvir-list mailing list