PHP-Internationalisierung: i18n für mehrsprachige Webseiten

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Ihre PHP-Website mehrere Sprachen sprechen sollte

\n\n

Stellen Sie sich vor: Sie haben ein perfektes Produkt entwickelt – schnell, benutzerfreundlich und lösungsorientiert. Aber es gibt einen Haken: Ihre Oberfläche spricht nur Deutsch. Potenzielle Kunden aus Frankreich, Japan oder Brasilien schließen einfach den Tab, weil sie keinen Knopf verstehen. Das ist nicht nur entgangener Gewinn – das ist der Verlust ganzer Märkte.

\n\n

Internationalisierung (i18n – von „internationalization", 18 Buchstaben zwischen i und n) und Lokalisierung (l10n) sind kein „Nice-to-have" für Startups, sondern ein strategisches Werkzeug. Viele Entwickler fürchten diesen Begriff und denken, sie müssten den gesamten Code umschreiben. In Wahrheit ist eine durchdachte Übersetzungsstruktur in PHP ein eleganter Prozess, der den Code sauberer und das Unternehmen globaler macht.

\n\n

In diesem Artikel betrachten wir drei bewährte Ansätze zur Internationalisierung von PHP-Anwendungen: von einfachen Arrays über die leistungsstarke intl-Erweiterung bis hin zum klassischen gettext. Sie erfahren, wie Sie nicht nur Texte übersetzen, sondern auch Daten, Zahlen und Pluralformen korrekt verarbeiten – denn im Arabischen, Polnischen oder Russischen gelten andere Deklinationsregeln.

\n\n

Die wichtigsten i18n-Ansätze in PHP

\n\n

Bevor Sie Code schreiben, müssen Sie die Architektur wählen. Grundsätzlich lassen sich alle Methoden in drei Kategorien einteilen. Welche Sie wählen, hängt vom Projektumfang und den Leistungsanforderungen ab.

\n\n

1. Arrays und INI-Dateien (DIY-Ansatz)

\n\n

Der einfachste Weg: Übersetzungen in assoziativen Arrays oder .ini-Dateien speichern. Ideal für kleine Projekte oder MVPs.

\n\n
// lang/de.php\nreturn [\n    'welcome' => 'Willkommen auf der Website!',\n    'logout' => 'Abmelden',\n    'cart_empty' => 'Der Warenkorb ist leer'\n];\n\n// lang/en.php\nreturn [\n    'welcome' => 'Welcome to the website!',\n    'logout' => 'Logout',\n    'cart_empty' => 'Cart is empty'\n];
\n\n

Die Nutzung ist simpel: Je nach Session oder Cookie des Benutzers wird die passende Datei geladen.

\n\n
function __($key) {\n    static $lang = null;\n    if ($lang === null) {\n        $locale = $_SESSION['lang'] ?? 'de';\n        $lang = include "lang/{$locale}.php";\n    }\n    return $lang[$key] ?? $key;\n}\n\necho __('welcome'); // Willkommen auf der Website!
\n\n

Vorteile: Einfachheit, keine Erweiterungen nötig, leicht cachebar (sogar in Redis speicherbar).
\nNachteile: Keine Unterstützung für Pluralformen (Sie müssten eine Eigenentwicklung schreiben), ungeeignet für große Projekte (tausende Schlüssel in einer Datei).

\n\n

2. Gettext – der Klassiker

\n\n

Gettext ist der De-facto-Standard für Internationalisierung in der Unix-Welt. In PHP ist es über die gettext-Erweiterung verfügbar. Dieses mächtige Werkzeug wird in WordPress, Drupal und Symfony eingesetzt.

\n\n

Zunächst erstellen Sie .po-Dateien (z. B. für Deutsch):

\n\n
# de_DE/LC_MESSAGES/messages.po\nmsgid "Hello, %s!"\nmsgstr "Hallo, %s!"\n\nmsgid "You have %d new message"\nmsgid_plural "You have %d new messages"\nmsgstr[0] "Sie haben %d neue Nachricht"\nmsgstr[1] "Sie haben %d neue Nachrichten"
\n\n

Anschließend kompilieren Sie die Datei mit dem Tool msgfmt in das .mo-Format. Im PHP-Code sieht das so aus:

\n\n
putenv('LC_ALL=de_DE.UTF-8');\nsetlocale(LC_ALL, 'de_DE.UTF-8');\nbindtextdomain('messages', './locale');\ntextdomain('messages');\n\necho gettext('Hello, %s!', 'Max'); // Hallo, Max!\n\n// Pluralformen – wie von Zauberhand:\necho ngettext('%d message', '%d messages', 3); // 3 Nachrichten
\n\n

Übrigens: Nutzen Sie Poedit, um die Entwicklung zu beschleunigen – es hebt unübersetzte Zeilen hervor.

\n\n

3. Die Intl-Erweiterung (PHP 5.3+)

\n\n

Wenn Sie nicht nur Texte übersetzen, sondern auch Zahlen, Daten oder Währungen länderspezifisch formatieren möchten, verwenden Sie Intl. Es baut auf der ICU-Bibliothek (International Components for Unicode) auf.

\n\n
// Zahlen formatieren                

Blogs

Buchempfehlungen