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