Internationalisierung (i18n) in PHP: Von den Grundlagen bis zu modernen Lösungen
\n\nInternationalisierung (i18n) ist der Prozess des Softwareentwurfs, der es ermöglicht, die Software einfach an verschiedene Sprachen und Regionen anzupassen, ohne den Code zu ändern. In PHP gibt es mehrere Ansätze zur Implementierung von i18n, von integrierten Funktionen bis hin zu leistungsstarken Bibliotheken. In diesem Artikel betrachten wir die wichtigsten Tools und Best Practices.
\n\nWarum ist Internationalisierung notwendig?
\nDas Hauptziel von i18n ist es, den Text der Benutzeroberfläche vom Code zu trennen. Dies ermöglicht:
\n- \n
- Hinzufügen neuer Sprachen ohne Änderung der Anwendungslogik \n
- Unterstützung mehrerer Locales (Datums-, Zahlen- und Währungsformate) \n
- Vereinfachung des Übersetzungsprozesses für Übersetzer \n
- Einhaltung regionaler Standards (z. B. Telefonnummernformat) \n
Integrierte Unterstützung: gettext
\nPHP bietet einen leistungsstarken Mechanismus gettext für die Arbeit mit Übersetzungen. Dies ist ein klassischer Ansatz, der in den meisten Linux-Systemen verwendet wird.
\n\nInstallation und Konfiguration
\nStellen Sie sicher, dass die gettext-Erweiterung installiert ist. In den meisten Linux-Distributionen ist sie standardmäßig verfügbar. Für Windows muss möglicherweise php_gettext.dll in der php.ini aktiviert werden.
Erstellung von Übersetzungsdateien
\nErstellen Sie zunächst ein Verzeichnis für die Locales. Eine typische Struktur:
\nlocale/\n ru_RU/\n LC_MESSAGES/\n messages.po\n messages.mo\n en_US/\n LC_MESSAGES/\n messages.po\n messages.mo\n\n.po-Dateien (Portable Object) sind Textdateien mit Übersetzungen. Beispielinhalt einer messages.po-Datei für Russisch:
msgid "Welcome"\nmsgstr "Добро пожаловать"\n\nmsgid "Hello, %s!"\nmsgstr "Здравствуйте, %s!"\n\nKompilieren Sie die .po-Datei mit dem Dienstprogramm msgfmt in eine binäre .mo-Datei:
msgfmt locale/ru_RU/LC_MESSAGES/messages.po -o locale/ru_RU/LC_MESSAGES/messages.mo\n\nVerwendung im Code
\nBeispiel eines PHP-Skripts mit gettext:
\n<?php\n// Locale und Domain setzen\n$locale = 'ru_RU';\nputenv("LANG=$locale");\nsetlocale(LC_ALL, $locale);\nbindtextdomain('messages', __DIR__ . '/locale');\ntextdomain('messages');\n\n// Zeichenketten übersetzen\necho gettext('Welcome'); // Gibt "Добро пожаловать" aus\necho _('Hello, %s!', 'Иван'); // Gibt "Здравствуйте, Иван!" aus\n?>\n\nDie Funktion _() ist eine Kurzform für gettext(). Für Übersetzungen mit Platzhaltern verwenden Sie sprintf():
echo sprintf(_('Hello, %s!'), $username);\n\nModerner Ansatz: symfony/translation
\nFür größere Projekte ist die Verwendung der Bibliothek symfony/translation praktischer. Sie bietet eine flexiblere Schnittstelle, Unterstützung für verschiedene Formate (YAML, XLIFF, JSON) und lässt sich leicht in Frameworks integrieren.
\n\nInstallation über Composer
\ncomposer require symfony/translation\n\nAnwendungsbeispiel
\n<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Symfony\\Component\\Translation\\Translator;\nuse Symfony\\Component\\Translation\\Loader\\ArrayLoader;\n\n$translator = new Translator('ru_RU');\n$translator->addLoader('array', new ArrayLoader());\n\n// Übersetzungen direkt hinzufügen (zur Demonstration)\n$translator->addResource('array', [\n 'Welcome' => 'Добро пожаловать',\n 'Hello %name%' => 'Здравствуйте, %name%',\n], 'ru_RU');\n\n// Auf Englisch umschalten\n$translator->setLocale('en_US');\n$translator->addResource('array', [\n 'Welcome' => 'Welcome',\n 'Hello %name%' => 'Hello, %name%',\n], 'en_US');\n\n// Verwendung\necho $translator->trans('Welcome'); // "Welcome"\necho $translator->trans('Hello %name%', ['%name%' => 'John']); // "Hello, John"\n?>\n\nArbeiten mit YAML-Dateien
\nErstellen Sie eine Datei messages.ru.yaml: