PHP Doku:: Pluralversion von gettext - function.ngettext.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzUnterstützung menschlicher Sprache und ZeichenkodierungGettextGettext-Funktionenngettext

Ein Service von Reinhard Neidl - Webprogrammierung.

Gettext-Funktionen

<<gettext

textdomain>>

ngettext

(PHP 4 >= 4.2.0, PHP 5)

ngettextPluralversion von gettext

Beschreibung

string ngettext ( string $msgid1 , string $msgid2 , int $n )

Die Pluralversion von gettext(). Einige Sprachen haben abhängig von der Anzahl mehr als eine Form für den Plural.

Parameter-Liste

msgid1

msgid2

n

Rückgabewerte

Gibt die korrekte Pluralform zurück, die mittels msgid1 und msgid2 für die Anzahl n bestimmt wurde.

Beispiele

Beispiel #1 ngettext()-Beispiel

<?php

setlocale
(LC_ALL'cs_CZ');
printf(ngettext("%d window""%d windows"1), 1); // 1 okno
printf(ngettext("%d window""%d windows"2), 2); // 2 okna
printf(ngettext("%d window""%d windows"5), 5); // 5 oken

?>


7 BenutzerBeiträge:
- Beiträge aktualisieren...
hek at theeks dot net
19.08.2009 20:07
Beware of one difference between the GNU gettext API and the PHP binding of it, which is that the GNU gettext functions that accept a $count parameter all expect (indeed, being compiled C, require) that $count be unsigned, while the PHP binding does not.

Thus, the PHP gettext functions will happily accept negative numbers. The one potentially irritating consequence of this is that -1 is treated as plural, which sits well with some people and not so well with others.  (As a picky native speaker of English, my personal opinion is that both "the temperature is minus one degree Fahrenheit" and "four apples minus five apples leaves minus one apple" but others may feel that "four apples minus five apples leaves minus one apples" sounds better.)

The upshot: You may want to abs($count) before passing numbers to gettext.

Bonus points: If your application includes user preferences, you might offer a "treat -1 as singular" option to your users, then choose $count or abs($count) to pass to gettext based on each user's preference.
peter at ints dot net
14.12.2008 20:26
Example for russian lang:
file.po:
    ...
    "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"
    ...
    msgid "File"
    msgid_plural "Files"
    msgstr[0] "Файл"
    msgstr[1] "Файла"
    msgstr[2] "Файлов"
    ...

file.php
    ...
    echo ngettext("File", "Files", $number);
    ...
stnt at ukr dot net
13.01.2008 9:51
Another ready to use function for russian plural implementation:

<?php
function plural_str ($i, $str1, $str2, $str3){
    function
plural ($a){
        if (
$a%10==1 && $a%100!=11){ return 0; }
        elseif(
$a%10>=2 && $a%10<=4 && ($a%100<10 || $a%100>=20)) { return 1; }
        else {
        return 
2;
        }
    }
   
$plural= plural ($i);
    switch (
$plural) {
        case
0:
           
$out_str = $str1;
            break;
        case
1:
           
$out_str = $str2;
            break;
        default:
$out_str = $str3;
    }
    return
$out_str;
}

//// Usage:
$n = 3;
echo
$n .' '. plural_str($n, 'тетрадь', 'тетради', 'тетрадей');
//// Output: '3 тетради'
?>
kontakt at somplatzki dot de
25.05.2007 11:47
It's useful to know how the .po-file has to look like when using ngettext:

msgid "item"
msgid_plural "items"
msgstr[0] "Produkt"
msgstr[1] "Produkte"

In php:

echo ngettext('item', 'items', $number);
tokul at users dot sourceforge dot net
10.12.2006 12:56
According to GNU gettext manual third argument is unsigned long integer. It must be positive number. If n is negative, it might be evaluated incorrectly in some languages.
nikolai dot zujev at gmail dot com
21.03.2006 22:36
This is an implementation for a word ending in russian lang. Also as I know polish and similar langs use same rules:

<?php
/**
 * Returns:
 *   0, if $n == 1, 21, 31, 41, ...
 *   1, if $n == 2..4, 22..24, 32..34, ...
 *   2, if $n == 5..20, 25..30, 35..40, ...
 */
function plural( $n )
{
    if (
$n % 10 == 1 && $n % 100 != 11 )
    {
        return
0;
    }

    if (
$n % 10 >= 2 && $n % 10 <= 4 && ( $n % 100 < 10 || $n % 100 >= 20 ) )
    {
        return
1;
    }

    return
2;
}

// usage
for ( $i = 0; $i < 100; $i++ )
{
   
$x = plural( $i );

   
printf(
       
"%d тетрад%s<br/>\n", $i,
         (
0 == $x ? 'ь' : ( 1 == $x ? 'и' : 'ей' ) )
    );
}
?>

Output:
0 тетрадей
1 тетрадь
2 тетради
3 тетради
4 тетради
5 тетрадей
6 тетрадей
7 тетрадей
8 тетрадей
9 тетрадей
10 тетрадей
...

Also here is short version:

<?php
$n
= 17;
print (
$n%10==1 && $n%100!=11 ? 0 : ($n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2));
?>

output: 2
mike-php at emerge2 dot com
3.11.2004 21:53
Section 10.2.5 in the GNU gettext manual explains the ngettext function:

http://www.gnu.org/software/gettext/manual/

(Sorry, but the Add Note function prevents me from including a long URL which points right to that section of the manual.)



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)