Start · Sprachen · PHP · Referenz · dcngettext

dcngettext

Funktion

Gibt die übersetzte Pluralform einer Zeichenkette aus einem bestimmten Textdomain und einer Locale-Kategorie zurück.

seit PHP 4.2.0 Kategorie: string

Signatur

dcngettext(string $domain, string $singular, string $plural, int $count, int $category): string

Beschreibung

dcngettext() ist die Plural-Variante von dcgettext() und kombiniert die Funktionalität von dngettext() (domainspezifische Pluralübersetzung) mit der Möglichkeit, eine bestimmte Locale-Kategorie anzugeben. Sie sucht in der angegebenen Textdomain nach der passenden Übersetzung und wählt dabei anhand von $count entweder die Singular- oder Pluralform aus.

Die Funktion ist Teil der GNU gettext-Internationalisierungsbibliothek (i18n). Sie ermöglicht es, Anwendungen mehrsprachig zu gestalten, indem Übersetzungen aus .mo-Dateien geladen werden. Der Parameter $category bestimmt, welcher Aspekt der Locale verwendet wird – in der Regel LC_MESSAGES.

Wird keine passende Übersetzung gefunden (z. B. weil die Locale nicht gesetzt oder die .mo-Datei nicht vorhanden ist), gibt die Funktion automatisch $singular zurück, wenn $count gleich 1 ist, andernfalls $plural. Dies stellt einen sinnvollen Fallback im Quelltext sicher.

Typische Anwendungsfälle sind mehrsprachige Webanwendungen oder CLI-Tools, bei denen klar zwischen Singular- und Pluralformen unterschieden werden muss und gleichzeitig verschiedene Locale-Kategorien relevant sind.

Parameter

Name Typ Default Beschreibung
$domain Pflicht string Der Name der Textdomain, in der nach der Übersetzung gesucht wird. Entspricht dem Dateinamen der .mo-Datei ohne Erweiterung.
$singular Pflicht string Die Zeichenkette im Singular (Einzahl), die übersetzt werden soll. Wird auch als Fallback zurückgegeben, wenn $count === 1 und keine Übersetzung gefunden wurde.
$plural Pflicht string Die Zeichenkette im Plural (Mehrzahl), die übersetzt werden soll. Wird als Fallback zurückgegeben, wenn $count !== 1 und keine Übersetzung gefunden wurde.
$count Pflicht int Die Anzahl, anhand derer entschieden wird, ob Singular oder Plural verwendet wird. Bei 1 wird die Singularform gewählt.
$category Pflicht int Die Locale-Kategorie als Integer-Konstante, z. B. LC_MESSAGES, LC_MONETARY oder LC_TIME. Bestimmt, welcher Bereich der aktuellen Locale verwendet wird.

Rückgabewert

Typ
string
Beschreibung
Gibt die übersetzte Pluralform der Zeichenkette zurück. Wird keine Übersetzung gefunden, wird $singular (bei $count === 1) oder $plural (bei $count !== 1) zurückgegeben.

Beispiele

Einfache Pluralübersetzung mit bestimmter Domain und Kategorie

<?php
// Locale und Textdomain einrichten
putenv('LANG=de_DE.UTF-8');
setlocale(LC_MESSAGES, 'de_DE.UTF-8');
bindtextdomain('meine_app', '/var/www/locales');
bind_textdomain_codeset('meine_app', 'UTF-8');

$count = 3;
$text = dcngettext('meine_app', '%d Nachricht', '%d Nachrichten', $count, LC_MESSAGES);
echo sprintf($text, $count);
// Ausgabe (wenn Übersetzung vorhanden): "3 Nachrichten"
3 Nachrichten

Fallback ohne verfügbare Übersetzungsdatei

<?php
// Keine .mo-Datei vorhanden – Fallback auf Original-Strings
putenv('LANG=de_DE.UTF-8');
setlocale(LC_MESSAGES, 'de_DE.UTF-8');
bindtextdomain('nicht_vorhanden', '/tmp/locales');

$count = 1;
$text = dcngettext('nicht_vorhanden', '%d item', '%d items', $count, LC_MESSAGES);
echo sprintf($text, $count) . PHP_EOL;

$count = 5;
$text = dcngettext('nicht_vorhanden', '%d item', '%d items', $count, LC_MESSAGES);
echo sprintf($text, $count) . PHP_EOL;
1 item 5 items

// Wichtig · Fallstricke

Voraussetzung: Die GNU-gettext-Erweiterung muss in PHP kompiliert oder als shared extension geladen sein (extension=gettext). Ohne diese Erweiterung steht dcngettext() nicht zur Verfügung.

Die Locale muss auf dem System installiert sein (z. B. mit locale-gen de_DE.UTF-8 unter Debian/Ubuntu), sonst hat setlocale() keinen Effekt und Übersetzungen werden nicht geladen.

Für die meisten Anwendungsfälle reicht ngettext() oder dngettext() aus. dcngettext() ist nur dann notwendig, wenn bewusst eine von LC_MESSAGES abweichende Locale-Kategorie angegeben werden soll.

Die Funktion ist nicht threadsicher, wenn Locale-Einstellungen global verändert werden. In Umgebungen mit mehreren gleichzeitigen Anfragen (z. B. PHP-FPM) sollte die Locale-Verwaltung sorgfältig geplant werden.