On Sat, Dec 21, 2024 at 06:59:01PM +0000, Gavin Smith wrote:
> On Mon, Dec 16, 2024 at 11:31:31PM +0100, Patrice Dumas wrote:
> > Hello,
> >
> > I tested GNU Texinfo on Alpine Linux, which uses musl and not glibc in
> > cfarm94.cfarm.net. Tests with translations of strings in output in C
> > fail, most probably because musl libintl does not use LANGUAGE to set
> > the locale. In that case, setting the configure
> > --enable-xs-perl-libintl flag fixes the tests and the build. Should
> > that situation be documented in the manual?
>
> Can you point me to any documentation about the behavour of
> musl gettext and its treatment of LANGUAGE?
I did not find documentation, but I looked a bit at the code and tried
to use gdb to find where it was in the code. But, mainly I used strace
and it showed the LANGUAGE was not honoured.
> Note I had to unset LC_ALL with "unsetenv", as LC_ALL takes priority
> over LANG and LC_MESSAGES (unlike the unsupported LANGUAGE).
> (Setting LC_ALL to "" in the environment had the same effect.)
>
> Whereas at least 4 tests, including
> test_scripts/formatting_documentlanguage_cmdline.sh didn't pass
> under tp/tests (tp/t tests were disabled), now I was able to get
> all tests to pass by adding lines to tp/Texinfo/XS/main/translations.c:
I do not like the idea of resetting or unsetting LC_ALL, as when it is
reset, the specific locale categories informations are lost, but we
already reset LC_ALL, so we already have this issue.
> diff --git a/tp/Texinfo/XS/main/translations.c
> b/tp/Texinfo/XS/main/translations.c
> index 4a904e1fff..0bcaf6d46f 100644
> --- a/tp/Texinfo/XS/main/translations.c
> +++ b/tp/Texinfo/XS/main/translations.c
> @@ -310,6 +310,20 @@ translate_string (const char *string, const char
> *in_lang,
> language_locales.text, string, strerror (errno));
> }
>
> +#ifndef _WIN32
> + if (setenv ("LC_MESSAGES", language_locales.text, 1) != 0
> + || unsetenv ("LC_ALL") != 0)
> + {
> + fprintf (stderr,
> + "translate_string: setenv `%s' error for string `%s': %s\n",
> + language_locales.text, string, strerror (errno));
> + }
> + else
> + {
> + char *cur = setlocale (LC_MESSAGES, "");
> + }
> +#endif
> +
> /* pgettext only works with string litterals, so use pgettext_expr */
> if (translation_context)
> translated_string = strdup (pgettext_expr (translation_context, string));
>
> I then checked that this worked well on my own machine, which it did.
>
> Then the call to switch_messages_locale is not actually needed as LC_MESSAGES
> is set. This means we don't have to go looking for a working LC_ALL
> setting.
>
> Any thoughts if we should adopt this approach for Alpine Linux and musl
> and even by default?
If the documentlanguage is fr_FR, we set LANGUAGE=fr_FR:fr. I guess
that this would not work with LC_MESSAGES. We could use LC_MESSAGES
on musl but still use LANGUAGE on other platforms for that feature?
--
Pat