Internationalization support and format strings
Bastiaan Veelo
Bastiaan at Veelo.net
Tue Oct 7 11:09:35 UTC 2025
On Friday, 3 October 2025 at 22:53:09 UTC, Bruno Haible wrote:
> On Tuesday, 25 March 2025 at 16:00:09 UTC, Steven Schveighoffer
> wrote:
>> https://code.dlang.org/packages/gettext
>> I would focus on that one for de-facto standardization. Likely
>> it has a small number of users, but would be actively fixed if
>> issues are found.
>
> No, this approach from https://code.dlang.org/packages/gettext
> is not suitable for wide-scale use, due to the following
> misfeatures:
>
> 1) https://dconf.org/2023/slides/veelo.pdf page 77
> explains how to generate repetitive msgids through the use
> of 'foreach' and the 'tr!' template.
```d
foreach (i, where; [tr!"hand", tr!"bush"])
writefln(tr!("One bird in the %1$s",
"%2$d birds in the %1$s")(i + 1), where)
```
It appears to me that you misread that code. This is a
(contrived) example of explicit ordering of placeholders
(https://youtu.be/FYKrXsnzrIM?si=F-MaAh0rWMoa0cj-&t=1534). I fail
to see the generation of repetitive msgids, there are just three
in this example. If you think that looping over translatable
strings is a bad idea then that is fine by me, but it is not a
flaw in the package to support such feature.
> Such generation of msgids is a bad idea for several reasons:
> - Care should be taken to not burden translators with
> unnecessary work. If a programmer does not want to write N
> strings, the translators should not have to translate N strings.
They don't.
> - It is impossible for the programmer to review the msgids
> according to
> https://www.gnu.org/software/gettext/manual/html_node/Preparing-Strings.html in such scenarios.
There are no generated strings. The strings in the code are the
strings to be translated. There is full compliance with the
manual that you reference here.
> - It is impossible for the programmer to attach translator
> comments in such scenarios.
Yes, comments are fully supported, adding them here is trivial.
https://youtu.be/FYKrXsnzrIM?si=YcsCqnohRnzG61ZH&t=1711
> 2) https://github.com/veelo/gettext/blob/main/README.md says
> that they "scan any generated code that may be mixed in". But
> translators are humans and occasionally want to consult the
> actual source code for understanding the context of messages.
> They can't consult code produced by the compiler on-the-fly,
> nor can they consult the generated binary code.
Again, a feature of the package is not a misfeature just because
using it is a bad idea. Code generation is an integral feature of
the language, and this package supports it (and it didn't need to
do anything special for it, it just works due to the approach
taken).
> 3) It mixes library code and build-time add-ons into one file.
> This does not work
> - for internationalized libraries (because they are not an
> executable, that can be subject to "dub run --config=xgettext"),
You can, using conditional compilation.
> - when cross-compiling (because you can't execute the
> just-compiled code during the build process).
It is a separate and different build. You would configure the
xgettext config to be native, then cross-compile to any other
targets. No traces of extraction code appear in non-xgettext
builds.
> 4) It generates non-standard POT files (with function names
> after the line numbers).
Well observed. There is nothing in the standard that disallows
this.
https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files. They are fully supported by the GNU gettext utilities. I think it is a useful feature.
I applaude adding support for D in official GNU software, and I
thank you for the work that you put into it. I am sorry that I
didn't see your post earlier. There are different tradeoffs to
using GNU xgettext and using --config=xgettext. The biggest
downside of the latter is that string extraction takes about as
long as a full build; GNU xgettext is likely much quicker. What
this gets you is platform independence and complete language
coverage without maintenance
(https://youtu.be/FYKrXsnzrIM?si=yFTIrhN5KWSa5uc8&t=2915). Which
is why you haven't seen any updates to
https://code.dlang.org/packages/gettext.
-- Bastiaan.
More information about the Digitalmars-d
mailing list