Please use the ngettext
function for things like this. It
allows you to deal correctly with plurals in English and other
languages, once and for all. You use it like this:
printf(ngettext("%d Comment", "%d Comments", $numComments), $numComments);
The ngettext
function will return the first format string ("%d
Comment"
) if there is just a single comment and the second format
string ("%d Comments"
) if there are more. The printf
function will
then put the number into the string.
This might seem like a lot of work, but it is very powerful: it works
with languages that have more than one plural form(!) -- they
actually exist. The PHP manual gives an example for the word "window"
which becomes "1 okno", "2 okna" and "5 oken" in some exotic
language I don't recognize...
If you are consequent about using ngettext
, then your future users
from far-away countries will be very grateful to you :-)
Edit: As suggested in the comments, there is a single function to
do the above:
function pluralize($num, $singleWord, $pluralWord) {
return printf(ngettext($singleWord, $pluralWord, $num), $num);
}
By default, xgettext
wont recognize this new function, but you can
add it with the --keyword
flag. Given a file test.php
with
echo ngettext("foo", "foos", 1);
echo pluralize(2, "bar", "bars");
you can extract the strings with
xgettext --keyword=pluralize:2,3 test.php
The resulting messages.po
file has entries like these:
#: test.php:7
msgid "foo"
msgid_plural "foos"
msgstr[0] ""
msgstr[1] ""
#: test.php:8
msgid "bar"
msgid_plural "bars"
msgstr[0] ""
msgstr[1] ""
The translator will fill in each plural form and with a correctly
formed "Plural-Forms" line in the message catalog header, you will be
able to support all languages.