Re: In coreutil 9.11, translations are not displayed in locales other than English

Paul Eggert <[email protected]>
Newsgroups gmane.comp.lib.gnulib.bugs
Organization UCLA Computer Science Department
Message-ID <[email protected]>
On 2026-08-25 12:08, Bruno Haible wrote:
> I disagree with this one. Many packages invoke 'textdomain (PACKAGE)'
> unconditionally; therefore the unit test ought to do the same thing.
> If !ENABLE_NLS, this is supposed to expand to a no-op.

Thanks, good point. Looks like my recent change to lib/gettext.h is at fault: it sometimes doesn't define textdomain. I installed the attached to fix this, and to document the need to define textdomain.
0001-gettext-h-always-define-textdomain.patch (text/x-patch, 6.4 KB)
From a9fa6005211d9d8a9ac7afaf4c45760ea186b032 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Tue, 25 Aug 2026 13:26:06 -0700
Subject: [PATCH] gettext-h: always define textdomain

Problem reported by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2026-08/msg00288.html
* lib/gettext.h (textdomain, bindtextdomain, bind_textdomain_codeset)
[!ENABLE_NLS && __GNUC__ && !__clang__ && !__cplusplus]:
Define to no-ops in this case too.
Move the definition of _LIBGETTEXT_FUNCAST up one level of
ifdeffery so that it is defined for this case.
* tests/test-gettext-h.c (main) [!ENABLE_NLS]: Call textdomain,
reverting the previous change to this file.
---
 ChangeLog                                     | 11 +++++
 .../bind_textdomain_codeset.texi              |  4 ++
 doc/posix-functions/bindtextdomain.texi       |  4 ++
 doc/posix-functions/textdomain.texi           |  4 ++
 lib/gettext.h                                 | 40 +++++++++----------
 tests/test-gettext-h.c                        |  2 -
 6 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2fbe7488ec..2eb0f5f952 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2026-08-25  Paul Eggert  <[email protected]>
 
+	gettext-h: always define textdomain
+	Problem reported by Bruno Haible in:
+	https://lists.gnu.org/r/bug-gnulib/2026-08/msg00288.html
+	* lib/gettext.h (textdomain, bindtextdomain, bind_textdomain_codeset)
+	[!ENABLE_NLS && __GNUC__ && !__clang__ && !__cplusplus]:
+	Define to no-ops in this case too.
+	Move the definition of _LIBGETTEXT_FUNCAST up one level of
+	ifdeffery so that it is defined for this case.
+	* tests/test-gettext-h.c (main) [!ENABLE_NLS]: Call textdomain,
+	reverting the previous change to this file.
+
 	getaddrinfo: getaddrinfo.c doesn’t need gettext.h
 	* lib/getaddrinfo.c: Don’t include gettext.h.
 	(_, N_): Remove; unused.
diff --git a/doc/posix-functions/bind_textdomain_codeset.texi b/doc/posix-functions/bind_textdomain_codeset.texi
index b9dba7e76b..4d92622b67 100644
--- a/doc/posix-functions/bind_textdomain_codeset.texi
+++ b/doc/posix-functions/bind_textdomain_codeset.texi
@@ -28,4 +28,8 @@ Portability problems not fixed by Gnulib:
 @item
 This function is missing on some platforms:
 macOS 14, FreeBSD 14.0, OpenBSD 7.9, Minix 3.1.8, HP-UX 11, Cygwin 2.9, mingw, MSVC 14, Android 9.0.
+
+The @code{gettext-h} module has a partial workaround:
+@code{<gettext.h>} supplies the function,
+and makes it a no-op if internationalization is not in use.
 @end itemize
diff --git a/doc/posix-functions/bindtextdomain.texi b/doc/posix-functions/bindtextdomain.texi
index 44018ca7e1..4529080fef 100644
--- a/doc/posix-functions/bindtextdomain.texi
+++ b/doc/posix-functions/bindtextdomain.texi
@@ -28,4 +28,8 @@ Portability problems not fixed by Gnulib:
 @item
 This function is missing on some platforms:
 macOS 14, FreeBSD 14.0, OpenBSD 7.9, Minix 3.1.8, HP-UX 11, Cygwin 2.9, mingw, MSVC 14, Android 9.0.
+
+The @code{gettext-h} module has a partial workaround:
+@code{<gettext.h>} supplies the function,
+and makes it a no-op if internationalization is not in use.
 @end itemize
diff --git a/doc/posix-functions/textdomain.texi b/doc/posix-functions/textdomain.texi
index 6d2a620c2d..27c5df2d9e 100644
--- a/doc/posix-functions/textdomain.texi
+++ b/doc/posix-functions/textdomain.texi
@@ -28,4 +28,8 @@ Portability problems not fixed by Gnulib:
 @item
 This function is missing on some platforms:
 macOS 14, FreeBSD 14.0, OpenBSD 7.9, Minix 3.1.8, HP-UX 11, Cygwin 2.9, mingw, MSVC 14, Android 9.0.
+
+The @code{gettext-h} module has a partial workaround:
+@code{<gettext.h>} supplies the function,
+and makes it a no-op if internationalization is not in use.
 @end itemize
diff --git a/lib/gettext.h b/lib/gettext.h
index d404c0c649..521d69e6b0 100644
--- a/lib/gettext.h
+++ b/lib/gettext.h
@@ -59,6 +59,15 @@
 #  endif
 # endif
 
+/* Like the C cast ((type) (expr)), but do only conversions that an
+   ordinary assignment would do.  This can diagnose invalid arguments
+   better than a cast would.  */
+#  ifdef __cplusplus
+#   define _LIBGETTEXT_FUNCAST(type, expr) static_cast <type> (expr)
+#  else
+#   define _LIBGETTEXT_FUNCAST(type, expr) (type) {(expr)}
+#  endif
+
 /* Disabled NLS.  */
 /* When gcc is used with option -Wformat=2, we need to silence
    "warning: format not a string literal, argument types not checked [-Wformat-nonliteral]"
@@ -173,15 +182,6 @@ dcgettext (const char *domain, const char *msgid, int category)
 
 # else
 
-/* Like the C cast ((type) (expr)), but do only conversions that an
-   ordinary assignment would do.  This can diagnose invalid arguments
-   better than a cast would.  */
-#   ifdef __cplusplus
-#    define _LIBGETTEXT_FUNCAST(type, expr) static_cast <type> (expr)
-#   else
-#    define _LIBGETTEXT_FUNCAST(type, expr) (type) {(expr)}
-#   endif
-
 #  undef gettext
 #  define gettext(Msgid) _LIBGETTEXT_FUNCAST (const char *, Msgid)
 #  undef dgettext
@@ -206,18 +206,18 @@ dcgettext (const char *domain, const char *msgid, int category)
 #  define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
      ((void) _LIBGETTEXT_FUNCAST (int, Category), \
       dngettext (Domainname, Msgid1, Msgid2, N))
-#  undef textdomain
-#  define textdomain(Domainname) _LIBGETTEXT_FUNCAST (const char *, Domainname)
-#  undef bindtextdomain
-#  define bindtextdomain(Domainname, Dirname) \
-     ((void) _LIBGETTEXT_FUNCAST (const char *, Domainname), \
-      _LIBGETTEXT_FUNCAST (const char *, Dirname))
-#  undef bind_textdomain_codeset
-#  define bind_textdomain_codeset(Domainname, Codeset) \
-     ((void) _LIBGETTEXT_FUNCAT (const char *, Domainname), \
-      _LIBGETTEXT_FUNCAT (const char *, Codeset))
-
 # endif
+
+# undef textdomain
+# define textdomain(Domainname) _LIBGETTEXT_FUNCAST (const char *, Domainname)
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+    ((void) _LIBGETTEXT_FUNCAST (const char *, Domainname), \
+     _LIBGETTEXT_FUNCAST (const char *, Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+    ((void) _LIBGETTEXT_FUNCAT (const char *, Domainname), \
+     _LIBGETTEXT_FUNCAT (const char *, Codeset))
 #endif
 
 
diff --git a/tests/test-gettext-h.c b/tests/test-gettext-h.c
index fa0a795c31..c6ad35cd65 100644
--- a/tests/test-gettext-h.c
+++ b/tests/test-gettext-h.c
@@ -27,9 +27,7 @@ main (void)
 {
   const char *s;
 
-#if ENABLE_NLS
   textdomain ("tzlof");
-#endif
 
   s = gettext ("some text");
   if (!streq (s, "some text"))
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.