Signatur
Beschreibung
gettext() ist die zentrale Funktion des GNU-Gettext-Systems in PHP. Sie durchsucht die aktuell aktive Übersetzungsdomain nach einer Übersetzung für den übergebenen Ausgangstext (üblicherweise Englisch) und gibt die gefundene Übersetzung in der aktuell eingestellten Sprache zurück. Wird keine Übersetzung gefunden, wird der ursprüngliche $message-String unverändert zurückgegeben.
Bevor gettext() sinnvoll eingesetzt werden kann, müssen mit bindtextdomain() ein Verzeichnispfad für die Übersetzungsdateien (.mo-Dateien) festgelegt und mit textdomain() eine aktive Domain gesetzt werden. Die Locale (Spracheinstellung) wird typischerweise mit setlocale() konfiguriert.
In der Praxis wird gettext() sehr häufig über seinen Alias _() aufgerufen, was den Code kürzer und lesbarer macht. Das ist die in Open-Source-Projekten verbreitetste Schreibweise.
Gettext eignet sich besonders für die Internationalisierung (i18n) von Web-Applikationen, bei denen Übersetzungen von professionellen Übersetzern gepflegt und als .po/.mo-Dateien bereitgestellt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message Pflicht | string | Der zu übersetzende Ausgangstext (meist Englisch). Dieser dient gleichzeitig als Schlüssel zum Nachschlagen in der Übersetzungsdatei. |
Rückgabewert
$message unverändert zurückgegeben.Beispiele
Einfaches Gettext-Setup mit Übersetzung
<?php
// Locale auf Deutsch setzen
setlocale(LC_ALL, 'de_DE.UTF-8');
// Verzeichnis mit .mo-Dateien festlegen
// Erwartete Datei: /var/www/locale/de_DE/LC_MESSAGES/messages.mo
bindtextdomain('messages', '/var/www/locale');
textdomain('messages');
bind_textdomain_codeset('messages', 'UTF-8');
// Übersetzung abrufen
echo gettext('Hello, World!');
// Ausgabe (wenn Übersetzung vorhanden): Hallo, Welt!
// Ausgabe (wenn keine Übersetzung): Hello, World!
Kurzform mit dem Alias _() im Template-Einsatz
<?php
setlocale(LC_ALL, 'de_DE.UTF-8');
bindtextdomain('app', __DIR__ . '/locale');
textdomain('app');
bind_textdomain_codeset('app', 'UTF-8');
// Kurzschreibweise via Alias _() statt gettext()
$title = _('Welcome to our website');
$btnText = _('Login');
$hint = _('Please enter your credentials.');
echo "<h1>{$title}</h1>\n";
echo "<p>{$hint}</p>\n";
echo "<button>{$btnText}</button>\n";
// Wichtig · Fallstricke
Voraussetzungen: Die Gettext-Erweiterung muss auf dem Server installiert und aktiviert sein (auf Linux-Systemen häufig als php-gettext-Paket verfügbar). Außerdem muss die entsprechende System-Locale (z. B. de_DE.UTF-8) auf dem Server installiert sein, sonst schlägt setlocale() lautlos fehl und Übersetzungen werden nicht geladen.
Caching: Gettext cached die .mo-Dateien im Prozessspeicher. Wenn eine .mo-Datei auf dem Server aktualisiert wird, muss in der Regel der Webserver (z. B. Apache/PHP-FPM) neu gestartet werden, damit die Änderungen wirksam werden.
Thread-Sicherheit: Das Setzen der Locale via setlocale() beeinflusst den gesamten Prozess, nicht nur den aktuellen Request. In Umgebungen mit mehreren Threads (z. B. PHP unter einem bestimmten Apache-MPM) kann dies zu Race Conditions führen. Für solche Umgebungen sind Alternativen wie symfony/translation oder Gettext\Translator (PHP-basierte Implementierungen) zu bevorzugen.