+2025-09-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ gettext-h: support overriding "gnulib"
+ This is for GNU Diffutils, which is still using the old way
+ of also translating Gnulib’s msgids.
+ * lib/gettext.h (GNULIB_TEXT_DOMAIN): New macro.
+ * lib/argmatch.c, lib/bitset/stats.c, lib/c-stack.c:
+ * lib/clean-temp-simple.c, lib/clean-temp-simple.c, lib/clean-temp.c:
+ * lib/closein.c, lib/closeout.c, lib/copy-acl.c, lib/copy-file.c:
+ * lib/csharpcomp.c, lib/csharpexec.c, lib/cygpath.c, lib/dfa.c:
+ * lib/error.c, lib/execute.c, lib/gai_strerror.c, lib/getaddrinfo.c:
+ * lib/getopt.c, lib/javacomp.c, lib/javaexec.c, lib/javaversion.c:
+ * lib/mkdir-p.c, lib/obstack.c, lib/openat-die.c, lib/os2-spawn.c:
+ * lib/pagealign_alloc.c, lib/parse-datetime.y, lib/pipe-filter-gi.c:
+ * lib/pipe-filter-ii.c, lib/quotearg.c, lib/rpmatch.c, lib/set-acl.c:
+ * lib/sigpipe-die.c, lib/spawn-pipe.c, lib/strsignal.c, lib/timevar.c:
+ * lib/unicodeio.c, lib/userspec.c, lib/vc-mtime.c, lib/version-etc.c:
+ * lib/wait-process.c, lib/windows-cygpath.c, lib/xalloc-die.c:
+ * lib/xbinary-io.c, lib/xfreopen.c, lib/xmemcoll.c, lib/xprintf.c:
+ * lib/xsetenv.c, lib/xstdopen.c, lib/xstrerror.c, lib/xstrtol-error.c:
+ (_): Use GNULIB_TEXT_DOMAIN instead of "gnulib" when calling dgettext.
+ * lib/argmatch.h (ARGMATCH_DEFINE_GROUP):
+ * lib/file-type.c (file_type):
+ * lib/regex_internal.h (gettext) [HAVE_LIBINTL_H & ENABLE_NLS & !_LIBC]:
+ * lib/xstrtol-error.c (xstrtol_error):
+ Likewise.
+
2025-09-09 Bruno Haible <bruno@clisp.org>
Remove support for OSF/1.
this POT file to the Translation Project, translators will normally fill
in the translations of the Gnulib strings from their ``translation
memory'', and send you back updated PO files.
+For this to work, your program should define the macro
+@code{GNULIB_TEXT_DOMAIN} to its own textdomain name early,
+before including @file{gettext.h};
+you can do this by putting @code{AC_DEFINE([GNULIB_TEXT_DOMAIN], [PACKAGE])}
+in your @file{configure.ac}.
However, this process is error-prone: you might forget to list some
source files, or the translator might not be using a translation memory
#include <stdlib.h>
#include <string.h>
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include <error.h>
#include "quotearg.h"
\
/* Try to put synonyms on the same line. Synonyms are expected \
to follow each other. */ \
- fputs (dgettext ("gnulib", "Valid arguments are:"), out); \
+ fputs (dgettext (GNULIB_TEXT_DOMAIN, "Valid arguments are:"), out); \
for (int i = 0; g->args[i].arg; i++) \
if (i == 0 \
|| memcmp (&g->args[i-1].val, &g->args[i].val, size)) \
#include <string.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "bitset/array.h"
#include "bitset/base.h"
#include "ignore-value.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Here we need the original abort() function. (Printing a stack trace
from within a signal handler is not going to work in most cases anyway.) */
#include "hashkey-string.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Lock that protects the file_cleanup_list from concurrent modification in
# include "stdio--.h"
#endif
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* GNU Hurd doesn't have PATH_MAX. Use a fallback.
Temporary directory names are usually not that long. */
#include <unistd.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "close-stream.h"
#include "closeout.h"
#include <unistd.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "close-stream.h"
#include <error.h>
#include "quote.h"
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Copy access control lists from one file to another. If SOURCE_DESC is
#include "quote.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
enum { IO_SIZE = 32 * 1024 };
#include "xvasprintf.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Survey of C# compilers.
#undef new_classpath
#undef CLASSPATHVAR
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Survey of CIL interpreters.
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#ifdef __CYGWIN__
#include "localeinfo.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#if GAWK
/* Use ISO C 99 API. */
#if !_LIBC && ENABLE_NLS
# include "gettext.h"
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#endif
#ifdef _LIBC
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Choice of implementation for native Windows.
char const *
file_type (struct stat const *st)
{
- return dgettext ("gnulib", c_file_type (st));
+ return dgettext (GNULIB_TEXT_DOMAIN, c_file_type (st));
}
# include <libintl.h>
#else
# include "gettext.h"
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
# define N_(msgid) msgid
#endif
#include <stdio.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define N_(msgid) msgid
/* BeOS has AF_INET, but not PF_INET. */
# define funlockfile(fp) _IO_funlockfile (fp)
#else
# include "gettext.h"
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* When used standalone, flockfile and funlockfile might not be
available. */
# if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \
return (n == 1 ? msgid : msgid_plural);
}
+/* The text domainname for Gnulib messages. Ordinarily this is "gnulib",
+ but packages that do their own translations of Gnulib can use
+ something different by defining GNULIB_TEXT_DOMAIN early. */
+#ifndef GNULIB_TEXT_DOMAIN
+# define GNULIB_TEXT_DOMAIN "gnulib"
+#endif
#endif /* _LIBGETTEXT_H */
#include "c-strstr.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Survey of Java compilers.
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Survey of Java virtual machines.
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Get PKGDATADIR. */
#include "configmake.h"
#include <unistd.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "dirchownmod.h"
#include "dirname.h"
# else
# include "gettext.h"
# ifndef _
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
# endif
# endif
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
_Noreturn void
openat_save_fail (int errnum)
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Duplicates a file handle, making the copy uninheritable.
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#if HAVE_MMAP
/* Define MAP_FILE when it isn't otherwise. */
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Bison's skeleton tests _STDLIB_H, while some stdlib.h headers
use _STDLIB_H_ as witness. Map the latter to the one bison uses. */
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "pipe-filter-aux.h"
#include "wait-process.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "pipe-filter-aux.h"
#include <wchar.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define N_(msgid) msgid
#ifndef SIZE_MAX
# define gettext(msgid) \
__dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES)
# else
-# define gettext(msgid) dgettext ("gnulib", msgid)
+# define gettext(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
# endif
#else
# undef gettext
# endif
# include <regex.h>
# include "gettext.h"
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
# define N_(msgid) gettext_noop (msgid)
# if HAVE_LANGINFO_YESEXPR
#include "quote.h"
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Set the access control lists of a file to match *exactly* MODE (this might
remove inherited ACLs). Note chmod() tends to honor inherited/default
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
void
sigpipe_die (void)
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Choice of implementation for native Windows.
# include <libintl.h>
#else /* !_LIBC */
# include "gettext.h"
-# define _(msgid) dgettext ("gnulib", msgid)
+# define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
# define N_(msgid) gettext_noop (msgid)
#endif /* _LIBC */
#include "gethrxtime.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include "xalloc.h"
/* See timevar.h for an explanation of timing variables. */
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define N_(msgid) msgid
#include "localcharset.h"
#include "xstrtol.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define N_(msgid) msgid
#ifndef HAVE_ENDGRENT
#endif
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* ========================================================================== */
#endif
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* If you use AM_INIT_AUTOMAKE's no-define option,
PACKAGE is not defined. Use PACKAGE_TARNAME instead. */
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#if defined _WIN32 && !defined __CYGWIN__
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
void
xalloc_die (void)
#include "verify.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#if O_BINARY
#include "quote.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
void
xfreopen (char const *filename, char const *mode, FILE *fp)
#include <stdlib.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#include <error.h>
#include "exitfail.h"
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
off64_t
xprintf (char const *restrict format, ...)
#include <error.h>
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
/* Set NAME to VALUE in the environment.
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
void
xstdopen (void)
#include "xalloc.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
char *
xstrerror (const char *message, int errnum)
#include "exitfail.h"
#include "gettext.h"
-#define _(msgid) dgettext ("gnulib", msgid)
+#define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid)
#define N_(msgid) msgid
/* Report an error for an invalid integer in an option argument.
else
option = long_options[opt_idx].name;
- error (exit_status, 0, dgettext ("gnulib", msgid), hyphens, option, arg);
+ error (exit_status, 0, dgettext (GNULIB_TEXT_DOMAIN, msgid),
+ hyphens, option, arg);
}
/* Like xstrtol_error, except exit with a failure status. */