bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Question regarding an error with msgfmt


From: Bruno Haible
Subject: Re: Question regarding an error with msgfmt
Date: Sun, 25 Jan 2009 16:12:51 +0100
User-agent: KMail/1.9.9

[CCing bug-gnu-gettext, which is the right list about questions regarding PO 
files]

Yan Kerb wrote:
> In this line, i have :
> <<
> #: src/uptime.c:142
> #, c-format
> msgid "up %ld day %2d:%02d,  "
> msgid_plural "up %ld days %2d:%02d,  "
> msgstr[0] "actif %ld jour %2d:%02d,  "
> msgstr[1] ""
> >>
> 
> Q : What it is for this "msgid_plural"?
> I guess i have to translate both form in msgstr0 & 1.
> 
> 
> For info, i have in the original 'po' file :
> <<
> #: src/uptime.c:142
> #, c-format
> msgid "up %ld day %2d:%02d,  "
> msgid_plural "up %ld days %2d:%02d,  "
> msgstr[0] ""
> msgstr[1] ""
> >>

Indeed, this is not well documented in the GNU gettext manual. I'm adding
this text now:


12.6 Translating plural forms
=============================

   Suppose you are translating a PO file, and it contains an entry like
this:

     #, c-format
     msgid "One file removed"
     msgid_plural "%d files removed"
     msgstr[0] ""
     msgstr[1] ""

What does this mean? How do you fill it in?

   Such an entry denotes a message with plural forms, that is, a
message where the text depends on an cardinal number.  The general form
of the message, in English, is the `msgid_plural' line.  The `msgid'
line is the English singular form, that is, the form for when the
number is equal to 1.  More details about plural forms are explained in
*note Plural forms::.

   The first thing you need to look at is the `Plural-Forms' line in the
header entry of the PO file.  It contains the number of plural forms
and a formula.  If the PO file does not yet have such a line, you have
to add it.  It only depends on the language into which you are
translating.  You can get this info by using the `msginit' command (see
*note Creating::) - it contains a database of known plural formulas -
or by asking other members of your translation team.

   Suppose the line looks as follows:

     "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
     "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

   It's logically one line; recall that the PO file formatting is
allowed to break long lines so that each physical line fits in 80
monospaced columns.

   The value of `nplurals' here tells you that there are three plural
forms.  The first thing you need to do is to ensure that the entry
contains an `msgstr' line for each of the forms:

     #, c-format
     msgid "One file removed"
     msgid_plural "%d files removed"
     msgstr[0] ""
     msgstr[1] ""
     msgstr[2] ""

   Then translate the `msgid_plural' line and fill it in into each
`msgstr' line:

     #, c-format
     msgid "One file removed"
     msgid_plural "%d files removed"
     msgstr[0] "%d slika uklonjenih"
     msgstr[1] "%d slika uklonjenih"
     msgstr[2] "%d slika uklonjenih"

   Now you can refine the translation so that it matches the plural
form.  According to the formula above, `msgstr[0]' is used when the
number ends in 1 but does not end in 11; `msgstr[1]' is used when the
number ends in 2, 3, 4, but not in 12, 13, 14; and `msgstr[2]' is used
in all other cases.  With this knowledge, you can refine the
translations:

     #, c-format
     msgid "One file removed"
     msgid_plural "%d files removed"
     msgstr[0] "%d slika je uklonjena"
     msgstr[1] "%d datoteke uklonjenih"
     msgstr[2] "%d slika uklonjenih"

   You noticed that in the English singular form (`msgid') the number
placeholder could be omitted and replaced by the numeral word "one".
Can you do this in your translation as well?

     msgstr[0] "jednom datotekom je uklonjen"

Well, it depends on whether `msgstr[0]' applies only to the number 1,
or to other numbers as well.  If, according to the plural formula,
`msgstr[0]' applies only to `n == 1', then you can use the specialized
translation without the number placeholder.  In our case, however,
`msgstr[0]' also applies to the numbers 21, 31, 41, etc., and therefore
you cannot omit the placeholder.


Does this answer your question?

Bruno




reply via email to

[Prev in Thread] Current Thread [Next in Thread]