Richard W.M. Jones
2012-Apr-30 18:00 UTC
[Libguestfs] [PATCH 0/4 v1] Remove gettextify, implement OCaml gettext.
Version 1 of the patch, for discussion, but not to be applied. It does work, but needs a lot more testing. This removes all the psychopathic gettextify cruft, and replaces it with a 99 line Makefile.am. A large win, I think. The third patch implements gettext support in the OCaml tools. The fourth patch is just for illustration. It shows the consequent changes to libguestfs.pot and the po files. Rich.
Richard W.M. Jones
2012-Apr-30 18:00 UTC
[Libguestfs] [PATCH 1/4] Remove "convenience header" "gettext.h" and use <libintl.h> instead.
From: "Richard W.M. Jones" <rjones at redhat.com>
gettextify provides a local file called "gettext.h". Remove this and
use <libintl.h> from glibc headers instead.
This change is mostly mechanical: #include <libintl.h> in every C file
which uses any gettext function.
---
align/domains.c | 1 +
df/domains.c | 1 +
df/output.c | 1 +
fish/alloc.c | 1 +
fish/config.c | 1 +
fish/copy.c | 1 +
fish/display.c | 1 +
fish/edit.c | 1 +
fish/events.c | 1 +
fish/fish.c | 1 +
fish/fish.h | 13 ---
fish/glob.c | 1 +
fish/help.c | 1 +
fish/hexedit.c | 1 +
fish/inspect.c | 1 +
fish/keys.c | 1 +
fish/lcd.c | 1 +
fish/man.c | 1 +
fish/more.c | 1 +
fish/options.c | 2 +
fish/options.h | 10 --
fish/prep.c | 1 +
fish/prep_boot.c | 1 +
fish/prep_disk.c | 1 +
fish/prep_fs.c | 1 +
fish/prep_lv.c | 1 +
fish/prep_part.c | 1 +
fish/rc.c | 1 +
fish/reopen.c | 1 +
fish/setenv.c | 1 +
fish/supported.c | 1 +
fish/time.c | 1 +
fuse/guestmount.c | 1 +
fuse/guestmount.h | 8 +-
generator/generator_fish.ml | 4 +
src/gettext.h | 271 -------------------------------------------
src/guestfs-internal.h | 8 +-
test-tool/test-tool.c | 14 +--
38 files changed, 40 insertions(+), 320 deletions(-)
delete mode 100644 src/gettext.h
diff --git a/align/domains.c b/align/domains.c
index 9dd49cc..6b3f28f 100644
--- a/align/domains.c
+++ b/align/domains.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#include <assert.h>
#ifdef HAVE_LIBVIRT
diff --git a/df/domains.c b/df/domains.c
index 3993bbf..43dc47d 100644
--- a/df/domains.c
+++ b/df/domains.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#include <assert.h>
#ifdef HAVE_LIBVIRT
diff --git a/df/output.c b/df/output.c
index d604566..ba513de 100644
--- a/df/output.c
+++ b/df/output.c
@@ -24,6 +24,7 @@
#include <string.h>
#include <inttypes.h>
#include <xvasprintf.h>
+#include <libintl.h>
#include <math.h>
#include <assert.h>
diff --git a/fish/alloc.c b/fish/alloc.c
index b530254..f6e5b8f 100644
--- a/fish/alloc.c
+++ b/fish/alloc.c
@@ -25,6 +25,7 @@
#include <fcntl.h>
#include <inttypes.h>
#include <errno.h>
+#include <libintl.h>
#include "xstrtol.h"
diff --git a/fish/config.c b/fish/config.c
index 6c75969..3e004cc 100644
--- a/fish/config.c
+++ b/fish/config.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#ifdef HAVE_LIBCONFIG
#include <libconfig.h>
diff --git a/fish/copy.c b/fish/copy.c
index 4ff1693..0ea605f 100644
--- a/fish/copy.c
+++ b/fish/copy.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <unistd.h>
#include <limits.h>
+#include <libintl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
diff --git a/fish/display.c b/fish/display.c
index 05933f4..a5889db 100644
--- a/fish/display.c
+++ b/fish/display.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <inttypes.h>
+#include <libintl.h>
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/fish/edit.c b/fish/edit.c
index 517c098..a411180 100644
--- a/fish/edit.c
+++ b/fish/edit.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <inttypes.h>
+#include <libintl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
diff --git a/fish/events.c b/fish/events.c
index 1106372..b98bd58 100644
--- a/fish/events.c
+++ b/fish/events.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
+#include <libintl.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
diff --git a/fish/fish.c b/fish/fish.c
index a83f702..d0688f1 100644
--- a/fish/fish.c
+++ b/fish/fish.c
@@ -30,6 +30,7 @@
#include <sys/wait.h>
#include <locale.h>
#include <langinfo.h>
+#include <libintl.h>
#ifdef HAVE_LIBREADLINE
#include <readline/readline.h>
diff --git a/fish/fish.h b/fish/fish.h
index e77f349..69a7640 100644
--- a/fish/fish.h
+++ b/fish/fish.h
@@ -31,21 +31,8 @@
#define SOCK_CLOEXEC 0
#endif
-#ifdef HAVE_GETTEXT
-#include "gettext.h"
#define _(str) dgettext(PACKAGE, (str))
#define N_(str) dgettext(PACKAGE, (str))
-#else
-#define _(str) str
-#define N_(str) str
-#endif
-
-#if !ENABLE_NLS
-#undef textdomain
-#define textdomain(Domainname) /* empty */
-#undef bindtextdomain
-#define bindtextdomain(Domainname, Dirname) /* empty */
-#endif
#define STREQ(a,b) (strcmp((a),(b)) == 0)
#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
diff --git a/fish/glob.c b/fish/glob.c
index 108eda3..b3cfa57 100644
--- a/fish/glob.c
+++ b/fish/glob.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/help.c b/fish/help.c
index b62739a..c141287 100644
--- a/fish/help.c
+++ b/fish/help.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/hexedit.c b/fish/hexedit.c
index 472aa8f..1057a31 100644
--- a/fish/hexedit.c
+++ b/fish/hexedit.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <inttypes.h>
+#include <libintl.h>
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/fish/inspect.c b/fish/inspect.c
index 3358cd4..64c6607 100644
--- a/fish/inspect.c
+++ b/fish/inspect.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#include "c-ctype.h"
diff --git a/fish/keys.c b/fish/keys.c
index b66db52..80c0501 100644
--- a/fish/keys.c
+++ b/fish/keys.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <termios.h>
#include <string.h>
+#include <libintl.h>
#include "guestfs.h"
diff --git a/fish/lcd.c b/fish/lcd.c
index 69c684e..19c6613 100644
--- a/fish/lcd.c
+++ b/fish/lcd.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/man.c b/fish/man.c
index 7d0318c..a710607 100644
--- a/fish/man.c
+++ b/fish/man.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <signal.h>
#include <string.h>
+#include <libintl.h>
#include <sys/wait.h>
#include "fish.h"
diff --git a/fish/more.c b/fish/more.c
index 2ac2c3b..c5a94d3 100644
--- a/fish/more.c
+++ b/fish/more.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <inttypes.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/options.c b/fish/options.c
index 1a2e8c5..b3ad675 100644
--- a/fish/options.c
+++ b/fish/options.c
@@ -20,6 +20,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <libintl.h>
#include "c-ctype.h"
diff --git a/fish/options.h b/fish/options.h
index f0f5a07..29117f6 100644
--- a/fish/options.h
+++ b/fish/options.h
@@ -19,22 +19,12 @@
#ifndef OPTIONS_H
#define OPTIONS_H
-#ifdef HAVE_GETTEXT
-#include "gettext.h"
#ifndef _
#define _(str) dgettext(PACKAGE, (str))
#endif
#ifndef N_
#define N_(str) dgettext(PACKAGE, (str))
#endif
-#else
-#ifndef _
-#define _(str) str
-#endif
-#ifndef _
-#define N_(str) str
-#endif
-#endif
#ifndef STREQ
#define STREQ(a,b) (strcmp((a),(b)) == 0)
diff --git a/fish/prep.c b/fish/prep.c
index 9863bc9..665a3e9 100644
--- a/fish/prep.c
+++ b/fish/prep.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/prep_boot.c b/fish/prep_boot.c
index 79798cd..75ddcca 100644
--- a/fish/prep_boot.c
+++ b/fish/prep_boot.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/prep_disk.c b/fish/prep_disk.c
index 055b36f..1caee5f 100644
--- a/fish/prep_disk.c
+++ b/fish/prep_disk.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/prep_fs.c b/fish/prep_fs.c
index 8934de4..a0373d9 100644
--- a/fish/prep_fs.c
+++ b/fish/prep_fs.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/prep_lv.c b/fish/prep_lv.c
index ec380d4..f635ff9 100644
--- a/fish/prep_lv.c
+++ b/fish/prep_lv.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/prep_part.c b/fish/prep_part.c
index 27f4b78..fc39014 100644
--- a/fish/prep_part.c
+++ b/fish/prep_part.c
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
#include "prepopts.h"
diff --git a/fish/rc.c b/fish/rc.c
index 8674bdf..14c9d59 100644
--- a/fish/rc.c
+++ b/fish/rc.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+#include <libintl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
diff --git a/fish/reopen.c b/fish/reopen.c
index 585bbd2..3fc9510 100644
--- a/fish/reopen.c
+++ b/fish/reopen.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/setenv.c b/fish/setenv.c
index c2af863..d04b1d3 100644
--- a/fish/setenv.c
+++ b/fish/setenv.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/supported.c b/fish/supported.c
index 7b9e085..1b558bf 100644
--- a/fish/supported.c
+++ b/fish/supported.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include "fish.h"
diff --git a/fish/time.c b/fish/time.c
index 246a580..17d31a7 100644
--- a/fish/time.c
+++ b/fish/time.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <libintl.h>
#include <sys/time.h>
#include "fish.h"
diff --git a/fuse/guestmount.c b/fuse/guestmount.c
index 379346f..2fe56ca 100644
--- a/fuse/guestmount.c
+++ b/fuse/guestmount.c
@@ -29,6 +29,7 @@
#include <getopt.h>
#include <signal.h>
#include <locale.h>
+#include <libintl.h>
/* We're still using some of FUSE to handle command line options. */
#include <fuse.h>
diff --git a/fuse/guestmount.h b/fuse/guestmount.h
index a6249ec..3f54c30 100644
--- a/fuse/guestmount.h
+++ b/fuse/guestmount.h
@@ -25,14 +25,8 @@
#ifndef GUESTMOUNT_H_
#define GUESTMOUNT_H_
-#ifdef HAVE_GETTEXT
-#include "gettext.h"
#define _(str) dgettext(PACKAGE, (str))
-//#define N_(str) dgettext(PACKAGE, (str))
-#else
-#define _(str) str
-//#define N_(str) str
-#endif
+#define N_(str) dgettext(PACKAGE, (str))
#define STREQ(a,b) (strcmp((a),(b)) == 0)
#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
diff --git a/generator/generator_fish.ml b/generator/generator_fish.ml
index c4ab69d..97625cc 100644
--- a/generator/generator_fish.ml
+++ b/generator/generator_fish.ml
@@ -62,6 +62,7 @@ let generate_fish_cmds () pr "#include
<stdlib.h>\n";
pr "#include <string.h>\n";
pr "#include <inttypes.h>\n";
+ pr "#include <libintl.h>\n";
pr "\n";
pr "#include \"c-ctype.h\"\n";
pr "#include \"full-write.h\"\n";
@@ -1000,9 +1001,12 @@ and generate_fish_event_names () generate_header
CStyle GPLv2plus;
pr "\
+#include <config.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libintl.h>
#include \"fish.h\"
diff --git a/src/gettext.h b/src/gettext.h
deleted file mode 100644
index 93f32e5..0000000
--- a/src/gettext.h
+++ /dev/null
@@ -1,271 +0,0 @@
-/* Convenience header for conditional use of GNU <libintl.h>.
- Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- USA. */
-
-#ifndef _LIBGETTEXT_H
-#define _LIBGETTEXT_H 1
-
-/* NLS can be disabled through the configure --disable-nls option. */
-#if ENABLE_NLS
-
-/* Get declarations of GNU message catalog functions. */
-# include <libintl.h>
-
-/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
- the gettext() and ngettext() macros. This is an alternative to calling
- textdomain(), and is useful for libraries. */
-# ifdef DEFAULT_TEXT_DOMAIN
-# undef gettext
-# define gettext(Msgid) \
- dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
-# undef ngettext
-# define ngettext(Msgid1, Msgid2, N) \
- dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
-# endif
-
-#else
-
-/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
- chokes if dcgettext is defined as a macro. So include it now, to make
- later inclusions of <locale.h> a NOP. We don't include
<libintl.h>
- as well because people using "gettext.h" will not include
<libintl.h>,
- and also including <libintl.h> would fail on SunOS 4, whereas
<locale.h>
- is OK. */
-#if defined(__sun)
-# include <locale.h>
-#endif
-
-/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
- <libintl.h>, which chokes if dcgettext is defined as a macro. So
include
- it now, to make later inclusions of <libintl.h> a NOP. */
-#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__
>= 3)
-# include <cstdlib>
-# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
-# include <libintl.h>
-# endif
-#endif
-
-/* Disabled NLS.
- The casts to 'const char *' serve the purpose of producing warnings
- for invalid uses of the value returned from these functions.
- On pre-ANSI systems without 'const', the config.h file is supposed
to
- contain "#define const". */
-# define gettext(Msgid) ((const char *) (Msgid))
-# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
-# define dcgettext(Domainname, Msgid, Category) \
- ((void) (Category), dgettext (Domainname, Msgid))
-# define ngettext(Msgid1, Msgid2, N) \
- ((N) == 1 \
- ? ((void) (Msgid2), (const char *) (Msgid1)) \
- : ((void) (Msgid1), (const char *) (Msgid2)))
-# define dngettext(Domainname, Msgid1, Msgid2, N) \
- ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
-# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
- ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N))
-# define textdomain(Domainname) ((const char *) (Domainname))
-# define bindtextdomain(Domainname, Dirname) \
- ((void) (Domainname), (const char *) (Dirname))
-# define bind_textdomain_codeset(Domainname, Codeset) \
- ((void) (Domainname), (const char *) (Codeset))
-
-#endif
-
-/* A pseudo function call that serves as a marker for the automated
- extraction of messages, but does not call gettext(). The run-time
- translation is done at a different place in the code.
- The argument, String, should be a literal string. Concatenated strings
- and other string expressions won't work.
- The macro's expansion is not parenthesized, so that it is suitable as
- initializer for static 'char[]' or 'const char[]' variables.
*/
-#define gettext_noop(String) String
-
-/* The separator between msgctxt and msgid in a .mo file. */
-#define GETTEXT_CONTEXT_GLUE "\004"
-
-/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
- MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
- short and rarely need to change.
- The letter 'p' stands for 'particular' or 'special'.
*/
-#ifdef DEFAULT_TEXT_DOMAIN
-# define pgettext(Msgctxt, Msgid) \
- pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid,
Msgid, LC_MESSAGES)
-#else
-# define pgettext(Msgctxt, Msgid) \
- pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
-#endif
-#define dpgettext(Domainname, Msgctxt, Msgid) \
- pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid,
LC_MESSAGES)
-#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
- pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid,
Category)
-#ifdef DEFAULT_TEXT_DOMAIN
-# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid,
Msgid, MsgidPlural, N, LC_MESSAGES)
-#else
-# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural,
N, LC_MESSAGES)
-#endif
-#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid,
MsgidPlural, N, LC_MESSAGES)
-#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
- npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid,
MsgidPlural, N, Category)
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-pgettext_aux (const char *domain,
- const char *msg_ctxt_id, const char *msgid,
- int category)
-{
- const char *translation = dcgettext (domain, msg_ctxt_id, category);
- if (translation == msg_ctxt_id)
- return msgid;
- else
- return translation;
-}
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-npgettext_aux (const char *domain,
- const char *msg_ctxt_id, const char *msgid,
- const char *msgid_plural, unsigned long int n,
- int category)
-{
- const char *translation - dcngettext (domain, msg_ctxt_id, msgid_plural,
n, category);
- if (translation == msg_ctxt_id || translation == msgid_plural)
- return (n == 1 ? msgid : msgid_plural);
- else
- return translation;
-}
-
-/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
- can be arbitrary expressions. But for string literals these macros are
- less efficient than those above. */
-
-#include <string.h>
-
-#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
- (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
- /* || __STDC_VERSION__ >= 199901L */ )
-
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
-#include <stdlib.h>
-#endif
-
-#define pgettext_expr(Msgctxt, Msgid) \
- dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
-#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
- dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-dcpgettext_expr (const char *domain,
- const char *msgctxt, const char *msgid,
- int category)
-{
- size_t msgctxt_len = strlen (msgctxt) + 1;
- size_t msgid_len = strlen (msgid) + 1;
- const char *translation;
-#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- char msg_ctxt_id[msgctxt_len + msgid_len];
-#else
- char buf[1024];
- char *msg_ctxt_id - (msgctxt_len + msgid_len <= sizeof (buf)
- ? buf
- : (char *) malloc (msgctxt_len + msgid_len));
- if (msg_ctxt_id != NULL)
-#endif
- {
- memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
- msg_ctxt_id[msgctxt_len - 1] = '\004';
- memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
- translation = dcgettext (domain, msg_ctxt_id, category);
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- if (msg_ctxt_id != buf)
- free (msg_ctxt_id);
-#endif
- if (translation != msg_ctxt_id)
- return translation;
- }
- return msgid;
-}
-
-#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
- dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
-#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
- dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
-
-#ifdef __GNUC__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-dcnpgettext_expr (const char *domain,
- const char *msgctxt, const char *msgid,
- const char *msgid_plural, unsigned long int n,
- int category)
-{
- size_t msgctxt_len = strlen (msgctxt) + 1;
- size_t msgid_len = strlen (msgid) + 1;
- const char *translation;
-#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- char msg_ctxt_id[msgctxt_len + msgid_len];
-#else
- char buf[1024];
- char *msg_ctxt_id - (msgctxt_len + msgid_len <= sizeof (buf)
- ? buf
- : (char *) malloc (msgctxt_len + msgid_len));
- if (msg_ctxt_id != NULL)
-#endif
- {
- memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
- msg_ctxt_id[msgctxt_len - 1] = '\004';
- memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
- translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n,
category);
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- if (msg_ctxt_id != buf)
- free (msg_ctxt_id);
-#endif
- if (!(translation == msg_ctxt_id || translation == msgid_plural))
- return translation;
- }
- return (n == 1 ? msgid : msgid_plural);
-}
-
-#endif /* _LIBGETTEXT_H */
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index a41212d..01a7e6c 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -19,6 +19,8 @@
#ifndef GUESTFS_INTERNAL_H_
#define GUESTFS_INTERNAL_H_
+#include <libintl.h>
+
#include <rpc/types.h>
#include <rpc/xdr.h>
@@ -44,14 +46,8 @@
#define STRCASENEQLEN(a,b,n) (strncasecmp((a),(b),(n)) != 0)
#define STRPREFIX(a,b) (strncmp((a),(b),strlen((b))) == 0)
-#ifdef HAVE_GETTEXT
-#include "gettext.h"
#define _(str) dgettext(PACKAGE, (str))
#define N_(str) dgettext(PACKAGE, (str))
-#else
-#define _(str) str
-#define N_(str) str
-#endif
#ifdef HAVE_SYS_SDT_H
#include <sys/sdt.h>
diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c
index 1c8f6f5..91093d8 100644
--- a/test-tool/test-tool.c
+++ b/test-tool/test-tool.c
@@ -31,24 +31,12 @@
#include <sys/wait.h>
#include <locale.h>
#include <limits.h>
+#include <libintl.h>
#include <guestfs.h>
-#ifdef HAVE_GETTEXT
-#include "gettext.h"
#define _(str) dgettext(PACKAGE, (str))
//#define N_(str) dgettext(PACKAGE, (str))
-#else
-#define _(str) str
-//#define N_(str) str
-#endif
-
-#if !ENABLE_NLS
-#undef textdomain
-#define textdomain(Domainname) /* empty */
-#undef bindtextdomain
-#define bindtextdomain(Domainname, Dirname) /* empty */
-#endif
#define STREQ(a,b) (strcmp((a),(b)) == 0)
//#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
--
1.7.10
From: "Richard W.M. Jones" <rjones at redhat.com>
Replace all the complex nonsense in gettextify with a simple
Makefile.am which does the same ... faster.
---
.gitignore | 13 --
Makefile.am | 5 +-
configure.ac | 24 ++-
m4/.gitignore | 1 -
po/Makefile.am | 87 ++++++++++
po/Makefile.in.in | 444 ------------------------------------------------
po/Makevars | 43 -----
po/POTFILES | 217 +++++++++++++++++++++++
po/POTFILES.in | 217 -----------------------
po/remove-potcdate.sin | 19 ---
10 files changed, 327 insertions(+), 743 deletions(-)
create mode 100644 po/Makefile.am
delete mode 100644 po/Makefile.in.in
delete mode 100644 po/Makevars
create mode 100644 po/POTFILES
delete mode 100644 po/POTFILES.in
delete mode 100644 po/remove-potcdate.sin
diff --git a/.gitignore b/.gitignore
index 757b6f9..d420430 100644
--- a/.gitignore
+++ b/.gitignore
@@ -290,8 +290,6 @@ pod2htm?.tmp
/php/extension/php_guestfs_php.h
/php/extension/run-tests.php
/php/extension/tmp-php.ini
-/po/boldquot.sed
-/po/ChangeLog
/po-docs/*/*.1
/po-docs/*/*.3
/po-docs/*/*.pl
@@ -299,18 +297,7 @@ pod2htm?.tmp
/po-docs/*/*.pod
/po-docs/*/stamp-update-po
/podwrapper.sh
-/po/en at boldquot.header
-/po/en at quot.header
/po/*.gmo
-/po/insert-header.sin
-/po/LINGUAS
-/po/Makevars.template
-/po/POTFILES
-/po/quot.sed
-/po/remove-potcdate.sed
-/po/Rules-quot
-/po/stamp-it
-/po/stamp-po
/python/bindtests.py
/python/examples/guestfs-python.3
/python/examples/stamp-guestfs-python.pod
diff --git a/Makefile.am b/Makefile.am
index b3df5b3..bc0a543 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -212,7 +212,8 @@ dist-hook:
mv AUTHORS-t AUTHORS
cp AUTHORS $(distdir)/AUTHORS
-# Update the list of translatable files in po/POTFILES.in.
+# Update the list of translatable files (po/POTFILES). This has to be
+# in the top-level Makefile.am so that we have access to DIST_SUBDIRS.
all-local:
cd $(srcdir); \
find $(DIST_SUBDIRS) \
@@ -229,7 +230,7 @@ all-local:
grep -v '^po-docs/' | \
grep -v '^images/' | \
LC_ALL=C sort | \
- sed 's,^\./,,' > po/POTFILES.in
+ sed 's,^\./,,' > po/POTFILES
# Make clean.
diff --git a/configure.ac b/configure.ac
index 29d1116..bcd0382 100644
--- a/configure.ac
+++ b/configure.ac
@@ -251,6 +251,23 @@ AC_CHECK_FUNC([register_printf_specifier],[
This means you either have a very old glibc (pre-2.0) or you
are using some other libc where this is not supported.])])])
+dnl GNU gettext tools (optional).
+AC_CHECK_PROG([XGETTEXT],[xgettext],[xgettext],[no])
+AC_CHECK_PROG([MSGCAT],[msgcat],[msgcat],[no])
+AC_CHECK_PROG([MSGFMT],[msgfmt],[msgfmt],[no])
+AC_CHECK_PROG([MSGMERGE],[msgmerge],[msgmerge],[no])
+
+dnl Check they are the GNU gettext tools.
+AC_MSG_CHECKING([msgfmt is GNU tool])
+if $MSGFMT --version >/dev/null 2>&1 && $MSGFMT --version |
grep -q 'GNU gettext'; then
+ msgfmt_is_gnu=yes
+else
+ msgfmt_is_gnu=no
+fi
+AC_MSG_RESULT([$msgfmt_is_gnu])
+AM_CONDITIONAL([HAVE_GNU_GETTEXT],
+ [test "x$XGETTEXT" != "xno" && test
"x$MSGCAT" != "xno" && test "x$MSGFMT" !=
"xno" && test "x$MSGMERGE" != "xno"
&& test "x$msgfmt_is_gnu" != "xno"])
+
dnl Build the daemon?
AC_MSG_CHECKING([if we should build the daemon])
AC_ARG_ENABLE([daemon],
@@ -652,9 +669,6 @@ AS_IF([test "x$with_readline" != xno],
LIBS="$old_LIBS"
])
-dnl For i18n.
-AM_GNU_GETTEXT([external])
-
dnl Check for PCRE (required)
PKG_CHECK_MODULES([PCRE], [libpcre])
@@ -1216,7 +1230,7 @@ AC_CONFIG_FILES([Makefile
po-docs/Makefile
po-docs/ja/Makefile
po-docs/uk/Makefile
- po/Makefile.in
+ po/Makefile
python/Makefile
python/examples/Makefile
rescue/Makefile
@@ -1281,6 +1295,8 @@ echo -n "gobject bindings .................... "
if test "x$HAVE_GOBJECT_TRUE" = "x"; then echo
"yes"; else echo "no"; fi
echo -n "gobject introspection ............... "
if test "x$HAVE_INTROSPECTION_TRUE" = "x"; then echo
"yes"; else echo "no"; fi
+echo -n "GNU gettext for i18n ................ "
+if test "x$HAVE_GNU_GETTEXT_TRUE" = "x"; then echo
"yes"; else echo "no"; fi
echo
echo "If any optional component is configured 'no' when you
expected 'yes'"
echo "then you should check the preceding messages."
diff --git a/m4/.gitignore b/m4/.gitignore
index d03bc28..fdaf3b5 100644
--- a/m4/.gitignore
+++ b/m4/.gitignore
@@ -71,7 +71,6 @@
/getlogin_r.m4
/getopt.m4
/getpagesize.m4
-/gettext.m4
/gettime.m4
/gettimeofday.m4
/getugroups.m4
diff --git a/po/Makefile.am b/po/Makefile.am
new file mode 100644
index 0000000..c6f1acd
--- /dev/null
+++ b/po/Makefile.am
@@ -0,0 +1,87 @@
+# libguestfs
+# Copyright (C) 2009-2012 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+include $(top_srcdir)/subdir-rules.mk
+
+DOMAIN = $(PACKAGE_NAME)
+COPYRIGHT_HOLDER = Red Hat Inc.
+MSGID_BUGS_ADDRESS =
https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools
+
+# Languages.
+# Don't use LINGUAS (uppercase) as Gentoo defines it (RHBZ#804464).
+linguas := en_GB es gu hi kn ml mr nl or pa pl ta te uk
+
+POTFILES := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES)
+POFILES := $(linguas:%=%.po)
+GMOFILES := $(linguas:%=%.gmo)
+
+EXTRA_DIST = \
+ POTFILES \
+ $(DOMAIN).pot \
+ $(POFILES) \
+ $(GMOFILES)
+
+if HAVE_GNU_GETTEXT
+
+dist-hook:
+ $(MAKE) update-po
+ cp *.po *.gmo $(distdir)/
+
+update-po:
+ $(MAKE) $(DOMAIN).pot
+ $(MAKE) $(POFILES)
+ $(MAKE) update-gmo
+
+update-gmo: Makefile $(GMOFILES)
+
+$(DOMAIN).pot: Makefile $(POTFILES)
+ rm -f $@ $@-t
+ $(XGETTEXT) \
+ -o $@-t \
+ --default-domain=$(DOMAIN) \
+ --add-comments=TRANSLATORS: \
+ --keyword=_ --keyword=N_ --keyword=__ --keyword=__x \
+ --flag=error:3:c-format \
+ --flag=error_at_line:5:c-format \
+ --flag=asprintf:2:c-format \
+ --flag=vasprintf:2:c-format \
+ --flag=xasprintf:1:c-format \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$(PACKAGE_NAME)" \
+ --package-version="$(PACKAGE_VERSION)" \
+ --msgid-bugs-address="$(MSGID_BUGS_ADDRESS)" \
+ --directory=$(top_srcdir) \
+ --files-from=$(abs_srcdir)/POTFILES
+ mv $@-t $@
+
+%.po: $(DOMAIN).pot
+ $(MSGMERGE) -N --update $@ $(DOMAIN).pot
+
+.po.gmo:
+ rm -f $@ $@-t
+ $(MSGFMT) -c -o $@-t $<
+ mv $@-t $@
+
+.PRECIOUS: $(DOMAIN).pot $(POFILES)
+SUFFIXES = .po .gmo
+
+else
+
+# If no GNU gettext, 'make update-po' is a dummy rule.
+update-po:
+
+endif
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
deleted file mode 100644
index 406c2f4..0000000
--- a/po/Makefile.in.in
+++ /dev/null
@@ -1,444 +0,0 @@
-# Makefile for PO directory in any package using GNU gettext.
-# Copyright (C) 1995-1997, 2000-2007, 2009-2012 by Ulrich Drepper <drepper
at gnu.ai.mit.edu>
-#
-# This file can be copied and used freely without restrictions. It can
-# be used in projects which are not available under the GNU General Public
-# License but which still want to provide support for the GNU gettext
-# functionality.
-# Please note that the actual code of GNU gettext is covered by the GNU
-# General Public License and is *not* in the public domain.
-#
-# Origin: gettext-0.18
-GETTEXT_MACRO_VERSION = 0.18
-
-PACKAGE = @PACKAGE@
-VERSION = @VERSION@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-
-SHELL = /bin/sh
- at SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-datarootdir = @datarootdir@
-datadir = @datadir@
-localedir = @localedir@
-gettextsrcdir = $(datadir)/gettext/po
-
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-
-# We use $(mkdir_p).
-# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p
--" or as
-# "$(mkinstalldirs)" or as "$(install_sh) -d". For these
automake versions,
-# @install_sh@ does not start with $(SHELL), so we add it.
-# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is
defined
-# either as "/path/to/mkdir -p" or ".../install-sh -c -d".
For these automake
-# versions, $(mkinstalldirs) and $(install_sh) are unused.
-mkinstalldirs = $(SHELL) @install_sh@ -d
-install_sh = $(SHELL) @install_sh@
-MKDIR_P = @MKDIR_P@
-mkdir_p = @mkdir_p@
-
-GMSGFMT_ = @GMSGFMT@
-GMSGFMT_no = @GMSGFMT@
-GMSGFMT_yes = @GMSGFMT_015@
-GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
-MSGFMT_ = @MSGFMT@
-MSGFMT_no = @MSGFMT@
-MSGFMT_yes = @MSGFMT_015@
-MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
-XGETTEXT_ = @XGETTEXT@
-XGETTEXT_no = @XGETTEXT@
-XGETTEXT_yes = @XGETTEXT_015@
-XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
-MSGMERGE = msgmerge
-MSGMERGE_UPDATE = @MSGMERGE@ --update
-MSGINIT = msginit
-MSGCONV = msgconv
-MSGFILTER = msgfilter
-
-POFILES = @POFILES@
-GMOFILES = @GMOFILES@
-UPDATEPOFILES = @UPDATEPOFILES@
-DUMMYPOFILES = @DUMMYPOFILES@
-DISTFILES.common = Makefile.in.in remove-potcdate.sin \
-$(DISTFILES.common.extra1) $(DISTFILES.common.extra2)
$(DISTFILES.common.extra3)
-DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
-$(POFILES) $(GMOFILES) \
-$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
-
-POTFILES = \
-
-CATALOGS = @CATALOGS@
-
-# Makevars gets inserted here. (Don't remove this line!)
-
-.SUFFIXES:
-.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
-
-.po.mo:
- @echo "$(MSGFMT) -c -o $@ $<"; \
- $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
-
-.po.gmo:
- @lang=`echo $* | sed -e 's,.*/,,'`; \
- test "$(srcdir)" = . && cdcmd="" || cdcmd="cd
$(srcdir) && "; \
- echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics
--verbose -o $${lang}.gmo $${lang}.po"; \
- cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c
--statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv
t-$${lang}.gmo $${lang}.gmo
-
-.sin.sed:
- sed -e '/^#/d' $< > t-$@
- mv t-$@ $@
-
-
-all: check-macro-version all- at USE_NLS@
-
-all-yes: stamp-po
-all-no:
-
-# Ensure that the gettext macros and this Makefile.in.in are in sync.
-check-macro-version:
- @test "$(GETTEXT_MACRO_VERSION)" =
"@GETTEXT_MACRO_VERSION@" \
- || { echo "*** error: gettext infrastructure mismatch: using a
Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf
macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
- exit 1; \
- }
-
-# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
-# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
-# we don't want to bother translators with empty POT files). We assume that
-# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
-# In this case, stamp-po is a nop (i.e. a phony target).
-
-# stamp-po is a timestamp denoting the last time at which the CATALOGS have
-# been loosely updated. Its purpose is that when a developer or translator
-# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
-# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but
subsequent
-# invocations of "make" will do nothing. This timestamp would not be
necessary
-# if updating the $(CATALOGS) would always touch them; however, the rule for
-# $(POFILES) has been designed to not touch files that don't need to be
-# changed.
-stamp-po: $(srcdir)/$(DOMAIN).pot
- test ! -f $(srcdir)/$(DOMAIN).pot || \
- test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
- @test ! -f $(srcdir)/$(DOMAIN).pot || { \
- echo "touch stamp-po" && \
- echo timestamp > stamp-poT && \
- mv stamp-poT stamp-po; \
- }
-
-# Note: Target 'all' must not depend on target
'$(DOMAIN).pot-update',
-# otherwise packages like GCC can not be built if only parts of the source
-# have been downloaded.
-
-# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
-# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
-$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
- if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep
-v 'libtool:' >/dev/null; then \
- package_gnu='GNU '; \
- else \
- package_gnu=''; \
- fi; \
- if test -n '$(MSGID_BUGS_ADDRESS)' || test
'$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
- msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
- else \
- msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
- fi; \
- case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
- '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 |
0.16.[0-1]*) \
- $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
- --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@
\
- --files-from=$(srcdir)/POTFILES.in \
- --copyright-holder='$(COPYRIGHT_HOLDER)' \
- --msgid-bugs-address="$$msgid_bugs_address" \
- ;; \
- *) \
- $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
- --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@
\
- --files-from=$(srcdir)/POTFILES.in \
- --copyright-holder='$(COPYRIGHT_HOLDER)' \
- --package-name="$${package_gnu}@PACKAGE@" \
- --package-version='@VERSION@' \
- --msgid-bugs-address="$$msgid_bugs_address" \
- ;; \
- esac
- test ! -f $(DOMAIN).po || { \
- if test -f $(srcdir)/$(DOMAIN).pot; then \
- sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po
&& \
- sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po &&
\
- if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
- rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
- else \
- rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
- mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
- fi; \
- else \
- mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
- fi; \
- }
-
-# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
-# every "make" invocation, only create it when it is missing.
-# Only "make $(DOMAIN).pot-update" or "make dist" will
force an update.
-$(srcdir)/$(DOMAIN).pot:
- $(MAKE) $(DOMAIN).pot-update
-
-# This target rebuilds a PO file if $(DOMAIN).pot has changed.
-# Note that a PO file is not touched if it doesn't need to be changed.
-$(POFILES): $(srcdir)/$(DOMAIN).pot
- @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
- if test -f "$(srcdir)/$${lang}.po"; then \
- test "$(srcdir)" = . && cdcmd="" ||
cdcmd="cd $(srcdir) && "; \
- echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang}
$${lang}.po $(DOMAIN).pot"; \
- cd $(srcdir) \
- && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e
's,^[^0-9]*,,'` in \
- '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
- $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po
$(DOMAIN).pot;; \
- *) \
- $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang}
$${lang}.po $(DOMAIN).pot;; \
- esac; \
- }; \
- else \
- $(MAKE) $${lang}.po-create; \
- fi
-
-
-install: install-exec install-data
-install-exec:
-install-data: install-data- at USE_NLS@
- if test "$(PACKAGE)" = "gettext-tools"; then \
- $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
- for file in $(DISTFILES.common) Makevars.template; do \
- $(INSTALL_DATA) $(srcdir)/$$file \
- $(DESTDIR)$(gettextsrcdir)/$$file; \
- done; \
- for file in Makevars; do \
- rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
- done; \
- else \
- : ; \
- fi
-install-data-no: all
-install-data-yes: all
- @catalogs='$(CATALOGS)'; \
- for cat in $$catalogs; do \
- cat=`basename $$cat`; \
- lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
- dir=$(localedir)/$$lang/LC_MESSAGES; \
- $(mkdir_p) $(DESTDIR)$$dir; \
- if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
- $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
- echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
- for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
- if test -n "$$lc"; then \
- if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc
2>/dev/null) | grep ' -> ' >/dev/null; then \
- link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d
$$lc | sed -e 's/^.* -> //'`; \
- mv $(DESTDIR)$(localedir)/$$lang/$$lc
$(DESTDIR)$(localedir)/$$lang/$$lc.old; \
- mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
- (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
- for file in *; do \
- if test -f $$file; then \
- ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file;
\
- fi; \
- done); \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
- else \
- if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
- :; \
- else \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
- mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
- fi; \
- fi; \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
- ln -s ../LC_MESSAGES/$(DOMAIN).mo
$(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
- ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo
$(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
- cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo
$(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
- echo "installing $$realcat link as
$(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
- fi; \
- done; \
- done
-
-install-strip: install
-
-installdirs: installdirs-exec installdirs-data
-installdirs-exec:
-installdirs-data: installdirs-data- at USE_NLS@
- if test "$(PACKAGE)" = "gettext-tools"; then \
- $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
- else \
- : ; \
- fi
-installdirs-data-no:
-installdirs-data-yes:
- @catalogs='$(CATALOGS)'; \
- for cat in $$catalogs; do \
- cat=`basename $$cat`; \
- lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
- dir=$(localedir)/$$lang/LC_MESSAGES; \
- $(mkdir_p) $(DESTDIR)$$dir; \
- for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
- if test -n "$$lc"; then \
- if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc
2>/dev/null) | grep ' -> ' >/dev/null; then \
- link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d
$$lc | sed -e 's/^.* -> //'`; \
- mv $(DESTDIR)$(localedir)/$$lang/$$lc
$(DESTDIR)$(localedir)/$$lang/$$lc.old; \
- mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
- (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
- for file in *; do \
- if test -f $$file; then \
- ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file;
\
- fi; \
- done); \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
- else \
- if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
- :; \
- else \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
- mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
- fi; \
- fi; \
- fi; \
- done; \
- done
-
-# Define this as empty until I found a useful application.
-installcheck:
-
-uninstall: uninstall-exec uninstall-data
-uninstall-exec:
-uninstall-data: uninstall-data- at USE_NLS@
- if test "$(PACKAGE)" = "gettext-tools"; then \
- for file in $(DISTFILES.common) Makevars.template; do \
- rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
- done; \
- else \
- : ; \
- fi
-uninstall-data-no:
-uninstall-data-yes:
- catalogs='$(CATALOGS)'; \
- for cat in $$catalogs; do \
- cat=`basename $$cat`; \
- lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
- for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
- rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
- done; \
- done
-
-check: all
-
-info dvi ps pdf html tags TAGS ctags CTAGS ID:
-
-mostlyclean:
- rm -f remove-potcdate.sed
- rm -f stamp-poT
- rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
- rm -fr *.o
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile Makefile.in POTFILES *.mo
-
-maintainer-clean: distclean
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
- rm -f stamp-po $(GMOFILES)
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-dist distdir:
- $(MAKE) update-po
- @$(MAKE) dist2
-# This is a separate target because 'update-po' must be executed
before.
-dist2: stamp-po $(DISTFILES)
- dists="$(DISTFILES)"; \
- if test "$(PACKAGE)" = "gettext-tools"; then \
- dists="$$dists Makevars.template"; \
- fi; \
- if test -f $(srcdir)/$(DOMAIN).pot; then \
- dists="$$dists $(DOMAIN).pot stamp-po"; \
- fi; \
- if test -f $(srcdir)/ChangeLog; then \
- dists="$$dists ChangeLog"; \
- fi; \
- for i in 0 1 2 3 4 5 6 7 8 9; do \
- if test -f $(srcdir)/ChangeLog.$$i; then \
- dists="$$dists ChangeLog.$$i"; \
- fi; \
- done; \
- if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
- for file in $$dists; do \
- if test -f $$file; then \
- cp -p $$file $(distdir) || exit 1; \
- else \
- cp -p $(srcdir)/$$file $(distdir) || exit 1; \
- fi; \
- done
-
-update-po: Makefile
- $(MAKE) $(DOMAIN).pot-update
- test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
- $(MAKE) update-gmo
-
-# General rule for creating PO files.
-
-.nop.po-create:
- @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
- echo "File $$lang.po does not exist. If you are a translator, you can
create it through 'msginit'." 1>&2; \
- exit 1
-
-# General rule for updating PO files.
-
-.nop.po-update:
- @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
- if test "$(PACKAGE)" = "gettext-tools"; then
PATH=`pwd`/../src:$$PATH; fi; \
- tmpdir=`pwd`; \
- echo "$$lang:"; \
- test "$(srcdir)" = . && cdcmd="" || cdcmd="cd
$(srcdir) && "; \
- echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po
$(DOMAIN).pot -o $$lang.new.po"; \
- cd $(srcdir); \
- if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
\
- '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
- $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po
$(DOMAIN).pot;; \
- *) \
- $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o
$$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
- esac; \
- }; then \
- if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
- rm -f $$tmpdir/$$lang.new.po; \
- else \
- if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
- :; \
- else \
- echo "msgmerge for $$lang.po failed: cannot move
$$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
- exit 1; \
- fi; \
- fi; \
- else \
- echo "msgmerge for $$lang.po failed!" 1>&2; \
- rm -f $$tmpdir/$$lang.new.po; \
- fi
-
-$(DUMMYPOFILES):
-
-update-gmo: Makefile $(GMOFILES)
- @:
-
-# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
-# because execution permission bits may not work on the current file system.
-# Use @SHELL@, which is the shell determined by autoconf for the use by its
-# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
-Makefile: Makefile.in.in Makevars $(top_builddir)/config.status
@POMAKEFILEDEPS@
- cd $(top_builddir) \
- && @SHELL@ ./config.status $(subdir)/$@.in po-directories
-
-force:
-
-# Tell versions [3.59,3.63) of GNU make not to export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
deleted file mode 100644
index f2c8d37..0000000
--- a/po/Makevars
+++ /dev/null
@@ -1,43 +0,0 @@
-# Makefile variables for PO directory in any package using GNU gettext.
-
-# Usually the message domain is the same as the package name.
-DOMAIN = $(PACKAGE)
-
-# These two variables depend on the location of this directory.
-subdir = po
-top_builddir = ..
-
-# These options get passed to xgettext.
-# --keyword=__ etc are for Perl code using perl-libintl.
-XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --keyword=__ --keyword=__x \
- $${end_of_xgettext_options+}
-
-# This is the copyright holder that gets inserted into the header of the
-# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
-# package. (Note that the msgstr strings, extracted from the package's
-# sources, belong to the copyright holder of the package.) Translators are
-# expected to transfer the copyright for their translations to this person
-# or entity, or to disclaim their copyright. The empty string stands for
-# the public domain; in this case the translators are expected to disclaim
-# their copyright.
-COPYRIGHT_HOLDER = Red Hat Inc.
-
-# This is the email address or URL to which the translators shall report
-# bugs in the untranslated strings:
-# - Strings which are not entire sentences, see the maintainer guidelines
-# in the GNU gettext documentation, section 'Preparing Strings'.
-# - Strings which use unclear terms or require additional context to be
-# understood.
-# - Strings which make invalid assumptions about notation of date, time or
-# money.
-# - Pluralisation problems.
-# - Incorrect English spelling.
-# - Incorrect formatting.
-# It can be your email address, or a mailing list address where translators
-# can write to without being subscribed, or the URL of a web page through
-# which the translators can contact you.
-MSGID_BUGS_ADDRESS =
https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools
-
-# This is the list of locale categories, beyond LC_MESSAGES, for which the
-# message catalogs shall be used. It is usually empty.
-EXTRA_LOCALE_CATEGORIES diff --git a/po/POTFILES b/po/POTFILES
new file mode 100644
index 0000000..2b4b586
--- /dev/null
+++ b/po/POTFILES
@@ -0,0 +1,217 @@
+align/domains.c
+align/scan.c
+cat/virt-cat.c
+cat/virt-filesystems.c
+cat/virt-ls.c
+daemon/9p.c
+daemon/augeas.c
+daemon/available.c
+daemon/base64.c
+daemon/blkid.c
+daemon/blockdev.c
+daemon/btrfs.c
+daemon/checksum.c
+daemon/cmp.c
+daemon/command.c
+daemon/compress.c
+daemon/copy.c
+daemon/cpmv.c
+daemon/dd.c
+daemon/debug.c
+daemon/devsparts.c
+daemon/df.c
+daemon/dir.c
+daemon/dmesg.c
+daemon/dropcaches.c
+daemon/du.c
+daemon/echo_daemon.c
+daemon/errnostring.c
+daemon/errnostring_gperf.c
+daemon/ext2.c
+daemon/fallocate.c
+daemon/file.c
+daemon/fill.c
+daemon/find.c
+daemon/findfs.c
+daemon/fsck.c
+daemon/glob.c
+daemon/grep.c
+daemon/grub.c
+daemon/guestfsd.c
+daemon/headtail.c
+daemon/hexdump.c
+daemon/htonl.c
+daemon/initrd.c
+daemon/inotify.c
+daemon/internal.c
+daemon/is.c
+daemon/isoinfo.c
+daemon/labels.c
+daemon/link.c
+daemon/ls.c
+daemon/luks.c
+daemon/lvm-filter.c
+daemon/lvm.c
+daemon/md.c
+daemon/mkfs.c
+daemon/mknod.c
+daemon/modprobe.c
+daemon/mount.c
+daemon/names.c
+daemon/ntfs.c
+daemon/ntfsclone.c
+daemon/optgroups.c
+daemon/parted.c
+daemon/pingdaemon.c
+daemon/proto.c
+daemon/readdir.c
+daemon/realpath.c
+daemon/scrub.c
+daemon/selinux.c
+daemon/sfdisk.c
+daemon/sleep.c
+daemon/stat.c
+daemon/statvfs.c
+daemon/strings.c
+daemon/stubs.c
+daemon/swap.c
+daemon/sync.c
+daemon/tar.c
+daemon/truncate.c
+daemon/umask.c
+daemon/upload.c
+daemon/utimens.c
+daemon/wc.c
+daemon/xattr.c
+daemon/zero.c
+daemon/zerofree.c
+df/df.c
+df/domains.c
+df/main.c
+df/output.c
+edit/virt-edit.c
+erlang/erl-guestfs-proto.c
+erlang/erl-guestfs.c
+fish/alloc.c
+fish/cmds.c
+fish/cmds_gperf.c
+fish/completion.c
+fish/config.c
+fish/copy.c
+fish/destpaths.c
+fish/display.c
+fish/echo.c
+fish/edit.c
+fish/event-names.c
+fish/events.c
+fish/fish.c
+fish/glob.c
+fish/help.c
+fish/hexedit.c
+fish/inspect.c
+fish/keys.c
+fish/lcd.c
+fish/man.c
+fish/more.c
+fish/options.c
+fish/prep.c
+fish/prep_boot.c
+fish/prep_disk.c
+fish/prep_fs.c
+fish/prep_lv.c
+fish/prep_part.c
+fish/prepopts.c
+fish/progress.c
+fish/rc.c
+fish/reopen.c
+fish/setenv.c
+fish/supported.c
+fish/tilde.c
+fish/time.c
+fish/virt.c
+format/format.c
+fuse/guestmount.c
+gobject/src/optargs-add_domain.c
+gobject/src/optargs-add_drive_opts.c
+gobject/src/optargs-btrfs_filesystem_resize.c
+gobject/src/optargs-compress_device_out.c
+gobject/src/optargs-compress_out.c
+gobject/src/optargs-copy_device_to_device.c
+gobject/src/optargs-copy_device_to_file.c
+gobject/src/optargs-copy_file_to_device.c
+gobject/src/optargs-copy_file_to_file.c
+gobject/src/optargs-e2fsck.c
+gobject/src/optargs-inspect_get_icon.c
+gobject/src/optargs-md_create.c
+gobject/src/optargs-mkfs_btrfs.c
+gobject/src/optargs-mkfs_opts.c
+gobject/src/optargs-mount_9p.c
+gobject/src/optargs-mount_local.c
+gobject/src/optargs-ntfsclone_out.c
+gobject/src/optargs-ntfsfix.c
+gobject/src/optargs-ntfsresize_opts.c
+gobject/src/optargs-set_e2attrs.c
+gobject/src/optargs-test0.c
+gobject/src/optargs-tune2fs.c
+gobject/src/optargs-umount_local.c
+gobject/src/session.c
+gobject/src/struct-application.c
+gobject/src/struct-btrfssubvolume.c
+gobject/src/struct-dirent.c
+gobject/src/struct-inotify_event.c
+gobject/src/struct-int_bool.c
+gobject/src/struct-isoinfo.c
+gobject/src/struct-lvm_lv.c
+gobject/src/struct-lvm_pv.c
+gobject/src/struct-lvm_vg.c
+gobject/src/struct-mdstat.c
+gobject/src/struct-partition.c
+gobject/src/struct-stat.c
+gobject/src/struct-statvfs.c
+gobject/src/struct-version.c
+gobject/src/struct-xattr.c
+gobject/src/tristate.c
+inspector/virt-inspector.c
+java/com_redhat_et_libguestfs_GuestFS.c
+ocaml/guestfs_c.c
+ocaml/guestfs_c_actions.c
+ocaml/t/exit.c
+perl/Guestfs.c
+perl/bindtests.pl
+perl/lib/Sys/Guestfs.pm
+perl/lib/Sys/Guestfs/Lib.pm
+php/extension/guestfs_php.c
+python/guestfs-py-byhand.c
+python/guestfs-py.c
+rescue/virt-rescue.c
+resize/progress_c.c
+ruby/ext/guestfs/_guestfs.c
+sparsify/progress_c.c
+src/actions.c
+src/appliance.c
+src/bindtests.c
+src/dbdump.c
+src/errnostring.c
+src/errnostring_gperf.c
+src/events.c
+src/filearch.c
+src/fuse.c
+src/guestfs.c
+src/inspect.c
+src/inspect_apps.c
+src/inspect_fs.c
+src/inspect_fs_cd.c
+src/inspect_fs_unix.c
+src/inspect_fs_windows.c
+src/inspect_icon.c
+src/launch.c
+src/listfs.c
+src/match.c
+src/proto.c
+src/virt.c
+test-tool/test-tool.c
+tools/virt-list-filesystems.pl
+tools/virt-list-partitions.pl
+tools/virt-make-fs.pl
+tools/virt-tar.pl
+tools/virt-win-reg.pl
diff --git a/po/POTFILES.in b/po/POTFILES.in
deleted file mode 100644
index 2b4b586..0000000
--- a/po/POTFILES.in
+++ /dev/null
@@ -1,217 +0,0 @@
-align/domains.c
-align/scan.c
-cat/virt-cat.c
-cat/virt-filesystems.c
-cat/virt-ls.c
-daemon/9p.c
-daemon/augeas.c
-daemon/available.c
-daemon/base64.c
-daemon/blkid.c
-daemon/blockdev.c
-daemon/btrfs.c
-daemon/checksum.c
-daemon/cmp.c
-daemon/command.c
-daemon/compress.c
-daemon/copy.c
-daemon/cpmv.c
-daemon/dd.c
-daemon/debug.c
-daemon/devsparts.c
-daemon/df.c
-daemon/dir.c
-daemon/dmesg.c
-daemon/dropcaches.c
-daemon/du.c
-daemon/echo_daemon.c
-daemon/errnostring.c
-daemon/errnostring_gperf.c
-daemon/ext2.c
-daemon/fallocate.c
-daemon/file.c
-daemon/fill.c
-daemon/find.c
-daemon/findfs.c
-daemon/fsck.c
-daemon/glob.c
-daemon/grep.c
-daemon/grub.c
-daemon/guestfsd.c
-daemon/headtail.c
-daemon/hexdump.c
-daemon/htonl.c
-daemon/initrd.c
-daemon/inotify.c
-daemon/internal.c
-daemon/is.c
-daemon/isoinfo.c
-daemon/labels.c
-daemon/link.c
-daemon/ls.c
-daemon/luks.c
-daemon/lvm-filter.c
-daemon/lvm.c
-daemon/md.c
-daemon/mkfs.c
-daemon/mknod.c
-daemon/modprobe.c
-daemon/mount.c
-daemon/names.c
-daemon/ntfs.c
-daemon/ntfsclone.c
-daemon/optgroups.c
-daemon/parted.c
-daemon/pingdaemon.c
-daemon/proto.c
-daemon/readdir.c
-daemon/realpath.c
-daemon/scrub.c
-daemon/selinux.c
-daemon/sfdisk.c
-daemon/sleep.c
-daemon/stat.c
-daemon/statvfs.c
-daemon/strings.c
-daemon/stubs.c
-daemon/swap.c
-daemon/sync.c
-daemon/tar.c
-daemon/truncate.c
-daemon/umask.c
-daemon/upload.c
-daemon/utimens.c
-daemon/wc.c
-daemon/xattr.c
-daemon/zero.c
-daemon/zerofree.c
-df/df.c
-df/domains.c
-df/main.c
-df/output.c
-edit/virt-edit.c
-erlang/erl-guestfs-proto.c
-erlang/erl-guestfs.c
-fish/alloc.c
-fish/cmds.c
-fish/cmds_gperf.c
-fish/completion.c
-fish/config.c
-fish/copy.c
-fish/destpaths.c
-fish/display.c
-fish/echo.c
-fish/edit.c
-fish/event-names.c
-fish/events.c
-fish/fish.c
-fish/glob.c
-fish/help.c
-fish/hexedit.c
-fish/inspect.c
-fish/keys.c
-fish/lcd.c
-fish/man.c
-fish/more.c
-fish/options.c
-fish/prep.c
-fish/prep_boot.c
-fish/prep_disk.c
-fish/prep_fs.c
-fish/prep_lv.c
-fish/prep_part.c
-fish/prepopts.c
-fish/progress.c
-fish/rc.c
-fish/reopen.c
-fish/setenv.c
-fish/supported.c
-fish/tilde.c
-fish/time.c
-fish/virt.c
-format/format.c
-fuse/guestmount.c
-gobject/src/optargs-add_domain.c
-gobject/src/optargs-add_drive_opts.c
-gobject/src/optargs-btrfs_filesystem_resize.c
-gobject/src/optargs-compress_device_out.c
-gobject/src/optargs-compress_out.c
-gobject/src/optargs-copy_device_to_device.c
-gobject/src/optargs-copy_device_to_file.c
-gobject/src/optargs-copy_file_to_device.c
-gobject/src/optargs-copy_file_to_file.c
-gobject/src/optargs-e2fsck.c
-gobject/src/optargs-inspect_get_icon.c
-gobject/src/optargs-md_create.c
-gobject/src/optargs-mkfs_btrfs.c
-gobject/src/optargs-mkfs_opts.c
-gobject/src/optargs-mount_9p.c
-gobject/src/optargs-mount_local.c
-gobject/src/optargs-ntfsclone_out.c
-gobject/src/optargs-ntfsfix.c
-gobject/src/optargs-ntfsresize_opts.c
-gobject/src/optargs-set_e2attrs.c
-gobject/src/optargs-test0.c
-gobject/src/optargs-tune2fs.c
-gobject/src/optargs-umount_local.c
-gobject/src/session.c
-gobject/src/struct-application.c
-gobject/src/struct-btrfssubvolume.c
-gobject/src/struct-dirent.c
-gobject/src/struct-inotify_event.c
-gobject/src/struct-int_bool.c
-gobject/src/struct-isoinfo.c
-gobject/src/struct-lvm_lv.c
-gobject/src/struct-lvm_pv.c
-gobject/src/struct-lvm_vg.c
-gobject/src/struct-mdstat.c
-gobject/src/struct-partition.c
-gobject/src/struct-stat.c
-gobject/src/struct-statvfs.c
-gobject/src/struct-version.c
-gobject/src/struct-xattr.c
-gobject/src/tristate.c
-inspector/virt-inspector.c
-java/com_redhat_et_libguestfs_GuestFS.c
-ocaml/guestfs_c.c
-ocaml/guestfs_c_actions.c
-ocaml/t/exit.c
-perl/Guestfs.c
-perl/bindtests.pl
-perl/lib/Sys/Guestfs.pm
-perl/lib/Sys/Guestfs/Lib.pm
-php/extension/guestfs_php.c
-python/guestfs-py-byhand.c
-python/guestfs-py.c
-rescue/virt-rescue.c
-resize/progress_c.c
-ruby/ext/guestfs/_guestfs.c
-sparsify/progress_c.c
-src/actions.c
-src/appliance.c
-src/bindtests.c
-src/dbdump.c
-src/errnostring.c
-src/errnostring_gperf.c
-src/events.c
-src/filearch.c
-src/fuse.c
-src/guestfs.c
-src/inspect.c
-src/inspect_apps.c
-src/inspect_fs.c
-src/inspect_fs_cd.c
-src/inspect_fs_unix.c
-src/inspect_fs_windows.c
-src/inspect_icon.c
-src/launch.c
-src/listfs.c
-src/match.c
-src/proto.c
-src/virt.c
-test-tool/test-tool.c
-tools/virt-list-filesystems.pl
-tools/virt-list-partitions.pl
-tools/virt-make-fs.pl
-tools/virt-tar.pl
-tools/virt-win-reg.pl
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
deleted file mode 100644
index 2436c49..0000000
--- a/po/remove-potcdate.sin
+++ /dev/null
@@ -1,19 +0,0 @@
-# Sed script that remove the POT-Creation-Date line in the header entry
-# from a POT file.
-#
-# The distinction between the first and the following occurrences of the
-# pattern is achieved by looking at the hold space.
-/^"POT-Creation-Date: .*"$/{
-x
-# Test if the hold space is empty.
-s/P/P/
-ta
-# Yes it was empty. First occurrence. Remove the line.
-g
-d
-bb
-:a
-# The hold space was nonempty. Following occurrences. Do nothing.
-x
-:b
-}
--
1.7.10
Richard W.M. Jones
2012-Apr-30 18:00 UTC
[Libguestfs] [PATCH 3/4] Add gettext support for OCaml tools (virt-resize, virt-sparsify, virt-sysprep).
From: "Richard W.M. Jones" <rjones at redhat.com>
Note that this support is optional: To enable it, install the
ocaml-gettext library from
http://forge.ocamlcore.org/projects/ocaml-gettext . If this library
is not installed, then configure detects this and inserts dummy
gettext functions that do nothing.
---
.gitignore | 3 +
Makefile.am | 8 +-
README | 2 +
configure.ac | 89 ++++++++++
po/Makefile.am | 23 ++-
po/POTFILES-ml | 36 ++++
resize/Makefile.am | 5 +
resize/resize.ml | 174 ++++++++++----------
resize/utils.ml | 6 +-
sparsify/Makefile.am | 5 +
sparsify/sparsify.ml | 64 +++----
sparsify/utils.ml | 4 +-
sysprep/Makefile.am | 5 +
sysprep/main.ml | 79 ++++-----
sysprep/sysprep_operation.ml | 18 +-
sysprep/sysprep_operation_bash_history.ml | 7 +-
sysprep/sysprep_operation_cron_spool.ml | 3 +-
sysprep/sysprep_operation_dhcp_client_state.ml | 3 +-
sysprep/sysprep_operation_dhcp_server_state.ml | 3 +-
sysprep/sysprep_operation_dovecot_data.ml | 3 +-
sysprep/sysprep_operation_flag_reconfiguration.ml | 7 +-
sysprep/sysprep_operation_hostname.ml | 11 +-
sysprep/sysprep_operation_logfiles.ml | 7 +-
sysprep/sysprep_operation_mail_spool.ml | 3 +-
sysprep/sysprep_operation_net_hwaddr.ml | 7 +-
sysprep/sysprep_operation_package_manager_cache.ml | 3 +-
sysprep/sysprep_operation_random_seed.ml | 7 +-
sysprep/sysprep_operation_rhn_systemid.ml | 3 +-
sysprep/sysprep_operation_samba_db_log.ml | 3 +-
sysprep/sysprep_operation_script.ml | 23 +--
sysprep/sysprep_operation_smolt_uuid.ml | 3 +-
sysprep/sysprep_operation_ssh_hostkeys.ml | 7 +-
sysprep/sysprep_operation_ssh_userdir.ml | 7 +-
sysprep/sysprep_operation_sssd_db_log.ml | 3 +-
sysprep/sysprep_operation_udev_persistent_net.ml | 7 +-
sysprep/sysprep_operation_user_account.ml | 10 +-
sysprep/sysprep_operation_utmp.ml | 7 +-
sysprep/sysprep_operation_yum_uuid.ml | 7 +-
38 files changed, 432 insertions(+), 233 deletions(-)
create mode 100644 po/POTFILES-ml
diff --git a/.gitignore b/.gitignore
index d420430..e5d868a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -310,6 +310,7 @@ pod2htm?.tmp
/rescue/virt-rescue
/rescue/virt-rescue.1
/resize/.depend
+/resize/resize_gettext.ml
/resize/stamp-virt-resize.pod
/resize/utils_tests
/resize/virt-resize
@@ -326,6 +327,7 @@ pod2htm?.tmp
/ruby/Rakefile
/run
/sparsify/.depend
+/sparsify/sparsify_gettext.ml
/sparsify/stamp-virt-sparsify.pod
/sparsify/virt-sparsify
/sparsify/virt-sparsify.1
@@ -354,6 +356,7 @@ pod2htm?.tmp
/sysprep/stamp-script2.sh
/sysprep/stamp-virt-sysprep.pod
/sysprep/sysprep-extra-options.pod
+/sysprep/sysprep_gettext.ml
/sysprep/sysprep-operations.pod
/sysprep/virt-sysprep
/sysprep/virt-sysprep.1
diff --git a/Makefile.am b/Makefile.am
index bc0a543..fde3271 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -212,8 +212,9 @@ dist-hook:
mv AUTHORS-t AUTHORS
cp AUTHORS $(distdir)/AUTHORS
-# Update the list of translatable files (po/POTFILES). This has to be
-# in the top-level Makefile.am so that we have access to DIST_SUBDIRS.
+# Update the list of translatable files (po/POTFILES po/POTFILES-ml).
+# This has to be in the top-level Makefile.am so that we have access
+# to DIST_SUBDIRS.
all-local:
cd $(srcdir); \
find $(DIST_SUBDIRS) \
@@ -231,6 +232,9 @@ all-local:
grep -v '^images/' | \
LC_ALL=C sort | \
sed 's,^\./,,' > po/POTFILES
+ cd $(srcdir); \
+ find resize sparsify sysprep -name '*.ml' | \
+ LC_ALL=C sort > po/POTFILES-ml
# Make clean.
diff --git a/README b/README
index 2d913aa..5fc308c 100644
--- a/README
+++ b/README
@@ -100,6 +100,8 @@ For basic functionality and the C tools:
- OCaml if you want to rebuild the generated files, and
also to build the OCaml bindings (optional)
+- ocaml-gettext if you want to translate OCaml tools (optional)
+
- po4a for translating manpages and POD files.
This is optional when compiling from the tarball, but mandatory
if you compile from git.
diff --git a/configure.ac b/configure.ac
index bcd0382..132f0e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -776,6 +776,95 @@ AM_CONDITIONAL([HAVE_OCAML],
AM_CONDITIONAL([HAVE_OCAMLDOC],
[test "x$OCAMLDOC" != "xno"])
+OCAML_PKG_gettext=no
+AS_IF([test "x$OCAMLC" != "xno"],[
+ dnl Check for ocaml-gettext package to translate OCaml tools.
+ AC_CHECK_OCAML_PKG(gettext)
+
+ dnl Write gettext modules for each OCaml tool. If OCaml gettext
+ dnl is not available then we write dummy functions.
+ for program in resize sparsify sysprep; do
+ output=$program/${program}_gettext.ml
+ AC_MSG_NOTICE([creating $output])
+ rm -f $output
+
+ cat <<EOF > $output
+(* This file is generated automatically by ./configure. *)
+
+(** Gettext functions for virt-$program.
+
+ The ${program}_gettext module provides gettext functions for
+ $program, or dummy functions if ocaml-gettext was not available
+ at configure time.
+
+ {b Note}: Don't translate debug strings, or strings which are
+ meant to be read/written only by machine.
+
+ There are two ways to translate constant strings in OCaml programs.
+
+ For ordinary strings, replace [["string"]] with
[[s_"string"]]. Since
+ this is a function call to a function called [[s_]], you may have
+ to put parentheses around the expression.
+
+ For format strings, use:
+
+{v
+ printf (f_"zeroing filesystem %s") filename;
+v}
+
+ Note for format strings, the parentheses are almost always required,
+ and they just go around the [[(f_"string")]], {i not} around the
other
+ arguments of the printf function.
+
+ At build time, a program parses the OCaml code into an abstract
+ syntax tree and statically determines all calls to the special
+ [[s_]] and [[f_]] functions, which means: (a) You can be very loose
+ with syntax, unlike ordinary xgettext, but (b) you cannot rename
+ these functions.
+*)
+
+EOF
+
+ if test "x$OCAML_PKG_gettext" != "xno"; then
+ # ocaml-gettext available: real module.
+ cat <<EOF >>$output
+module Gettext = Gettext.Program (
+ struct
+ let textdomain = "$PACKAGE_NAME"
+ let codeset = None
+ let dir = None
+ let dependencies = [[]]
+ end
+) (GettextStub.Native)
+EOF
+ else
+ # No gettext: module containing dummy gettext functions.
+ cat <<EOF >>$output
+module Gettext = struct
+ external s_ : string -> string = "%identity"
+ external f_ : ('a, 'b, 'c, 'd, 'e, 'f) format6
+ -> ('a, 'b, 'c, 'd, 'e, 'f) format6
+ = "%identity"
+ let sn_ : string -> string -> int -> string
+ = fun s p n -> if n = 1 then s else p
+ let fn_ : ('a, 'b, 'c, 'd, 'e, 'f) format6
+ -> ('a, 'b, 'c, 'd, 'e, 'f) format6
+ -> int -> ('a, 'b, 'c, 'd, 'e, 'f) format6
+ = fun s p n -> if n = 1 then s else p
+end
+EOF
+ fi
+
+ chmod -w $output
+ done
+])
+AM_CONDITIONAL([HAVE_OCAML_PKG_GETTEXT],
+ [test "x$OCAMLC" != "xno" && test
"x$OCAMLFIND" != "xno" && test
"x$OCAML_PKG_gettext" != "xno"])
+
+AC_CHECK_PROG([OCAML_GETTEXT],[ocaml-gettext],[ocaml-gettext],[no])
+AM_CONDITIONAL([HAVE_OCAML_GETTEXT],
+ [test "x$OCAMLC" != "xno" && test
"x$OCAMLFIND" != "xno" && test
"x$OCAML_PKG_gettext" != "xno" && test
"x$OCAML_GETTEXT" != "xno"])
+
dnl Check for Perl (optional, for Perl bindings and Perl tools).
PERL=no
AC_ARG_ENABLE([perl],
diff --git a/po/Makefile.am b/po/Makefile.am
index c6f1acd..8c3d42c 100644
--- a/po/Makefile.am
+++ b/po/Makefile.am
@@ -25,12 +25,13 @@ MSGID_BUGS_ADDRESS =
https://bugzilla.redhat.com/enter_bug.cgi?component=libgues
# Don't use LINGUAS (uppercase) as Gentoo defines it (RHBZ#804464).
linguas := en_GB es gu hi kn ml mr nl or pa pl ta te uk
-POTFILES := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES)
-POFILES := $(linguas:%=%.po)
-GMOFILES := $(linguas:%=%.gmo)
+POTFILES := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES)
+POTFILES_ML := $(shell $(SED) 's,^,$(top_srcdir)/,' POTFILES-ml)
+POFILES := $(linguas:%=%.po)
+GMOFILES := $(linguas:%=%.gmo)
EXTRA_DIST = \
- POTFILES \
+ POTFILES POTFILES-ml \
$(DOMAIN).pot \
$(POFILES) \
$(GMOFILES)
@@ -48,8 +49,8 @@ update-po:
update-gmo: Makefile $(GMOFILES)
-$(DOMAIN).pot: Makefile $(POTFILES)
- rm -f $@ $@-t
+$(DOMAIN).pot: Makefile $(POTFILES) $(POTFILES-ml)
+ rm -f $@-t $@-ml
$(XGETTEXT) \
-o $@-t \
--default-domain=$(DOMAIN) \
@@ -66,6 +67,16 @@ $(DOMAIN).pot: Makefile $(POTFILES)
--msgid-bugs-address="$(MSGID_BUGS_ADDRESS)" \
--directory=$(top_srcdir) \
--files-from=$(abs_srcdir)/POTFILES
+if HAVE_OCAML_GETTEXT
+ cd $(top_srcdir) && \
+ $(OCAML_GETTEXT) --action extract --extract-pot po/$@-ml \
+ $$(cat $(abs_srcdir)/POTFILES-ml)
+# Don't trust msgcat since it will definitely screw up. Instead, chop
+# the head from the second file and append it to the first.
+ echo >> $@-t
+ awk '/^#:/{i++}i{print}' < $@-ml >> $@-t
+ rm $@-ml
+endif
mv $@-t $@
%.po: $(DOMAIN).pot
diff --git a/po/POTFILES-ml b/po/POTFILES-ml
new file mode 100644
index 0000000..b08aff9
--- /dev/null
+++ b/po/POTFILES-ml
@@ -0,0 +1,36 @@
+resize/progress.ml
+resize/resize.ml
+resize/resize_gettext.ml
+resize/utils.ml
+resize/utils_tests.ml
+sparsify/progress.ml
+sparsify/sparsify.ml
+sparsify/sparsify_gettext.ml
+sparsify/utils.ml
+sysprep/main.ml
+sysprep/sysprep_gettext.ml
+sysprep/sysprep_operation.ml
+sysprep/sysprep_operation_bash_history.ml
+sysprep/sysprep_operation_cron_spool.ml
+sysprep/sysprep_operation_dhcp_client_state.ml
+sysprep/sysprep_operation_dhcp_server_state.ml
+sysprep/sysprep_operation_dovecot_data.ml
+sysprep/sysprep_operation_flag_reconfiguration.ml
+sysprep/sysprep_operation_hostname.ml
+sysprep/sysprep_operation_logfiles.ml
+sysprep/sysprep_operation_mail_spool.ml
+sysprep/sysprep_operation_net_hwaddr.ml
+sysprep/sysprep_operation_package_manager_cache.ml
+sysprep/sysprep_operation_random_seed.ml
+sysprep/sysprep_operation_rhn_systemid.ml
+sysprep/sysprep_operation_samba_db_log.ml
+sysprep/sysprep_operation_script.ml
+sysprep/sysprep_operation_smolt_uuid.ml
+sysprep/sysprep_operation_ssh_hostkeys.ml
+sysprep/sysprep_operation_ssh_userdir.ml
+sysprep/sysprep_operation_sssd_db_log.ml
+sysprep/sysprep_operation_udev_persistent_net.ml
+sysprep/sysprep_operation_user_account.ml
+sysprep/sysprep_operation_utmp.ml
+sysprep/sysprep_operation_yum_uuid.ml
+sysprep/utils.ml
diff --git a/resize/Makefile.am b/resize/Makefile.am
index bd15a32..b8ae6af 100644
--- a/resize/Makefile.am
+++ b/resize/Makefile.am
@@ -30,6 +30,7 @@ SOURCES = \
progress.mli \
progress.ml \
resize.ml \
+ resize_gettext.ml \
utils.ml \
utils_tests.ml
@@ -39,6 +40,7 @@ if HAVE_OCAML
OBJECTS = \
$(top_builddir)/fish/guestfish-progress.o \
progress_c.o \
+ resize_gettext.cmx \
utils.cmx \
progress.cmx \
resize.cmx
@@ -49,6 +51,9 @@ bin_SCRIPTS = virt-resize
# option to be passed to gcc, so we don't try linking against an
# installed copy of libguestfs.
OCAMLPACKAGES = -package str -I $(top_builddir)/src/.libs -I ../ocaml
+if HAVE_OCAML_PKG_GETTEXT
+OCAMLPACKAGES += -package gettext-stub
+endif
OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
OCAMLOPTFLAGS = $(OCAMLCFLAGS)
diff --git a/resize/resize.ml b/resize/resize.ml
index 95bc774..256148d 100644
--- a/resize/resize.ml
+++ b/resize/resize.ml
@@ -18,6 +18,8 @@
open Printf
+open Resize_gettext.Gettext
+
module G = Guestfs
open Utils
@@ -38,7 +40,7 @@ let infile, outfile, align_first, alignment, copy_boot_loader,
let display_version () let g = new G.guestfs () in
let version = g#version () in
- printf "virt-resize %Ld.%Ld.%Ld%s\n"
+ printf (f_"virt-resize %Ld.%Ld.%Ld%s\n")
version.G.major version.G.minor version.G.release version.G.extra;
exit 0
in
@@ -54,8 +56,8 @@ let infile, outfile, align_first, alignment, copy_boot_loader,
let dryrun = ref false in
let expand = ref "" in
let set_expand s - if s = "" then error "%s: empty --expand
option" prog
- else if !expand <> "" then error "--expand option
given twice"
+ if s = "" then error (f_"%s: empty --expand option")
prog
+ else if !expand <> "" then error (f_"--expand option
given twice")
else expand := s
in
let expand_content = ref true in
@@ -71,51 +73,51 @@ let infile, outfile, align_first, alignment,
copy_boot_loader,
let resizes_force = ref [] in
let shrink = ref "" in
let set_shrink s - if s = "" then error "empty --shrink
option"
- else if !shrink <> "" then error "--shrink option
given twice"
+ if s = "" then error (f_"empty --shrink option")
+ else if !shrink <> "" then error (f_"--shrink option
given twice")
else shrink := s
in
let argspec = Arg.align [
- "--align-first", Arg.Set_string align_first,
"never|always|auto Align first partition (default: auto)";
- "--alignment", Arg.Set_int alignment, "sectors Set
partition alignment (default: 128 sectors)";
- "--no-copy-boot-loader", Arg.Clear copy_boot_loader, "
Don't copy boot loader";
- "-d", Arg.Set debug, " Enable debugging
messages";
+ "--align-first", Arg.Set_string align_first,
s_"never|always|auto" ^ " " ^ s_"Align first partition
(default: auto)";
+ "--alignment", Arg.Set_int alignment, s_"sectors" ^
" " ^ s_"Set partition alignment (default: 128 sectors)";
+ "--no-copy-boot-loader", Arg.Clear copy_boot_loader, "
" ^ s_"Don't copy boot loader";
+ "-d", Arg.Set debug, " " ^
s_"Enable debugging messages";
"--debug", Arg.Set debug, " -\"-";
- "--debug-gc",Arg.Set debug_gc, " Debug GC and
memory allocations";
- "--delete", Arg.String (add deletes), "part Delete
partition";
- "--expand", Arg.String set_expand, "part Expand
partition";
- "--no-expand-content", Arg.Clear expand_content, " Don't
expand content";
- "--no-extra-partition", Arg.Clear extra_partition, "
Don't create extra partition";
- "--format", Arg.Set_string format, "format Format of
input disk";
- "--ignore", Arg.String (add ignores), "part Ignore
partition";
- "--lv-expand", Arg.String (add lv_expands), "lv Expand
logical volume";
- "--LV-expand", Arg.String (add lv_expands), "lv
-\"-";
- "--lvexpand", Arg.String (add lv_expands), "lv
-\"-";
- "--LVexpand", Arg.String (add lv_expands), "lv
-\"-";
- "--machine-readable", Arg.Set machine_readable, " Make
output machine readable";
- "-n", Arg.Set dryrun, " Don't perform
changes";
+ "--debug-gc",Arg.Set debug_gc, " " ^
s_"Debug GC and memory allocations";
+ "--delete", Arg.String (add deletes), s_"part" ^
" " ^ s_"Delete partition";
+ "--expand", Arg.String set_expand, s_"part" ^
" " ^ s_"Expand partition";
+ "--no-expand-content", Arg.Clear expand_content, " " ^
s_"Don't expand content";
+ "--no-extra-partition", Arg.Clear extra_partition, " "
^ s_"Don't create extra partition";
+ "--format", Arg.Set_string format, s_"format" ^
" " ^ s_"Format of input disk";
+ "--ignore", Arg.String (add ignores), s_"part" ^
" " ^ s_"Ignore partition";
+ "--lv-expand", Arg.String (add lv_expands), s_"lv" ^
" " ^ s_"Expand logical volume";
+ "--LV-expand", Arg.String (add lv_expands), s_"lv" ^
" -\"-";
+ "--lvexpand", Arg.String (add lv_expands), s_"lv" ^
" -\"-";
+ "--LVexpand", Arg.String (add lv_expands), s_"lv" ^
" -\"-";
+ "--machine-readable", Arg.Set machine_readable, " " ^
s_"Make output machine readable";
+ "-n", Arg.Set dryrun, " " ^
s_"Don't perform changes";
"--dryrun", Arg.Set dryrun, " -\"-";
"--dry-run", Arg.Set dryrun, " -\"-";
- "--ntfsresize-force", Arg.Set ntfsresize_force, " Force
ntfsresize";
- "--output-format", Arg.Set_string output_format, "format
Format of output disk";
- "-q", Arg.Set quiet, " Don't print
the summary";
+ "--ntfsresize-force", Arg.Set ntfsresize_force, " " ^
s_"Force ntfsresize";
+ "--output-format", Arg.Set_string output_format,
s_"format" ^ " " ^ s_"Format of output disk";
+ "-q", Arg.Set quiet, " " ^
s_"Don't print the summary";
"--quiet", Arg.Set quiet, " -\"-";
- "--resize", Arg.String (add resizes), "part=size Resize
partition";
- "--resize-force", Arg.String (add resizes_force), "part=size
Forcefully resize partition";
- "--shrink", Arg.String set_shrink, "part Shrink
partition";
- "-V", Arg.Unit display_version, " Display version
and exit";
+ "--resize", Arg.String (add resizes), s_"part=size" ^
" " ^ s_"Resize partition";
+ "--resize-force", Arg.String (add resizes_force),
s_"part=size" ^ " " ^ s_"Forcefully resize
partition";
+ "--shrink", Arg.String set_shrink, s_"part" ^
" " ^ s_"Shrink partition";
+ "-V", Arg.Unit display_version, " " ^
s_"Display version and exit";
"--version", Arg.Unit display_version, " -\"-";
] in
let disks = ref [] in
let anon_fun s = disks := s :: !disks in
let usage_msg - sprintf "\
+ sprintf (f_"\
%s: resize a virtual machine disk
A short summary of the options is given below. For detailed help please
read the man page virt-resize(1).
-"
+")
prog in
Arg.parse argspec anon_fun usage_msg;
@@ -147,7 +149,7 @@ read the man page virt-resize(1).
let shrink = match !shrink with "" -> None | str -> Some str
in
if alignment < 1 then
- error "alignment cannot be < 1";
+ error (f_"alignment cannot be < 1");
let alignment = Int64.of_int alignment in
let align_first @@ -156,7 +158,7 @@ read the man page virt-resize(1).
| "always" -> `Always
| "auto" -> `Auto
| _ ->
- error "unknown --align-first option: use never|always|auto" in
+ error (f_"unknown --align-first option: use never|always|auto")
in
(* No arguments and machine-readable mode? Print out some facts
* about what this binary supports. We only need to print out new
@@ -185,13 +187,13 @@ read the man page virt-resize(1).
match List.rev !disks with
| [infile; outfile] -> infile, outfile
| _ ->
- error "usage is: %s [--options] indisk outdisk" prog in
+ error (f_"usage is: %s [--options] indisk outdisk") prog in
(* Simple-minded check that the user isn't trying to use the
* same disk for input and output.
*)
if infile = outfile then
- error "you cannot use the same disk image for input and output";
+ error (f_"you cannot use the same disk image for input and
output");
infile, outfile, align_first, alignment, copy_boot_loader,
debug, debug_gc, deletes,
@@ -225,7 +227,7 @@ let connect_both_disks ()
let g if not quiet then
- printf "Examining %s ...\n%!" infile;
+ printf (f_"Examining %s ...\n%!") infile;
let g = connect_both_disks () in
@@ -263,10 +265,10 @@ let max_bootloader (* Check the disks are at least as big
as the bootloader. *)
let () if insize < Int64.of_int max_bootloader then
- error "%s: file is too small to be a disk image (%Ld bytes)"
+ error (f_"%s: file is too small to be a disk image (%Ld bytes)")
infile insize;
if outsize < Int64.of_int max_bootloader then
- error "%s: file is too small to be a disk image (%Ld bytes)"
+ error (f_"%s: file is too small to be a disk image (%Ld bytes)")
outfile outsize
(* Get the source partition type. *)
@@ -280,7 +282,7 @@ let parttype, parttype_string | "msdos" ->
MBR, "msdos"
| "gpt" -> GPT, "gpt"
| _ ->
- error "%s: unknown partition table type\nvirt-resize only supports MBR
(DOS) and GPT partition tables." infile
+ error (f_"%s: unknown partition table type\nvirt-resize only supports
MBR (DOS) and GPT partition tables.") infile
(* Build a data structure describing the source disk's partition layout.
*
@@ -330,7 +332,7 @@ and string_of_partition_content = function
| ContentExtendedPartition -> "extended partition"
and string_of_partition_content_no_size = function
| ContentUnknown -> "unknown data"
- | ContentPV _ -> sprintf "LVM PV"
+ | ContentPV _ -> "LVM PV"
| ContentFS (fs, _) -> sprintf "filesystem %s" fs
| ContentExtendedPartition -> "extended partition"
@@ -344,7 +346,7 @@ let get_partition_content else if fs =
"LVM2_member" then (
let rec loop = function
| [] ->
- error "%s: physical volume not returned by pvs_full"
+ error (f_"%s: physical volume not returned by
pvs_full")
dev
| pv :: _ when canonicalize pv.G.pv_name = dev ->
ContentPV pv.G.pv_size
@@ -369,7 +371,7 @@ let partitions : partition list let parts = Array.to_list
(g#part_list "/dev/sda") in
if List.length parts = 0 then
- error "the source disk has no partitions";
+ error (f_"the source disk has no partitions");
(* Filter out logical partitions. See note above. *)
let parts @@ -414,12 +416,12 @@ let partitions : partition list | {
p_name = name; p_part = { G.part_size = size };
p_type = ContentPV pv_size }
when size < pv_size ->
- error "%s: partition size %Ld < physical volume size %Ld"
+ error (f_"%s: partition size %Ld < physical volume size
%Ld")
name size pv_size
| { p_name = name; p_part = { G.part_size = size };
p_type = ContentFS (_, fs_size) }
when size < fs_size ->
- error "%s: partition size %Ld < filesystem size %Ld"
+ error (f_"%s: partition size %Ld < filesystem size %Ld")
name size fs_size
| _ -> ()
) partitions;
@@ -429,7 +431,7 @@ let partitions : partition list | [] -> ()
| { p_name = name; p_part = { G.part_start = part_start } } :: _
when end_of_prev > part_start ->
- error "%s: this partition overlaps the previous one" name
+ error (f_"%s: this partition overlaps the previous one") name
| { p_part = { G.part_end = part_end } } :: parts -> loop part_end parts
in
loop 0L partitions;
@@ -482,10 +484,10 @@ type expand_content_method | PVResize | Resize2fs |
NTFSResize | BtrfsFilesystemResize
let string_of_expand_content_method = function
- | PVResize -> "pvresize"
- | Resize2fs -> "resize2fs"
- | NTFSResize -> "ntfsresize"
- | BtrfsFilesystemResize -> "btrfs-filesystem-resize"
+ | PVResize -> s_"pvresize"
+ | Resize2fs -> s_"resize2fs"
+ | NTFSResize -> s_"ntfsresize"
+ | BtrfsFilesystemResize -> s_"btrfs-filesystem-resize"
let can_expand_content if expand_content then
@@ -532,15 +534,15 @@ let find_partition let partition try
Hashtbl.find hash name
with Not_found ->
- error "%s: partition not found in the source disk image (this
error came from '%s' option on the command line). Try running this
command: virt-filesystems --partitions --long -a %s"
+ error (f_"%s: partition not found in the source disk image (this
error came from '%s' option on the command line). Try running this
command: virt-filesystems --partitions --long -a %s")
name option infile in
if partition.p_operation = OpIgnore then
- error "%s: partition already ignored, you cannot use it in
'%s' option"
+ error (f_"%s: partition already ignored, you cannot use it in
'%s' option")
name option;
if partition.p_operation = OpDelete then
- error "%s: partition already deleted, you cannot use it in
'%s' option"
+ error (f_"%s: partition already deleted, you cannot use it in
'%s' option")
name option;
partition
@@ -572,11 +574,11 @@ let mark_partition_for_resize ~option ?(force = false) p
newsize
(match p.p_operation with
| OpResize _ ->
- error "%s: this partition has already been marked for
resizing"
+ error (f_"%s: this partition has already been marked for
resizing")
name
| OpIgnore | OpDelete ->
(* This error should have been caught already by find_partition ... *)
- error "%s: this partition has already been ignored or deleted"
+ error (f_"%s: this partition has already been ignored or
deleted")
name
| OpCopy -> ()
);
@@ -591,18 +593,18 @@ let mark_partition_for_resize ~option ?(force = false) p
newsize *)
match p.p_type with
| ContentUnknown ->
- error "%s: This partition has unknown content which might be
damaged by shrinking it. If you want to shrink this partition, you need to use
the '--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)"
+ error (f_"%s: This partition has unknown content which might be
damaged by shrinking it. If you want to shrink this partition, you need to use
the '--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)")
name option
| ContentPV size when size > newsize ->
- error "%s: This partition has contains an LVM physical volume
which will be damaged by shrinking it below %Ld bytes (user asked to shrink it
to %Ld bytes). If you want to shrink this partition, you need to use the
'--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)"
+ error (f_"%s: This partition has contains an LVM physical volume
which will be damaged by shrinking it below %Ld bytes (user asked to shrink it
to %Ld bytes). If you want to shrink this partition, you need to use the
'--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)")
name size newsize option
| ContentPV _ -> ()
| ContentFS (fstype, size) when size > newsize ->
- error "%s: This partition has contains a %s filesystem which
will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld
bytes). If you want to shrink this partition, you need to use the
'--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)"
+ error (f_"%s: This partition has contains a %s filesystem which
will be damaged by shrinking it below %Ld bytes (user asked to shrink it to %Ld
bytes). If you want to shrink this partition, you need to use the
'--resize-force' option, but that could destroy any data on this
partition. (This error came from '%s' option on the command
line.)")
name fstype size newsize option
| ContentFS _ -> ()
| ContentExtendedPartition ->
- error "%s: This extended partition contains logical partitions
which might be damaged by shrinking it. If you want to shrink this partition,
you need to use the '--resize-force' option, but that could destroy
logical partitions within this partition. (This error came from '%s'
option on the command line.)"
+ error (f_"%s: This extended partition contains logical
partitions which might be damaged by shrinking it. If you want to shrink this
partition, you need to use the '--resize-force' option, but that could
destroy logical partitions within this partition. (This error came from
'%s' option on the command line.)")
name option
);
@@ -620,7 +622,7 @@ let () if n == 0 then raise Not_found;
String.sub arg 0 i, String.sub arg (i+1) n
with Not_found ->
- error "%s: missing size field in '%s' option" arg
option in
+ error (f_"%s: missing size field in '%s' option") arg
option in
let p = find_partition ~option dev in
@@ -629,7 +631,7 @@ let () let newsize = parse_size oldsize sizefield in
if newsize <= 0L then
- error "%s: new partition size is zero or negative" dev;
+ error (f_"%s: new partition size is zero or negative") dev;
mark_partition_for_resize ~option ~force p newsize
in
@@ -668,7 +670,7 @@ let calculate_surplus () (* Handle --expand and --shrink
options. *)
let () if expand <> None && shrink <> None then
- error "you cannot use options --expand and --shrink together";
+ error (f_"you cannot use options --expand and --shrink
together");
if expand <> None || shrink <> None then (
let surplus = calculate_surplus () in
@@ -680,7 +682,7 @@ let () | None -> ()
| Some dev ->
if surplus < 0L then
- error "You cannot use --expand when there is no surplus space
to expand into. You need to make the target disk larger by at least %s."
+ error (f_"You cannot use --expand when there is no surplus
space to expand into. You need to make the target disk larger by at least
%s.")
(human_size (Int64.neg surplus));
let option = "--expand" in
@@ -692,7 +694,7 @@ let () | None -> ()
| Some dev ->
if surplus > 0L then
- error "You cannot use --shrink when there is no deficit (see
'deficit' in the virt-resize(1) man page).";
+ error (f_"You cannot use --shrink when there is no deficit (see
'deficit' in the virt-resize(1) man page).");
let option = "--shrink" in
let p = find_partition ~option dev in
@@ -709,7 +711,7 @@ let surplus
if surplus < 0L then (
let deficit = Int64.neg surplus in
- error "There is a deficit of %Ld bytes (%s). You need to make the
target disk larger by at least this amount or adjust your resizing
requests."
+ error (f_"There is a deficit of %Ld bytes (%s). You need to make the
target disk larger by at least this amount or adjust your resizing
requests.")
deficit (human_size deficit)
);
@@ -725,7 +727,7 @@ let () let lv try Hashtbl.find hash name
with Not_found ->
- error "%s: logical volume not found in the source disk image
(this error came from '--lv-expand' option on the command line). Try
running this command: virt-filesystems --logical-volumes --long -a %s"
+ error (f_"%s: logical volume not found in the source disk image
(this error came from '--lv-expand' option on the command line). Try
running this command: virt-filesystems --logical-volumes --long -a %s")
name infile in
lv.lv_operation <- LVOpExpand
) lv_expands
@@ -743,16 +745,16 @@ let () let text match p.p_operation
with
| OpCopy ->
- sprintf "%s: This partition will be left alone." name
+ sprintf (f_"%s: This partition will be left alone.")
name
| OpIgnore ->
- sprintf "%s: This partition will be created, but the
contents will be ignored (ie. not copied to the target)." name
+ sprintf (f_"%s: This partition will be created, but the
contents will be ignored (ie. not copied to the target).") name
| OpDelete ->
- sprintf "%s: This partition will be deleted." name
+ sprintf (f_"%s: This partition will be deleted.") name
| OpResize newsize ->
- sprintf "%s: This partition will be resized from %s to
%s."
+ sprintf (f_"%s: This partition will be resized from %s to
%s.")
name (human_size oldsize) (human_size newsize) ^
if can_expand_content p.p_type then (
- sprintf " The %s on %s will be expanded using the
'%s' method."
+ sprintf (f_" The %s on %s will be expanded using the
'%s' method.")
(string_of_partition_content_no_size p.p_type)
name
(string_of_expand_content_method
@@ -768,10 +770,10 @@ let () | LVOpNone -> ()
| LVOpExpand ->
let text - sprintf "%s: This logical volume will
be expanded to maximum size."
+ sprintf (f_"%s: This logical volume will be expanded to
maximum size.")
name ^
if can_expand_content lv.lv_type then (
- sprintf " The %s on %s will be expanded using the
'%s' method."
+ sprintf (f_" The %s on %s will be expanded using the
'%s' method.")
(string_of_partition_content_no_size lv.lv_type)
name
(string_of_expand_content_method
@@ -783,14 +785,14 @@ let ()
if surplus > 0L then (
let text - sprintf "There is a surplus of %s."
(human_size surplus) ^
+ sprintf (f_"There is a surplus of %s.") (human_size surplus)
^
if extra_partition then (
if surplus >= min_extra_partition then
- sprintf " An extra partition will be created for the
surplus."
+ s_" An extra partition will be created for the surplus."
else
- sprintf " The surplus space is not large enough for an extra
partition to be created and so it will just be ignored."
+ s_" The surplus space is not large enough for an extra
partition to be created and so it will just be ignored."
) else
- sprintf " The surplus space will be ignored. Run a
partitioning program in the guest to partition this extra space if you
want." in
+ s_" The surplus space will be ignored. Run a partitioning
program in the guest to partition this extra space if you want." in
wrap (text ^ "\n\n")
);
@@ -824,7 +826,7 @@ let g * relaunching another handle.
*)
if not quiet then
- printf "Setting up initial partition table on %s ...\n%!"
outfile;
+ printf (f_"Setting up initial partition table on %s ...\n%!")
outfile;
let last_error = ref "" in
let rec initialize_partition_table g attempts @@ -845,7 +847,7 @@ let g
let g, ok = initialize_partition_table g 5 in
if not ok then
- error "Failed to initialize the partition table on the target disk.
You need to wipe or recreate the target disk and then run virt-resize
again.\n\nThe underlying error was: %s" !last_error;
+ error (f_"Failed to initialize the partition table on the target disk.
You need to wipe or recreate the target disk and then run virt-resize
again.\n\nThe underlying error was: %s") !last_error;
g
@@ -858,7 +860,7 @@ let () if copy_boot_loader then (
let bootsect = g#pread_device "/dev/sda" 446 0L in
if String.length bootsect < 446 then
- error "pread-device: short read";
+ error (f_"pread-device: short read");
ignore (g#pwrite_device "/dev/sdb" bootsect 0L);
let start @@ -871,7 +873,7 @@ let ()
let loader = g#pread_device "/dev/sda" max_bootloader start in
if String.length loader < max_bootloader then
- error "pread-device: short read";
+ error (f_"pread-device: short read");
ignore (g#pwrite_device "/dev/sdb" loader start)
)
@@ -1016,7 +1018,7 @@ let () let target = sprintf
"/dev/sdb%d" p.p_target_partnum in
if not quiet then
- printf "Copying %s ...\n%!" source;
+ printf (f_"Copying %s ...\n%!") source;
(match p.p_type with
| ContentUnknown | ContentPV _ | ContentFS _ ->
@@ -1069,10 +1071,10 @@ let () (* Sanity check: it contains the NTFS
magic. *)
let magic = g#pread_device target 8 3L in
if magic <> "NTFS " then
- eprintf "warning: first partition is NTFS but does not contain
NTFS boot loader magic\n%!"
+ eprintf (f_"warning: first partition is NTFS but does not contain
NTFS boot loader magic\n%!")
else (
if not quiet then
- printf "Fixing first NTFS partition boot record ...\n%!";
+ printf (f_"Fixing first NTFS partition boot record
...\n%!");
if debug then (
let old_hidden = int_of_le32 (g#pread_device target 4 0x1c_L) in
@@ -1147,7 +1149,7 @@ let () let meth = expand_content_method
p.p_type in
if not quiet then
- printf "Expanding %s%s using the '%s' method
...\n%!"
+ printf (f_"Expanding %s%s using the '%s' method
...\n%!")
source
(if source <> target then sprintf " (now %s)"
target else "")
(string_of_expand_content_method meth);
@@ -1164,7 +1166,7 @@ let () let meth = expand_content_method
lv.lv_type in
if not quiet then
- printf "Expanding %s using the '%s' method
...\n%!"
+ printf (f_"Expanding %s using the '%s' method
...\n%!")
name
(string_of_expand_content_method meth);
@@ -1185,7 +1187,7 @@ let ()
if not quiet then (
print_newline ();
- wrap "Resize operation completed with no errors. Before deleting the
old disk, carefully check that the resized disk boots and works
correctly.\n";
+ wrap (s_"Resize operation completed with no errors. Before deleting
the old disk, carefully check that the resized disk boots and works
correctly.\n");
);
if debug_gc then
diff --git a/resize/utils.ml b/resize/utils.ml
index 3c253da..d99f489 100644
--- a/resize/utils.ml
+++ b/resize/utils.ml
@@ -18,6 +18,8 @@
open Printf
+open Resize_gettext.Gettext
+
module G = Guestfs
let ( +^ ) = Int64.add
@@ -72,11 +74,11 @@ let wrap ?(chan = stdout) ?(hanging = 0) str
let error fs let display str - wrap ~chan:stderr ("virt-resize:
error: " ^ str);
+ wrap ~chan:stderr (s_"virt-resize: error: " ^ str);
prerr_newline ();
prerr_newline ();
wrap ~chan:stderr
- "If reporting bugs, run virt-resize with the '-d' option and
include the complete output.";
+ (s_"If reporting bugs, run virt-resize with the '-d' option
and include the complete output.");
prerr_newline ();
exit 1
in
diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am
index efe8278..7de66b7 100644
--- a/sparsify/Makefile.am
+++ b/sparsify/Makefile.am
@@ -30,6 +30,7 @@ SOURCES = \
progress.mli \
progress.ml \
sparsify.ml \
+ sparsify_gettext.ml \
utils.ml
if HAVE_OCAML
@@ -38,6 +39,7 @@ if HAVE_OCAML
OBJECTS = \
$(top_builddir)/fish/guestfish-progress.o \
progress_c.o \
+ sparsify_gettext.cmx \
utils.cmx \
progress.cmx \
sparsify.cmx
@@ -48,6 +50,9 @@ bin_SCRIPTS = virt-sparsify
# option to be passed to gcc, so we don't try linking against an
# installed copy of libguestfs.
OCAMLPACKAGES = -package unix -I $(top_builddir)/src/.libs -I
$(top_builddir)/ocaml
+if HAVE_OCAML_PKG_GETTEXT
+OCAMLPACKAGES += -package gettext-stub
+endif
OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
OCAMLOPTFLAGS = $(OCAMLCFLAGS)
diff --git a/sparsify/sparsify.ml b/sparsify/sparsify.ml
index a1382e6..600a9e5 100644
--- a/sparsify/sparsify.ml
+++ b/sparsify/sparsify.ml
@@ -19,6 +19,8 @@
open Unix
open Printf
+open Sparsify_gettext.Gettext
+
module G = Guestfs
open Utils
@@ -54,33 +56,33 @@ let indisk, outdisk, compress, convert, debug_gc,
let zeroes = ref [] in
let argspec = Arg.align [
- "--compress", Arg.Set compress, " Compressed output
format";
- "--convert", Arg.Set_string convert, "format Format of
output disk (default: same as input)";
- "--debug-gc", Arg.Set debug_gc, " Debug GC and
memory allocations";
- "--format", Arg.Set_string format, "format Format of
input disk";
- "--ignore", Arg.String (add ignores), "fs Ignore
filesystem";
- "--machine-readable", Arg.Set machine_readable, " Make
output machine readable";
- "-o", Arg.Set_string option, "option Add qemu-img
options";
- "-q", Arg.Set quiet, " Quiet
output";
+ "--compress", Arg.Set compress, " " ^
s_"Compressed output format";
+ "--convert", Arg.Set_string convert, s_"format" ^
" " ^ s_"Format of output disk (default: same as input)";
+ "--debug-gc", Arg.Set debug_gc, " " ^
s_"Debug GC and memory allocations";
+ "--format", Arg.Set_string format, s_"format" ^
" " ^ s_"Format of input disk";
+ "--ignore", Arg.String (add ignores), s_"fs" ^ "
" ^ s_"Ignore filesystem";
+ "--machine-readable", Arg.Set machine_readable, " " ^
s_"Make output machine readable";
+ "-o", Arg.Set_string option, s_"option" ^
" " ^ s_"Add qemu-img options";
+ "-q", Arg.Set quiet, " " ^
s_"Quiet output";
"--quiet", Arg.Set quiet, " -\"-";
- "-v", Arg.Set verbose, " Enable debugging
messages";
+ "-v", Arg.Set verbose, " " ^
s_"Enable debugging messages";
"--verbose", Arg.Set verbose, " -\"-";
- "-V", Arg.Unit display_version, " Display version
and exit";
+ "-V", Arg.Unit display_version, " " ^
s_"Display version and exit";
"--version", Arg.Unit display_version, " -\"-";
- "-x", Arg.Set trace, " Enable tracing of
libguestfs calls";
- "--zero", Arg.String (add zeroes), "fs Zero
filesystem";
+ "-x", Arg.Set trace, " " ^
s_"Enable tracing of libguestfs calls";
+ "--zero", Arg.String (add zeroes), s_"fs" ^ "
" ^ s_"Zero filesystem";
] in
let disks = ref [] in
let anon_fun s = disks := s :: !disks in
let usage_msg - sprintf "\
+ sprintf (f_"\
%s: sparsify a virtual machine disk
virt-sparsify [--options] indisk outdisk
A short summary of the options is given below. For detailed help please
read the man page virt-sparsify(1).
-"
+")
prog in
Arg.parse argspec anon_fun usage_msg;
@@ -125,7 +127,7 @@ read the man page virt-sparsify(1).
* same disk for input and output.
*)
if indisk = outdisk then
- error "you cannot use the same disk image for input and output";
+ error (f_"you cannot use the same disk image for input and
output");
(* The input disk must be an absolute path, so we can store the name
* in the overlay disk.
@@ -141,10 +143,10 @@ read the man page virt-sparsify(1).
(* Check filenames don't contain a colon (limitation of qemu-img). *)
if contains_colon indisk then
- error "input filename '%s' contains a colon (':');
qemu-img command line syntax prevents us from using such an image" indisk;
+ error (f_"input filename '%s' contains a colon (':');
qemu-img command line syntax prevents us from using such an image") indisk;
if contains_colon outdisk then
- error "output filename '%s' contains a colon (':');
qemu-img command line syntax prevents us from using such an image" outdisk;
+ error (f_"output filename '%s' contains a colon (':');
qemu-img command line syntax prevents us from using such an image")
outdisk;
indisk, outdisk, compress, convert,
debug_gc, format, ignores, machine_readable,
@@ -152,7 +154,7 @@ read the man page virt-sparsify(1).
let () if not quiet then
- printf "Create overlay file to protect source disk ...\n%!"
+ printf (f_"Create overlay file to protect source disk ...\n%!")
(* Create the temporary overlay file. *)
let overlaydisk @@ -178,13 +180,13 @@ let overlaydisk if verbose then
printf "%s\n%!" cmd;
if Sys.command cmd <> 0 then
- error "external command failed: %s" cmd;
+ error (f_"external command failed: %s") cmd;
tmp
let () if not quiet then
- printf "Examine source disk ...\n%!"
+ printf (f_"Examine source disk ...\n%!")
(* Connect to libguestfs. *)
let g @@ -221,7 +223,7 @@ let () if not (is_ignored fs) then (
if List.mem fs zeroes then (
if not quiet then
- printf "Zeroing %s ...\n%!" fs;
+ printf (f_"Zeroing %s ...\n%!") fs;
g#zero_device fs
) else (
@@ -231,7 +233,7 @@ let ()
if mounted then (
if not quiet then
- printf "Fill free space in %s with zero ...\n%!" fs;
+ printf (f_"Fill free space in %s with zero ...\n%!")
fs;
g#zero_free_space "/"
) else (
@@ -247,7 +249,7 @@ let ()
if is_linux_x86_swap then (
if not quiet then
- printf "Clearing Linux swap on %s ...\n%!" fs;
+ printf (f_"Clearing Linux swap on %s ...\n%!") fs;
(* Don't use mkswap. Just preserve the header containing
* the label, UUID and swap format version (libguestfs
@@ -256,7 +258,7 @@ let () let header = g#pread_device fs 4096 0L
in
g#zero_device fs;
if g#pwrite_device fs header 0L <> 4096 then
- error "pwrite: short write restoring swap partition
header"
+ error (f_"pwrite: short write restoring swap partition
header")
)
)
);
@@ -282,7 +284,7 @@ let ()
if created then (
if not quiet then
- printf "Fill free space in volgroup %s with zero ...\n%!"
vg;
+ printf (f_"Fill free space in volgroup %s with zero
...\n%!") vg;
g#zero_device lvdev;
g#sync ();
@@ -313,11 +315,11 @@ let output_format (match stat with
| WEXITED 0 -> ()
| WEXITED _ ->
- error "external command failed: %s" cmd
+ error (f_"external command failed: %s") cmd
| WSIGNALED i ->
- error "external command '%s' killed by signal %d" cmd
i
+ error (f_"external command '%s' killed by signal %d")
cmd i
| WSTOPPED i ->
- error "external command '%s' stopped by signal %d"
cmd i
+ error (f_"external command '%s' stopped by signal
%d") cmd i
);
if string_prefix line "QEMU QCOW Image (v2)" then
"qcow2"
@@ -331,7 +333,7 @@ let output_format *)
let () if not quiet then
- printf "Copy to destination and make sparse ...\n%!";
+ printf (f_"Copy to destination and make sparse ...\n%!");
let cmd sprintf "qemu-img convert -f qcow2 -O %s%s%s %s %s"
@@ -344,13 +346,13 @@ let () if verbose then
printf "%s\n%!" cmd;
if Sys.command cmd <> 0 then
- error "external command failed: %s" cmd
+ error (f_"external command failed: %s") cmd
(* Finished. *)
let () if not quiet then (
print_newline ();
- wrap "Sparsify operation completed with no errors. Before deleting
the old disk, carefully check that the target disk boots and works
correctly.\n";
+ wrap (s_"Sparsify operation completed with no errors. Before deleting
the old disk, carefully check that the target disk boots and works
correctly.\n");
);
if debug_gc then
diff --git a/sparsify/utils.ml b/sparsify/utils.ml
index d2be12c..dd27ba8 100644
--- a/sparsify/utils.ml
+++ b/sparsify/utils.ml
@@ -22,6 +22,8 @@
open Printf
+open Sparsify_gettext.Gettext
+
module G = Guestfs
let (//) = Filename.concat
@@ -104,7 +106,7 @@ let error fs prerr_newline ();
prerr_newline ();
wrap ~chan:stderr
- "If reporting bugs, run virt-sparsify with the '-v' and
'-x' options and include the complete output.";
+ (s_"If reporting bugs, run virt-sparsify with the '-v' and
'-x' options and include the complete output.");
prerr_newline ();
exit 1
in
diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am
index 2424071..38acfd2 100644
--- a/sysprep/Makefile.am
+++ b/sysprep/Makefile.am
@@ -31,6 +31,7 @@ CLEANFILES = \
# Alphabetical order.
SOURCES = \
main.ml \
+ sysprep_gettext.ml \
sysprep_operation.ml \
sysprep_operation.mli \
sysprep_operation_bash_history.ml \
@@ -62,6 +63,7 @@ if HAVE_OCAML
# Note this list must be in dependency order.
OBJECTS = \
+ sysprep_gettext.cmx \
utils.cmx \
sysprep_operation.cmx \
sysprep_operation_bash_history.cmx \
@@ -95,6 +97,9 @@ bin_SCRIPTS = virt-sysprep
# option to be passed to gcc, so we don't try linking against an
# installed copy of libguestfs.
OCAMLPACKAGES = -package unix -I $(top_builddir)/src/.libs -I
$(top_builddir)/ocaml
+if HAVE_OCAML_PKG_GETTEXT
+OCAMLPACKAGES += -package gettext-stub
+endif
OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
OCAMLOPTFLAGS = $(OCAMLCFLAGS)
diff --git a/sysprep/main.ml b/sysprep/main.ml
index 1223816..ca5664d 100644
--- a/sysprep/main.ml
+++ b/sysprep/main.ml
@@ -19,6 +19,8 @@
open Unix
open Printf
+open Sysprep_gettext.Gettext
+
open Utils
module G = Guestfs
@@ -53,7 +55,7 @@ let debug_gc, operations, g, selinux_relabel, quiet files
:= (file, format) :: !files
and set_domain dom if !domain <> None then (
- eprintf "%s: --domain option can only be given once\n" prog;
+ eprintf (f_"%s: --domain option can only be given once\n")
prog;
exit 1
);
domain := Some dom
@@ -65,11 +67,11 @@ let debug_gc, operations, g, selinux_relabel, quiet
exit 0
and set_enable ops if !operations <> None then (
- eprintf "%s: --enable option can only be given once\n" prog;
+ eprintf (f_"%s: --enable option can only be given once\n")
prog;
exit 1
);
if ops = "" then (
- eprintf "%s: you cannot pass an empty argument to --enable\n"
prog;
+ eprintf (f_"%s: you cannot pass an empty argument to
--enable\n") prog;
exit 1
);
let ops = string_split "," ops in
@@ -77,7 +79,8 @@ let debug_gc, operations, g, selinux_relabel, quiet fun
opset op_name ->
try Sysprep_operation.add_to_set op_name opset
with Not_found ->
- eprintf "%s: --enable: '%s' is not a known
operation\n" prog op_name;
+ eprintf (f_"%s: --enable: '%s' is not a known
operation\n")
+ prog op_name;
exit 1
) Sysprep_operation.empty_set ops in
operations := Some opset
@@ -91,38 +94,38 @@ let debug_gc, operations, g, selinux_relabel, quiet in
let basic_args = [
- "-a", Arg.String add_file, "file Add disk image
file";
- "--add", Arg.String add_file, "file Add disk image
file";
- "-c", Arg.Set_string libvirturi, "uri Set libvirt
URI";
- "--connect", Arg.Set_string libvirturi, "uri Set libvirt
URI";
- "--debug-gc", Arg.Set debug_gc, " Debug GC and
memory allocations (internal)";
- "-d", Arg.String set_domain, "domain Set libvirt
guest name";
- "--domain", Arg.String set_domain, "domain Set libvirt
guest name";
- "-n", Arg.Set dryrun, " Perform a dry
run";
- "--dryrun", Arg.Set dryrun, " Perform a dry
run";
- "--dry-run", Arg.Set dryrun, " Perform a dry
run";
- "--dump-pod", Arg.Unit dump_pod, " Dump POD
(internal)";
- "--dump-pod-options", Arg.Unit dump_pod_options, " Dump POD
for options (internal)";
- "--enable", Arg.String set_enable, "operations Enable
specific operations";
- "--format", Arg.Set_string format, "format Set format
(default: auto)";
- "--list-operations", Arg.Unit list_operations, " List
supported operations";
- "-q", Arg.Set quiet, " Don't print
log messages";
- "--quiet", Arg.Set quiet, " Don't print
log messages";
- "--selinux-relabel", Arg.Unit force_selinux_relabel, " Force
SELinux relabel";
- "--no-selinux-relabel", Arg.Unit no_force_selinux_relabel, "
Never do SELinux relabel";
- "-v", Arg.Set verbose, " Enable debugging
messages";
- "--verbose", Arg.Set verbose, " Enable debugging
messages";
- "-V", Arg.Unit display_version, " Display version
and exit";
- "--version", Arg.Unit display_version, " Display version
and exit";
- "-x", Arg.Set trace, " Enable tracing of
libguestfs calls";
+ "-a", Arg.String add_file, s_"file" ^
" " ^ s_"Add disk image file";
+ "--add", Arg.String add_file, s_"file" ^
" " ^ s_"Add disk image file";
+ "-c", Arg.Set_string libvirturi, s_"uri" ^
" " ^ s_"Set libvirt URI";
+ "--connect", Arg.Set_string libvirturi, s_"uri" ^
" " ^ s_"Set libvirt URI";
+ "--debug-gc", Arg.Set debug_gc, " " ^
s_"Debug GC and memory allocations (internal)";
+ "-d", Arg.String set_domain, s_"domain" ^
" " ^ s_"Set libvirt guest name";
+ "--domain", Arg.String set_domain, s_"domain" ^
" " ^ s_"Set libvirt guest name";
+ "-n", Arg.Set dryrun, " " ^
s_"Perform a dry run";
+ "--dryrun", Arg.Set dryrun, " " ^
s_"Perform a dry run";
+ "--dry-run", Arg.Set dryrun, " " ^
s_"Perform a dry run";
+ "--dump-pod", Arg.Unit dump_pod, " " ^
s_"Dump POD (internal)";
+ "--dump-pod-options", Arg.Unit dump_pod_options, " " ^
s_"Dump POD for options (internal)";
+ "--enable", Arg.String set_enable, s_"operations"
^ " " ^ s_"Enable specific operations";
+ "--format", Arg.Set_string format, s_"format" ^
" " ^ s_"Set format (default: auto)";
+ "--list-operations", Arg.Unit list_operations, " " ^
s_"List supported operations";
+ "-q", Arg.Set quiet, " " ^
s_"Don't print log messages";
+ "--quiet", Arg.Set quiet, " " ^
s_"Don't print log messages";
+ "--selinux-relabel", Arg.Unit force_selinux_relabel, "
" ^ s_"Force SELinux relabel";
+ "--no-selinux-relabel", Arg.Unit no_force_selinux_relabel, "
" ^ s_"Never do SELinux relabel";
+ "-v", Arg.Set verbose, " " ^
s_"Enable debugging messages";
+ "--verbose", Arg.Set verbose, " " ^
s_"Enable debugging messages";
+ "-V", Arg.Unit display_version, " " ^
s_"Display version and exit";
+ "--version", Arg.Unit display_version, " " ^
s_"Display version and exit";
+ "-x", Arg.Set trace, " " ^
s_"Enable tracing of libguestfs calls";
] in
let args = basic_args @ Sysprep_operation.extra_args () in
let args List.sort (fun (a,_,_) (b,_,_) -> compare_command_line_args
a b) args in
let argspec = Arg.align args in
- let anon_fun _ = raise (Arg.Bad "extra parameter on the command
line") in
+ let anon_fun _ = raise (Arg.Bad (s_"extra parameter on the command
line")) in
let usage_msg - sprintf "\
+ sprintf (f_"\
%s: reset or unconfigure a virtual machine so clones can be made
virt-sysprep [--options] -d domname
@@ -131,7 +134,7 @@ let debug_gc, operations, g, selinux_relabel, quiet
A short summary of the options is given below. For detailed help please
read the man page virt-sysprep(1).
-"
+")
prog in
Arg.parse argspec anon_fun usage_msg;
@@ -142,8 +145,8 @@ read the man page virt-sysprep(1).
let add match files, domain with
| [], None ->
- eprintf "%s: you must give either -a or -d options\n" prog;
- eprintf "Read virt-sysprep(1) man page for further
information.\n";
+ eprintf (f_"%s: you must give either -a or -d options\n") prog;
+ eprintf (f_"Read virt-sysprep(1) man page for further
information.\n");
exit 1
| [], Some dom ->
fun (g : Guestfs.guestfs) readonly ->
@@ -151,8 +154,8 @@ read the man page virt-sysprep(1).
let readonlydisk = "ignore" (* ignore CDs, data drives *) in
ignore (g#add_domain ~readonly ?libvirturi ~allowuuid ~readonlydisk
dom)
| _, Some _ ->
- eprintf "%s: you cannot give -a and -d options together\n"
prog;
- eprintf "Read virt-sysprep(1) man page for further
information.\n";
+ eprintf (f_"%s: you cannot give -a and -d options together\n")
prog;
+ eprintf (f_"Read virt-sysprep(1) man page for further
information.\n");
exit 1
| files, None ->
fun g readonly ->
@@ -172,7 +175,7 @@ read the man page virt-sysprep(1).
let verbose = !verbose in
if not quiet then
- printf "Examining the guest ...\n%!";
+ printf (f_"Examining the guest ...\n%!");
(* Connect to libguestfs. *)
let g = new G.guestfs () in
@@ -187,7 +190,7 @@ let () (* Inspection. *)
match Array.to_list (g#inspect_os ()) with
| [] ->
- eprintf "%s: no operating systems were found in the guest
image\n" prog;
+ eprintf (f_"%s: no operating systems were found in the guest
image\n") prog;
exit 1
| roots ->
List.iter (
@@ -201,7 +204,7 @@ let () List.iter (
fun (mp, dev) ->
try g#mount dev mp
- with Guestfs.Error msg -> eprintf "%s (ignored)\n" msg
+ with Guestfs.Error msg -> eprintf (f_"%s (ignored)\n")
msg
) mps;
(* Perform the operations. *)
diff --git a/sysprep/sysprep_operation.ml b/sysprep/sysprep_operation.ml
index d3a12fe..e22d3a2 100644
--- a/sysprep/sysprep_operation.ml
+++ b/sysprep/sysprep_operation.ml
@@ -20,6 +20,8 @@ open Utils
open Printf
+open Sysprep_gettext.Gettext
+
type flag = [ `Created_files ]
type operation = {
@@ -66,7 +68,7 @@ and check_no_dupes ops List.fold_left (
fun opset op ->
if OperationSet.mem op opset then (
- eprintf "virt-sysprep: duplicate operation name (%s)\n"
op.name;
+ eprintf (f_"virt-sysprep: duplicate operation name (%s)\n")
op.name;
exit 1
);
add_to_set op.name opset
@@ -75,23 +77,24 @@ and check_no_dupes ops and check op let n =
String.length op.name in
if n = 0 then (
- eprintf "virt-sysprep: operation name is an empty string\n";
+ eprintf (f_"virt-sysprep: operation name is an empty string\n");
exit 1;
);
for i = 0 to n-1 do
match String.unsafe_get op.name i with
| 'a'..'z' | 'A'..'Z' |
'0'..'9' | '-' -> ()
| c ->
- eprintf "virt-sysprep: disallowed character (%c) in operation
name\n" c;
+ eprintf (f_"virt-sysprep: disallowed character (%c) in operation
name\n")
+ c;
exit 1
done;
let n = String.length op.heading in
if n = 0 then (
- eprintf "virt-sysprep: operation %s has no heading\n" op.name;
+ eprintf (f_"virt-sysprep: operation %s has no heading\n")
op.name;
exit 1
);
if op.heading.[n-1] = '\n' || op.heading.[n-1] = '.' then (
- eprintf "virt-sysprep: heading for %s must not end with newline or
period\n"
+ eprintf (f_"virt-sysprep: heading for %s must not end with newline or
period\n")
op.name;
exit 1
);
@@ -100,11 +103,12 @@ and check op | Some description ->
let n = String.length description in
if n = 0 then (
- eprintf "virt-sysprep: operation %s has no POD\n" op.name;
+ eprintf (f_"virt-sysprep: operation %s has no POD\n") op.name;
exit 1
);
if description.[n-1] = '\n' then (
- eprintf "virt-sysprep: POD for %s must not end with newline\n"
op.name;
+ eprintf (f_"virt-sysprep: POD for %s must not end with
newline\n")
+ op.name;
exit 1
)
)
diff --git a/sysprep/sysprep_operation_bash_history.ml
b/sysprep/sysprep_operation_bash_history.ml
index dbd6c50..56fd9f3 100644
--- a/sysprep/sysprep_operation_bash_history.ml
+++ b/sysprep/sysprep_operation_bash_history.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -35,10 +36,10 @@ let bash_history_perform g root let bash_history_op = {
name = "bash-history";
enabled_by_default = true;
- heading = "Remove the bash history in the guest";
- pod_description = Some "\
+ heading = s_"Remove the bash history in the guest";
+ pod_description = Some (s_"\
Remove the bash history of user \"root\" and any other users
-who have a C<.bash_history> file in their home directory.";
+who have a C<.bash_history> file in their home directory.");
extra_args = [];
perform = bash_history_perform;
}
diff --git a/sysprep/sysprep_operation_cron_spool.ml
b/sysprep/sysprep_operation_cron_spool.ml
index daa3c68..20f1b20 100644
--- a/sysprep/sysprep_operation_cron_spool.ml
+++ b/sysprep/sysprep_operation_cron_spool.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -27,7 +28,7 @@ let cron_spool_perform g root let cron_spool_op = {
name = "cron-spool";
enabled_by_default = true;
- heading = "Remove user at-jobs and cron-jobs";
+ heading = s_"Remove user at-jobs and cron-jobs";
pod_description = None;
extra_args = [];
perform = cron_spool_perform;
diff --git a/sysprep/sysprep_operation_dhcp_client_state.ml
b/sysprep/sysprep_operation_dhcp_client_state.ml
index 279893d..585424c 100644
--- a/sysprep/sysprep_operation_dhcp_client_state.ml
+++ b/sysprep/sysprep_operation_dhcp_client_state.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -32,7 +33,7 @@ let dhcp_client_state_perform g root let dhcp_client_state_op
= {
name = "dhcp-client-state";
enabled_by_default = true;
- heading = "Remove DHCP client leases";
+ heading = s_"Remove DHCP client leases";
pod_description = None;
extra_args = [];
perform = dhcp_client_state_perform;
diff --git a/sysprep/sysprep_operation_dhcp_server_state.ml
b/sysprep/sysprep_operation_dhcp_server_state.ml
index b28aa69..7629dee 100644
--- a/sysprep/sysprep_operation_dhcp_server_state.ml
+++ b/sysprep/sysprep_operation_dhcp_server_state.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -27,7 +28,7 @@ let dhcp_server_state_perform g root let dhcp_server_state_op
= {
name = "dhcp-server-state";
enabled_by_default = true;
- heading = "Remove DHCP server leases";
+ heading = s_"Remove DHCP server leases";
pod_description = None;
extra_args = [];
perform = dhcp_server_state_perform;
diff --git a/sysprep/sysprep_operation_dovecot_data.ml
b/sysprep/sysprep_operation_dovecot_data.ml
index 65825ba..14cbe8d 100644
--- a/sysprep/sysprep_operation_dovecot_data.ml
+++ b/sysprep/sysprep_operation_dovecot_data.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -34,7 +35,7 @@ let dovecot_data_perform g root let dovecot_data_op = {
name = "dovecot-data";
enabled_by_default = true;
- heading = "Remove Dovecot (mail server) data";
+ heading = s_"Remove Dovecot (mail server) data";
pod_description = None;
extra_args = [];
perform = dovecot_data_perform;
diff --git a/sysprep/sysprep_operation_flag_reconfiguration.ml
b/sysprep/sysprep_operation_flag_reconfiguration.ml
index 755b1d0..0efee02 100644
--- a/sysprep/sysprep_operation_flag_reconfiguration.ml
+++ b/sysprep/sysprep_operation_flag_reconfiguration.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -31,10 +32,10 @@ let flag_reconfiguration g root let flag_reconfiguration_op
= {
name = "flag-reconfiguration";
enabled_by_default = false;
- heading = "Flag the system for reconfiguration";
- pod_description = Some "\
+ heading = s_"Flag the system for reconfiguration";
+ pod_description = Some (s_"\
Note that this may require user intervention when the
-guest is booted.";
+guest is booted.");
extra_args = [];
perform = flag_reconfiguration;
}
diff --git a/sysprep/sysprep_operation_hostname.ml
b/sysprep/sysprep_operation_hostname.ml
index 395691c..f832a18 100644
--- a/sysprep/sysprep_operation_hostname.ml
+++ b/sysprep/sysprep_operation_hostname.ml
@@ -20,6 +20,7 @@ open Printf
open Utils
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -53,16 +54,16 @@ let hostname_perform g root let hostname_op = {
name = "hostname";
enabled_by_default = true;
- heading = "Change the hostname of the guest";
- pod_description = Some "\
+ heading = s_"Change the hostname of the guest";
+ pod_description = Some (s_"\
This operation changes the hostname of the guest to the value
given in the I<--hostname> parameter.
If the I<--hostname> parameter is not given, then the hostname is changed
-to C<localhost.localdomain>.";
+to C<localhost.localdomain>.");
extra_args = [
- ("--hostname", Arg.Set_string hostname, "hostname New
hostname"),
- "\
+ ("--hostname", Arg.Set_string hostname, s_"hostname" ^
" " ^ s_"New hostname"),
+ s_"\
Change the hostname. If not given, defaults to
C<localhost.localdomain>."
];
perform = hostname_perform;
diff --git a/sysprep/sysprep_operation_logfiles.ml
b/sysprep/sysprep_operation_logfiles.ml
index cf72803..aa3c986 100644
--- a/sysprep/sysprep_operation_logfiles.ml
+++ b/sysprep/sysprep_operation_logfiles.ml
@@ -19,6 +19,7 @@
open Printf
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -81,12 +82,12 @@ let logfiles_perform g root let logfiles_op = {
name = "logfiles";
enabled_by_default = true;
- heading = "Remove many log files from the guest";
+ heading = s_"Remove many log files from the guest";
pod_description = Some (
- sprintf "\
+ sprintf (f_"\
On Linux the following files are removed:
-%s" globs_as_pod);
+%s") globs_as_pod);
extra_args = [];
perform = logfiles_perform;
}
diff --git a/sysprep/sysprep_operation_mail_spool.ml
b/sysprep/sysprep_operation_mail_spool.ml
index 25f4272..11dd292 100644
--- a/sysprep/sysprep_operation_mail_spool.ml
+++ b/sysprep/sysprep_operation_mail_spool.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -32,7 +33,7 @@ let mail_spool_perform g root let mail_spool_op = {
name = "mail-spool";
enabled_by_default = true;
- heading = "Remove email from the local mail spool directory";
+ heading = s_"Remove email from the local mail spool directory";
pod_description = None;
extra_args = [];
perform = mail_spool_perform;
diff --git a/sysprep/sysprep_operation_net_hwaddr.ml
b/sysprep/sysprep_operation_net_hwaddr.ml
index 57ca2b9..5277017 100644
--- a/sysprep/sysprep_operation_net_hwaddr.ml
+++ b/sysprep/sysprep_operation_net_hwaddr.ml
@@ -18,6 +18,7 @@
open Utils
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -45,10 +46,10 @@ let net_hwaddr_perform g root let net_hwaddr_op = {
name = "net-hwaddr";
enabled_by_default = true;
- heading = "Remove HWADDR (hard-coded MAC address) configuration";
- pod_description = Some "\
+ heading = s_"Remove HWADDR (hard-coded MAC address) configuration";
+ pod_description = Some (s_"\
For Fedora and Red Hat Enterprise Linux,
-this is removed from C<ifcfg-*> files.";
+this is removed from C<ifcfg-*> files.");
extra_args = [];
perform = net_hwaddr_perform;
}
diff --git a/sysprep/sysprep_operation_package_manager_cache.ml
b/sysprep/sysprep_operation_package_manager_cache.ml
index 80eefa3..957b10d 100644
--- a/sysprep/sysprep_operation_package_manager_cache.ml
+++ b/sysprep/sysprep_operation_package_manager_cache.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -36,7 +37,7 @@ let package_manager_cache_perform g root let
package_manager_cache_op = {
name = "package-manager-cache";
enabled_by_default = true;
- heading = "Remove package manager cache";
+ heading = s_"Remove package manager cache";
pod_description = None;
extra_args = [];
perform = package_manager_cache_perform;
diff --git a/sysprep/sysprep_operation_random_seed.ml
b/sysprep/sysprep_operation_random_seed.ml
index c6e8d85..5fbe9a4 100644
--- a/sysprep/sysprep_operation_random_seed.ml
+++ b/sysprep/sysprep_operation_random_seed.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -46,12 +47,12 @@ let random_seed_perform g root let random_seed_op = {
name = "random-seed";
enabled_by_default = true;
- heading = "Generate random seed for guest";
- pod_description = Some "\
+ heading = s_"Generate random seed for guest";
+ pod_description = Some (s_"\
Write some random bytes from the host into the random seed file of the
guest.
-See L</RANDOM SEED> below.";
+See L</RANDOM SEED> below.");
extra_args = [];
perform = random_seed_perform;
}
diff --git a/sysprep/sysprep_operation_rhn_systemid.ml
b/sysprep/sysprep_operation_rhn_systemid.ml
index 9d9f2f8..c86de7a 100644
--- a/sysprep/sysprep_operation_rhn_systemid.ml
+++ b/sysprep/sysprep_operation_rhn_systemid.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -33,7 +34,7 @@ let rhn_systemid_perform g root let rhn_systemid_op = {
name = "rhn-systemid";
enabled_by_default = true;
- heading = "Remove the RHN system ID";
+ heading = s_"Remove the RHN system ID";
pod_description = None;
extra_args = [];
perform = rhn_systemid_perform;
diff --git a/sysprep/sysprep_operation_samba_db_log.ml
b/sysprep/sysprep_operation_samba_db_log.ml
index a02ba9d..6bd6799 100644
--- a/sysprep/sysprep_operation_samba_db_log.ml
+++ b/sysprep/sysprep_operation_samba_db_log.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -43,7 +44,7 @@ let samba_db_log_perform g root let samba_db_log_op = {
name = "samba-db-log";
enabled_by_default = true;
- heading = "Remove the database and log files of Samba";
+ heading = s_"Remove the database and log files of Samba";
pod_description = None;
extra_args = [];
perform = samba_db_log_perform;
diff --git a/sysprep/sysprep_operation_script.ml
b/sysprep/sysprep_operation_script.ml
index bcbba73..1f33c05 100644
--- a/sysprep/sysprep_operation_script.ml
+++ b/sysprep/sysprep_operation_script.ml
@@ -21,13 +21,14 @@ open Unix
open Utils
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
let scriptdir = ref None
let set_scriptdir dir if !scriptdir <> None then (
- eprintf "virt-sysprep: --scriptdir cannot be used more than
once\n";
+ eprintf (f_"virt-sysprep: --scriptdir cannot be used more than
once\n");
exit 1
);
scriptdir := Some dir
@@ -61,17 +62,17 @@ let rec script_perform (g : Guestfs.guestfs) root
match snd (waitpid [] pid) with
| WEXITED 0 -> true
| WEXITED i ->
- eprintf "virt-sysprep: script: failed (code %d)\n" i;
+ eprintf (f_"virt-sysprep: script: failed (code %d)\n") i;
false
| WSIGNALED i
| WSTOPPED i ->
- eprintf "virt-sysprep: script: killed by signal (%d)\n" i;
+ eprintf (f_"virt-sysprep: script: killed by signal (%d)\n")
i;
false in
(* Remote temporary directory / mountpoint. *)
if cleanup then rmdir scriptdir;
- if not ok then failwith "script failed"
+ if not ok then failwith (s_"script failed")
);
[]
@@ -114,8 +115,8 @@ trap cleanup INT TERM QUIT EXIT ERR\n"
let script_op = {
name = "script";
enabled_by_default = true;
- heading = "Run arbitrary scripts against the guest";
- pod_description = Some "\
+ heading = s_"Run arbitrary scripts against the guest";
+ pod_description = Some (s_"\
The C<script> module lets you run arbitrary shell scripts or programs
against the guest.
@@ -133,10 +134,10 @@ guest's DNS configuration file, but C<rm
/etc/resolv.conf> would
(try to) remove the host's file.
Normally a temporary mount point for the guest is used, but you
-can choose a specific one by using the I<--scriptdir> parameter.";
+can choose a specific one by using the I<--scriptdir> parameter.");
extra_args = [
- ("--scriptdir", Arg.String set_scriptdir, "dir Mount point
on host"),
- "\
+ ("--scriptdir", Arg.String set_scriptdir, s_"dir" ^
" " ^ s_"Mount point on host"),
+ s_"\
The mount point (an empty directory on the host) used when
the C<script> operation is enabled and one or more scripts
are specified using I<--script> parameter(s).
@@ -145,8 +146,8 @@ B<Note:> C<scriptdir> B<must> be an
absolute path.
If I<--scriptdir> is not specified then a temporary mountpoint
will be created.";
- ("--script", Arg.String add_script, "script Script or
program to run on guest"),
- "\
+ ("--script", Arg.String add_script, s_"script" ^ "
" ^ s_"Script or program to run on guest"),
+ s_"\
Run the named C<script> (a shell script or program) against the
guest. The script can be any program on the host. The script's
current directory will be the guest's root directory.
diff --git a/sysprep/sysprep_operation_smolt_uuid.ml
b/sysprep/sysprep_operation_smolt_uuid.ml
index 85e788e..25f7372 100644
--- a/sysprep/sysprep_operation_smolt_uuid.ml
+++ b/sysprep/sysprep_operation_smolt_uuid.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -37,7 +38,7 @@ let smolt_uuid_perform g root let smolt_uuid_op = {
name = "smolt-uuid";
enabled_by_default = true;
- heading = "Remove the Smolt hardware UUID";
+ heading = s_"Remove the Smolt hardware UUID";
pod_description = None;
extra_args = [];
perform = smolt_uuid_perform;
diff --git a/sysprep/sysprep_operation_ssh_hostkeys.ml
b/sysprep/sysprep_operation_ssh_hostkeys.ml
index db45b44..62ea32e 100644
--- a/sysprep/sysprep_operation_ssh_hostkeys.ml
+++ b/sysprep/sysprep_operation_ssh_hostkeys.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -32,8 +33,8 @@ let ssh_hostkeys_perform g root let ssh_hostkeys_op = {
name = "ssh-hostkeys";
enabled_by_default = true;
- heading = "Remove the SSH host keys in the guest";
- pod_description = Some "\
+ heading = s_"Remove the SSH host keys in the guest";
+ pod_description = Some (s_"\
The SSH host keys are regenerated (differently) next time the guest is
booted.
@@ -43,7 +44,7 @@ you a stark warning about the host key changing:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!";
+ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!");
extra_args = [];
perform = ssh_hostkeys_perform;
}
diff --git a/sysprep/sysprep_operation_ssh_userdir.ml
b/sysprep/sysprep_operation_ssh_userdir.ml
index 9ea1017..3141c9e 100644
--- a/sysprep/sysprep_operation_ssh_userdir.ml
+++ b/sysprep/sysprep_operation_ssh_userdir.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -35,10 +36,10 @@ let ssh_userdir_perform g root let ssh_userdir_op = {
name = "ssh-userdir";
enabled_by_default = true;
- heading = "Remove \".ssh\" directories in the guest";
- pod_description = Some "\
+ heading = s_"Remove \".ssh\" directories in the guest";
+ pod_description = Some (s_"\
Remove the C<.ssh> directory of user \"root\" and any other
-users who have a C<.ssh> directory in their home directory.";
+users who have a C<.ssh> directory in their home directory.");
extra_args = [];
perform = ssh_userdir_perform;
}
diff --git a/sysprep/sysprep_operation_sssd_db_log.ml
b/sysprep/sysprep_operation_sssd_db_log.ml
index 79e6950..8b1923a 100644
--- a/sysprep/sysprep_operation_sssd_db_log.ml
+++ b/sysprep/sysprep_operation_sssd_db_log.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -41,7 +42,7 @@ let sssd_db_log_perform g root let sssd_db_log_op = {
name = "sssd-db-log";
enabled_by_default = true;
- heading = "Remove the database and log files of sssd";
+ heading = s_"Remove the database and log files of sssd";
pod_description = None;
extra_args = [];
perform = sssd_db_log_perform;
diff --git a/sysprep/sysprep_operation_udev_persistent_net.ml
b/sysprep/sysprep_operation_udev_persistent_net.ml
index 95133d1..6de2589 100644
--- a/sysprep/sysprep_operation_udev_persistent_net.ml
+++ b/sysprep/sysprep_operation_udev_persistent_net.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -32,15 +33,15 @@ let udev_persistent_net_perform g root let
udev_persistent_net_op = {
name = "udev-persistent-net";
enabled_by_default = true;
- heading = "Remove udev persistent net rules";
- pod_description = Some "\
+ heading = s_"Remove udev persistent net rules";
+ pod_description = Some (s_"\
Remove udev persistent net rules which map the guest's existing MAC
address to a fixed ethernet device (eg. eth0).
After a guest is cloned, the MAC address usually changes. Since the
old MAC address occupies the old name (eg. eth0), this means the fresh
MAC address is assigned to a new name (eg. eth1) and this is usually
-undesirable. Erasing the udev persistent net rules avoids this.";
+undesirable. Erasing the udev persistent net rules avoids this.");
extra_args = [];
perform = udev_persistent_net_perform;
}
diff --git a/sysprep/sysprep_operation_user_account.ml
b/sysprep/sysprep_operation_user_account.ml
index 6375705..02201eb 100644
--- a/sysprep/sysprep_operation_user_account.ml
+++ b/sysprep/sysprep_operation_user_account.ml
@@ -18,9 +18,11 @@
open Printf
-open Sysprep_operation
open Utils
+open Sysprep_operation
+open Sysprep_gettext.Gettext
+
module G = Guestfs
let user_account_perform g root @@ -59,10 +61,10 @@ let user_account_perform g
root let user_account_op = {
name = "user-account";
enabled_by_default = false;
- heading = "Remove the user accounts in the guest";
- pod_description = Some "\
+ heading = s_"Remove the user accounts in the guest";
+ pod_description = Some (s_"\
Remove all the user accounts and their home directories.
-The \"root\" account is not removed.";
+The \"root\" account is not removed.");
extra_args = [];
perform = user_account_perform;
}
diff --git a/sysprep/sysprep_operation_utmp.ml
b/sysprep/sysprep_operation_utmp.ml
index cdcf01f..c4a548d 100644
--- a/sysprep/sysprep_operation_utmp.ml
+++ b/sysprep/sysprep_operation_utmp.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -31,11 +32,11 @@ let utmp_perform g root let utmp_op = {
name = "utmp";
enabled_by_default = true;
- heading = "Remove the utmp file";
- pod_description = Some "\
+ heading = s_"Remove the utmp file";
+ pod_description = Some (s_"\
This file records who is currently logged in on a machine. In modern
Linux distros it is stored in a ramdisk and hence not part of the
-virtual machine's disk, but it was stored on disk in older distros.";
+virtual machine's disk, but it was stored on disk in older distros.");
extra_args = [];
perform = utmp_perform;
}
diff --git a/sysprep/sysprep_operation_yum_uuid.ml
b/sysprep/sysprep_operation_yum_uuid.ml
index cc5fec1..ec69ca5 100644
--- a/sysprep/sysprep_operation_yum_uuid.ml
+++ b/sysprep/sysprep_operation_yum_uuid.ml
@@ -17,6 +17,7 @@
*)
open Sysprep_operation
+open Sysprep_gettext.Gettext
module G = Guestfs
@@ -31,10 +32,10 @@ let yum_uuid_perform g root let yum_uuid_op = {
name = "yum-uuid";
enabled_by_default = true;
- heading = "Remove the yum UUID";
- pod_description = Some "\
+ heading = s_"Remove the yum UUID";
+ pod_description = Some (s_"\
Yum creates a fresh UUID the next time it runs when it notices that the
-original UUID has been erased.";
+original UUID has been erased.");
extra_args = [];
perform = yum_uuid_perform;
}
--
1.7.10
[This email is either empty or too large to be displayed at this time]
Daniel P. Berrange
2012-Apr-30 18:43 UTC
[Libguestfs] [PATCH 0/4 v1] Remove gettextify, implement OCaml gettext.
On Mon, Apr 30, 2012 at 07:00:52PM +0100, Richard W.M. Jones wrote:> Version 1 of the patch, for discussion, but not to be applied. It > does work, but needs a lot more testing. > > This removes all the psychopathic gettextify cruft, and replaces it > with a 99 line Makefile.am. A large win, I think.That change came out very nicely indeed. I'm somewhat inclined to kill this gettext awfulness from all the things I maintain in favour of this approach. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
Reasonably Related Threads
- [PATCH 0/4] Add customization capabilities to virt-sysprep
- [PATCH 00/67] Proposed patches for libguestfs 1.22.6.
- [PATCH 1/2] sysprep: remove the auto generated abrt data
- [PATCH] sysprep: remove hostname from ifcfg-*
- [PATCH 1/2] sysprep: remove ca certificates in the guest