Start · Sprachen · PHP · Referenz · bindtextdomain

bindtextdomain

Funktion

Bindet eine Gettext-Textdomain an ein Verzeichnis, in dem die Übersetzungsdateien (.mo/.po) gespeichert sind.

seit PHP 4.0.0 Kategorie: string

Signatur

bindtextdomain(string $domain, string|null $directory): string|false

Beschreibung

bindtextdomain() legt fest, in welchem Verzeichnis PHP nach den Übersetzungsdateien für eine bestimmte Gettext-Domain sucht. Die Übersetzungsdateien werden dabei im Format VERZEICHNIS/LOCALE/LC_MESSAGES/DOMAIN.mo erwartet, wobei LOCALE z. B. de_DE oder de_DE.UTF-8 ist.

Die Funktion ist ein zentraler Bestandteil des Gettext-Internationalisierungs-Workflows in PHP. Zuerst wird mit bindtextdomain() das Verzeichnis für eine Domain registriert, anschließend mit textdomain() die aktive Domain gesetzt, und schließlich werden Übersetzungen per gettext() oder dem Alias _() abgerufen.

Wird null als $directory übergeben (ab PHP 8.0.3), gibt die Funktion den aktuell gebundenen Pfad für die Domain zurück, ohne eine Änderung vorzunehmen. Ist noch kein Pfad gebunden, wird false zurückgegeben.

Wichtig: Die Funktion setzt voraus, dass die Gettext-Erweiterung (ext-gettext) installiert und aktiviert ist. Auf vielen Linux-Systemen ist sie standardmäßig verfügbar, auf Windows kann die Konfiguration aufwendiger sein.

Parameter

Name Typ Default Beschreibung
$domain Pflicht string Name der Textdomain, der mit der Übersetzungsdatei verknüpft wird. Dieser Name entspricht dem Dateinamen der .mo-Datei ohne Dateiendung, z. B. 'messages' für messages.mo.
$directory Pflicht string|null Absoluter oder relativer Pfad zum Basisverzeichnis, das die Locale-Unterordner enthält. Wird null übergeben, wird der aktuell gebundene Pfad zurückgegeben, ohne ihn zu ändern.

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg den (möglicherweise neu gesetzten) Pfad zur Domain als string zurück. Gibt false zurück, wenn kein Pfad gesetzt ist und null als Verzeichnis übergeben wurde.

Beispiele

Grundlegende Gettext-Initialisierung für eine deutsche Übersetzung

<?php
// Locale setzen (Systemlocale muss verfügbar sein, z. B. 'de_DE.UTF-8')
putenv('LC_ALL=de_DE.UTF-8');
setlocale(LC_ALL, 'de_DE.UTF-8');

// Verzeichnis für die Domain 'messages' festlegen
// Erwartet: /var/www/html/locale/de_DE.UTF-8/LC_MESSAGES/messages.mo
$path = bindtextdomain('messages', '/var/www/html/locale');
echo 'Gebundener Pfad: ' . $path . PHP_EOL;

// Zeichenkodierung der Domain auf UTF-8 setzen
bind_textdomain_codeset('messages', 'UTF-8');

// Domain aktivieren
textdomain('messages');

// Übersetzung abrufen
echo gettext('Hello World');
// Gibt z. B. 'Hallo Welt' aus, wenn die Übersetzung in der .mo-Datei vorhanden ist
Gebundener Pfad: /var/www/html/locale Hallo Welt

Aktuellen gebundenen Pfad abfragen ohne Änderung (ab PHP 8.0.3)

<?php
// Domain zuerst binden
bindtextdomain('myapp', '/srv/translations');

// Pfad nur abfragen, ohne ihn zu ändern
$currentPath = bindtextdomain('myapp', null);
if ($currentPath !== false) {
    echo 'Aktueller Pfad für myapp: ' . $currentPath . PHP_EOL;
} else {
    echo 'Kein Pfad gebunden.' . PHP_EOL;
}
Aktueller Pfad für myapp: /srv/translations

Mehrere Domains für verschiedene Module registrieren

<?php
putenv('LC_ALL=fr_FR.UTF-8');
setlocale(LC_ALL, 'fr_FR.UTF-8');

$localeBase = __DIR__ . '/locale';

// Separate Domains für verschiedene Anwendungsbereiche
bindtextdomain('frontend', $localeBase);
bindtextdomain('backend', $localeBase);
bindtextdomain('emails', $localeBase);

bind_textdomain_codeset('frontend', 'UTF-8');
bind_textdomain_codeset('backend', 'UTF-8');
bind_textdomain_codeset('emails', 'UTF-8');

// Domain je nach Kontext wechseln
textdomain('frontend');
echo gettext('Welcome') . PHP_EOL; // Aus frontend.mo

textdomain('emails');
echo gettext('Your order has been placed') . PHP_EOL; // Aus emails.mo

// Wichtig · Fallstricke

Systemlocale: Damit Gettext funktioniert, muss die entsprechende Locale auf dem Server installiert sein (z. B. de_DE.UTF-8 unter Debian/Ubuntu via locale-gen de_DE.UTF-8). Ein häufiger Fehler ist, dass setlocale() eine gültige Locale zurückgibt, die Übersetzung aber dennoch nicht funktioniert, weil die Locale systemseitig fehlt.

Caching: Gettext kann Übersetzungsdateien aggressiv cachen. Änderungen an .mo-Dateien erfordern unter Umständen einen Neustart des Webservers oder PHP-FPM-Prozesses, um wirksam zu werden.

Relative Pfade: Die Verwendung relativer Pfade kann in verschiedenen Ausführungskontexten (z. B. CLI vs. Webserver) zu unterschiedlichen Ergebnissen führen. Es wird empfohlen, absolute Pfade zu verwenden, z. B. mit __DIR__.

Thread-Safety: Gettext-Locale-Einstellungen sind prozessweit und nicht thread-safe. In Umgebungen mit mehreren gleichzeitigen Anfragen (z. B. Apache mit Threads) kann es zu Race Conditions kommen. Eine Alternative zu Gettext in solchen Szenarien sind PHP-basierte Übersetzungsbibliotheken wie Symfony Translation oder gettext-basierte Wrapper.