[Top][All Lists]
[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
- Re: Question regarding an error with msgfmt,
Bruno Haible <=