Start · Sprachen · PHP · Referenz · dngettext

dngettext

Funktion

Gibt die übersetzte Pluralform eines Strings aus einer bestimmten Textdomäne zurück.

seit PHP 4.2.0 Kategorie: string

Signatur

dngettext(string $domain, string $singular, string $plural, int $count): string

Beschreibung

dngettext ist die Kombination aus dgettext (domänenspezifische Übersetzung) und ngettext (Pluralauflösung). Die Funktion sucht in der angegebenen Gettext-Domäne nach der passenden Pluralform des Strings und gibt diese zurück – abhängig vom übergebenen Zählwert.

Sie wird im Kontext von Internationalisierung (i18n) und Lokalisierung (l10n) eingesetzt, wenn eine Anwendung mehrere Übersetzungsdomänen verwendet (z. B. separate .mo-Dateien für verschiedene Module) und gleichzeitig grammatikalisch korrekte Pluralformen benötigt. Ohne passende Übersetzung gibt die Funktion den $singular- oder $plural-String zurück, je nachdem ob $count gleich 1 ist oder nicht.

Voraussetzung für die Nutzung ist, dass die Gettext-Erweiterung in PHP aktiviert ist (ext/gettext), die gewünschte Locale mit setlocale() gesetzt wurde und die entsprechenden .mo-Dateien im richtigen Verzeichnis liegen (gebunden mit bindtextdomain()).

Für einfache Pluralübersetzungen ohne Domänenangabe steht ngettext() zur Verfügung; für domänenspezifische Übersetzungen ohne Plural reicht dgettext().

Parameter

Name Typ Default Beschreibung
$domain Pflicht string Name der Gettext-Domäne (entspricht dem Dateinamen der .mo-Datei ohne Endung), in der nach der Übersetzung gesucht wird.
$singular Pflicht string Der Singular-Ausgangsstring, der als Schlüssel in der Übersetzungsdatei genutzt wird und als Fallback zurückgegeben wird, wenn $count === 1 und keine Übersetzung gefunden wurde.
$plural Pflicht string Der Plural-Ausgangsstring, der als Fallback zurückgegeben wird, wenn $count !== 1 und keine Übersetzung gefunden wurde.
$count Pflicht int Der Zählwert, anhand dessen die korrekte Pluralform ermittelt wird. Sprachspezifische Regeln (z. B. für Slavische Sprachen mit mehreren Pluralformen) werden aus den .mo-Metadaten gelesen.

Rückgabewert

Typ
string
Beschreibung
Gibt die übersetzte Pluralform des Strings zurück, sofern eine passende Übersetzung in der angegebenen Domäne vorhanden ist. Anderenfalls wird $singular zurückgegeben, wenn $count === 1, sonst $plural.

Beispiele

Grundlegende Nutzung mit einer eigenen Domäne

<?php
// Locale und Domäne konfigurieren
putenv('LANG=de_DE.UTF-8');
setlocale(LC_ALL, 'de_DE.UTF-8');

// Pfad zur .mo-Datei: /var/www/locales/de_DE/LC_MESSAGES/shop.mo
bindtextdomain('shop', '/var/www/locales');
bind_textdomain_codeset('shop', 'UTF-8');

$anzahl = 3;
// Sucht in der Domäne 'shop' nach der deutschen Pluralform
$text = dngettext('shop', '%d Artikel', '%d Artikel', $anzahl);
echo sprintf($text, $anzahl);
// Ausgabe (wenn Übersetzung vorhanden): z. B. "3 Artikel"
3 Artikel

Fallback ohne vorhandene Übersetzung

<?php
putenv('LANG=de_DE.UTF-8');
setlocale(LC_ALL, 'de_DE.UTF-8');
bindtextdomain('meinmodul', '/var/www/locales');
bind_textdomain_codeset('meinmodul', 'UTF-8');

// Kein passender Eintrag in der .mo-Datei vorhanden
$count = 1;
echo dngettext('meinmodul', 'Eine Nachricht', '%d Nachrichten', $count);
echo "\n";

$count = 5;
echo sprintf(dngettext('meinmodul', 'Eine Nachricht', '%d Nachrichten', $count), $count);
Eine Nachricht 5 Nachrichten

// Wichtig · Fallstricke

Voraussetzungen: Die PHP-Erweiterung ext/gettext muss aktiviert sein. Auf manchen Systemen (insbesondere Windows) ist die Unterstützung eingeschränkt oder erfordert zusätzliche Konfiguration.

Locale-Abhängigkeit: Die Funktion arbeitet nur korrekt, wenn eine gültige Locale mit setlocale() gesetzt wurde und diese Locale auf dem System installiert ist. Ein häufiger Fallstrick ist das Setzen einer nicht installierten Locale, woraufhin die Übersetzungen stillschweigend ausbleiben.

Thread-Sicherheit: setlocale() ist nicht thread-sicher; in Multi-Thread-Umgebungen (z. B. mit PHP-FPM und bestimmten Setups) kann es zu Race Conditions kommen. Als Alternative bieten sich Bibliotheken wie Symfony Translation oder php-gettext an.

Pluralregeln: Komplexe Sprachen (Polnisch, Russisch, Arabisch) besitzen mehr als zwei Pluralformen. Diese werden über den Plural-Forms-Header in der .po/.mo-Datei definiert und von dngettext automatisch ausgewertet.