Warum Internationalisierung von PHP mehr ist als nur „Wörter übersetzen“
\n\nStellen Sie sich vor: Sie haben ein tolles PHP-Projekt geschrieben. Es funktioniert, erfreut die Benutzer, bringt Gewinn. Aber eines Tages stellen Sie in der Statistik fest, dass 30 % des Traffics aus Deutschland, 15 % aus Japan und 10 % aus den VAE kommen. Ihre Website spricht nur Russisch. Benutzer gehen, ohne den Button „Kaufen“ in ihrer Sprache zu finden.
\n\nKommt Ihnen die Situation bekannt vor? Internationalisierung (i18n) von PHP-Anwendungen ist nicht nur das Ersetzen von Wörtern in einer Vorlage. Es ist ein architektonischer Ansatz, der es Ihrem Code ermöglicht, Kultur, Währung, Daten und sogar die Textrichtung (von links nach rechts oder von rechts nach links) zu „verstehen“.
\n\nIn diesem Artikel werden wir untersuchen, wie man eine gewöhnliche PHP-Website in eine mehrsprachige Plattform verwandelt, unter Verwendung nativer Tools und Best Practices. Sie erfahren, wie gettext in PHP funktioniert, wie sich Lokalisierung von Internationalisierung unterscheidet und wie man die Fallstricke der Pluralbildung vermeidet.
\n\ni18n vs l10n: Was ist der Unterschied (und warum ist das wichtig)
\n\nBevor wir Code schreiben, lassen Sie uns die Begriffe klären. Internationalisierung (i18n) ist die Vorbereitung des Codes für die Übersetzung: Auslagern von Zeichenketten, Arbeiten mit Zahlen-, Datums- und Währungsformaten. Lokalisierung (l10n) ist der eigentliche Prozess der Übersetzung und Anpassung an eine bestimmte Region.
\n\nEine einfache Analogie: Internationalisierung ist der Bau eines Hauses mit leeren Räumen, in die man beliebige Möbel stellen kann. Lokalisierung ist das Anordnen der Möbel nach dem Geschmack eines bestimmten Bewohners.
\n\nFür einen PHP-Entwickler bedeutet das: Harten Sie keine Zeichenketten! Niemals. Auch wenn die Website derzeit nur auf Russisch ist. Jeder Satz sollte in eine Übersetzungsfunktion eingebettet sein.
\n\nTechnologie-Stack für i18n in PHP
\n\nIm PHP-Ökosystem gibt es mehrere leistungsstarke Tools. Wir werden zwei Hauptansätze betrachten: das klassische gettext und das moderne ICU MessageFormat über die Erweiterung intl.
1. Gettext – der Urvater der Mehrsprachigkeit
\n\nGettext in PHP ist der De-facto-Standard für viele CMS (WordPress, Drupal). Es verwendet .po- und .mo-Dateien zum Speichern von Übersetzungen. Vorteile: Einfachheit, Unterstützung von Pluralformen, Integration mit Poedit.
2. ICU MessageFormat – für komplexe Logik
\n\nDie Erweiterung PHP intl (Internationalization) bietet die Klassen MessageFormatter und NumberFormatter. Dies ist die Wahl für Projekte, die komplexe Vorlagen mit Auswahl von Kasus, Genus und Numerus benötigen.
3. Wrapper-Bibliotheken
\n- \n
- symfony/translation – Symfony-Komponente, arbeitet sowohl mit YAML/XLIFF als auch mit gettext. \n
- laravel-localization – für Laravel (Paket mcamara/laravel-localization). \n
- zend-i18n – für Laminas (ehemals Zend Framework). \n
Praxis: gettext in PHP von Grund auf einrichten
\n\nAngenommen, wir haben ein einfaches Skript index.php, das eine Begrüßung ausgibt. Machen wir es mehrsprachig.
Schritt 1. Vorbereitung des Codes
\n\nUmgeben Sie alle Zeichenketten mit der Funktion _() (Alias für gettext()):
<?php\n// index.php\necho _("Willkommen auf unserer Website!");\n\n$items = 5;\n// Für Pluralformen verwenden wir ngettext\necho ngettext("%d Artikel", "%d Artikel", $items);\n?>\n\nSchritt 2. Generierung der .pot-Datei
\n\nInstallieren Sie gettext auf dem Server oder verwenden Sie xgettext:
xgettext -o locales/messages.pot index.php --from-code=UTF-8\n\nSchritt 3. Erstellung der Übersetzung
\n\nKopieren Sie messages.pot nach locales/de_DE/LC_MESSAGES/messages.po und bearbeiten Sie es:
msgid "Willkommen auf unserer Website!"\nmsgstr "Welcome to our site!"\n\nmsgid "%d Artikel"\nmsgid_plural "%d Artikel"\nmsgstr[0] "%d item"\nmsgstr[1] "%d items"\n\n