Signatur
Beschreibung
dgettext() ist Teil der GNU-Gettext-Bibliothek und ermöglicht es, eine Übersetzung aus einer anderen Domain abzurufen, als der aktuell mit textdomain() gesetzten Standarddomain. Die Funktion ist besonders nützlich, wenn eine Anwendung mehrere unabhängige Übersetzungskataloge (z. B. für verschiedene Module oder Bibliotheken) verwaltet und gezielt auf einen bestimmten Katalog zugreifen möchte, ohne den globalen Zustand zu verändern.
Die Domain entspricht dabei dem Dateinamen der .mo-Datei (ohne Dateiendung), die zuvor mit bindtextdomain() einem Verzeichnis zugeordnet wurde. Das Locale muss mit setlocale() gesetzt sein, damit Gettext die korrekte Sprachvariante laden kann.
Kann für den angegebenen $message-Schlüssel keine Übersetzung in der Domain gefunden werden, gibt die Funktion den originalen $message-String unverändert zurück. Dieses Fallback-Verhalten ist Teil des Gettext-Standards und stellt sicher, dass die Anwendung auch bei fehlenden Übersetzungen funktionsfähig bleibt.
- Zum dauerhaften Wechsel der Domain:
textdomain() - Zum Abrufen mit Plural-Unterstützung:
dngettext() - Zum Abrufen mit Kategorie-Angabe:
dcgettext()
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $domain Pflicht | string | Name der Gettext-Domain (entspricht dem Dateinamen der .mo-Datei ohne Endung), aus der die Übersetzung abgerufen werden soll. |
|
| $message Pflicht | string | Der zu übersetzende Originaltext (Message-ID), wie er im Gettext-Katalog als Schlüssel hinterlegt ist. |
Rückgabewert
$message-String zurückgegeben.Beispiele
Übersetzung aus einer spezifischen Domain abrufen
<?php
// Locale und Pfad konfigurieren
setlocale(LC_ALL, 'de_DE.UTF-8');
// Haupt-Domain der Anwendung
bindtextdomain('app', '/var/www/locales');
textdomain('app');
// Zusätzliche Domain für ein Plugin
bindtextdomain('myplugin', '/var/www/locales');
// Übersetzung aus der Standard-Domain
echo gettext('Welcome') . PHP_EOL;
// Übersetzung aus der Plugin-Domain, ohne die Standard-Domain zu ändern
echo dgettext('myplugin', 'Settings') . PHP_EOL;
// Standard-Domain ist nach wie vor 'app'
echo textdomain(null) . PHP_EOL; // Gibt 'app' aus
Fallback auf den Originalstring bei fehlender Übersetzung
<?php
setlocale(LC_ALL, 'de_DE.UTF-8');
// Domain registrieren (angenommen, diese .mo-Datei existiert, enthält aber keinen Eintrag für 'Unknown key')
bindtextdomain('mymodule', '/var/www/locales');
$result = dgettext('mymodule', 'Unknown key');
// Kein Treffer → Originalstring wird zurückgegeben
echo $result . PHP_EOL;
// Wichtig · Fallstricke
Voraussetzungen: Die Gettext-Erweiterung muss in PHP aktiviert sein (--with-gettext bei der Kompilierung). Unter Linux sind außerdem die entsprechenden System-Locales installiert sein (z. B. de_DE.UTF-8 via locale-gen).
Fallstrick: Wenn setlocale() nicht aufgerufen wurde oder das angegebene Locale auf dem System nicht vorhanden ist, liefert dgettext() immer den Originalstring zurück, ohne eine Fehlermeldung auszugeben. Dies kann zu schwer auffindbaren Fehlern führen.
Caching: Gettext cached die geladenen .mo-Dateien im Prozess-Speicher. Änderungen an den Katalogdateien werden bei laufenden PHP-FPM- oder Apache-Prozessen erst nach einem Neustart des jeweiligen Prozesses wirksam.