To the German, Dutch, and Vietnamese translators of e2fsprogs's po
file, --- I've added you to the cc list because Martin von Wittich has
pointed out the following error in your translation files.  Please
read on....

On Tue, Mar 06, 2018 at 01:15:56PM +0100, Martin von Wittich wrote:
> the German localization of the following message:
> some-server ~ # LANG=C e2fsck -f /dev/vg/some-lv
> e2fsck 1.43.4 (31-Jan-2017)
> Pass 1: Checking inodes, blocks, and sizes
> Inode 529618 extent tree (at level 1) could be shorter.  Fix<y>?
> contains uninterpreted escape sequences instead of the actual values:
> some-server ~ # LANG=de_DE.UTF-8 e2fsck -f /dev/vg/some-lv
> e2fsck 1.43.4 (31-Jan-2017)
> Durchgang 1: Inodes, Blöcke und Größen werden geprüft
> Der Erweiterungsbaum von Inode %$i (auf Ebene %$b) könnte kürzer sein.  
> Reparieren<j>?
> If I understand the issue correctly, the translations are attempting to use a
> printf escape that might not be supported by the compiler...? Wikipedia says
> "Parameter field - This is a POSIX extension and not in C99."

Thanks for pointing out the problem.  The issue is that the
translators how they should handle positional ordering issues when
translating e2fsck's message.

This is what is in po/de.po in the e2fsprogs sources:

#. @-expanded: inode %i extent tree (at level %b) could be shorter.  
#: e2fsck/problem.c:1301
msgid "@i %i @x tree (at level %b) could be shorter.  "
msgstr ""
"Der Erweiterungsbaum von Inode %1$i (auf Ebene %2$b) könnte kürzer sein.  "

This is wrong.  It should have simply been:

"Der Erweiterungsbaum von Inode %i (auf Ebene %b) könnte kürzer sein.  "

That's because how e2fsck interprets its own error messages, and it
does its own specialized %-expansion.   From e2fsck/message.c:

 *      %b      <blk>                   block number
 *      %B      <blkcount>              interpret blkcount as blkcount
 *      %c      <blk2>                  block number
 *      %Di     <dirent>->ino           inode number
 *      %Dn     <dirent>->name          string
 *      %Dr     <dirent>->rec_len
 *      %Dl     <dirent>->name_len
 *      %Dt     <dirent>->filetype

etc.  So the translators don't need to play magical games with
positional arguments.  They just need to use %i when they want to
print the inode number from the problem context structure.  And they
can use %p if they want e2fsck to try to take a directory inode number
and turn it into a pathname, and print the pathname.  If there is a
timestamp in the num field in the problem context, %t will print it as
a human-readiable date/time stamp.  Ordering doesn't matter, so the
attempt to use %1$i, %2$b, is Just Wrong.

> The following *.po files might be affected:
> martin@dogmeat ~/Projects/e2fsprogs/po % grep -lP '\d\$' *.po
> cs.po
> de.po
> hu.po
> nl.po
> pl.po
> tr.po
> vi.po
> zh_CN.po

Actually, not all of these are buggy.  Using positional arguments is
the right thing to do for messages that are *not* from
e2fsck/problem.c.  It's only the messages from e2fsck/problem.c which
are use the the %-expansion in e2fsck/message.c.  From examination,
the only other languages that are buggy in this way are the Dutch and
Vietnamese translations.  I've cc'ed their translators above.

Thanks again for pointing this out.


                                                - Ted

Reply via email to