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