Internationalisierung (i18n) in PHP: So machen Sie Ihre Website mehrsprachig
Internationalisierung (i18n) ist der Prozess des Entwurfs von Software, sodass sie leicht an verschiedene Sprachen und Regionen angepasst werden kann, ohne Änderungen am Code vorzunehmen. In PHP gibt es dafür mehrere leistungsstarke Werkzeuge, die es ermöglichen, Code und Text zu trennen und dann dynamisch die gewünschte Sprache zu laden.
In diesem Artikel betrachten wir die wichtigsten Ansätze und Bibliotheken zur Implementierung von i18n in PHP, einschließlich der integrierten Funktionen gettext, der Erweiterung intl und beliebter Bibliotheken wie Symfony Translation.
1. Grundlegende Konzepte von i18n
Bevor wir zu den Werkzeugen übergehen, ist es wichtig, die wichtigsten Begriffe zu verstehen:
- Locale — eine Kombination aus Sprache und Region (z. B.
ru_RU,en_US,de_DE). - Übersetzung — das Ersetzen eines ursprünglichen Strings durch sein Äquivalent in einer anderen Sprache.
- Pluralisierung — die korrekte Deklination von Wörtern in Abhängigkeit von der Anzahl (z. B. "1 Datei", "2 Dateien", "10 Dateien").
- Formatierung — die Anpassung von Daten, Zahlen, Währungen an die Locale.
2. Die integrierte Bibliothek gettext
gettext ist ein klassisches Werkzeug für i18n, das in PHP integriert ist. Es verwendet .po-Dateien (Portable Object) und .mo-Dateien (Machine Object) zum Speichern von Übersetzungen.
Installation und Konfiguration
Stellen Sie sicher, dass die Erweiterung gettext in der php.ini aktiviert ist:
extension=gettextBeispiel für eine grundlegende Konfiguration:
<?php// Locale setzensetlocale(LC_ALL, 'ru_RU.UTF-8');// Domain angeben (Name der .mo-Datei)bindtextdomain('messages', './locale');// Zeichenkodierungbind_textdomain_codeset('messages', 'UTF-8');// Domain auswählentextdomain('messages');
// Übersetzung verwendenecho gettext("Hello, World!"); // gibt "Здравствуй, Мир!" aus// oder kurzecho _("Hello, World!");?>Dateistruktur
Ihre Übersetzungsdateien sollten im Ordner locale liegen:
locale/├── ru_RU/│ └── LC_MESSAGES/│ └── messages.po│ └── messages.mo└── en_US/ └── LC_MESSAGES/ └── messages.po └── messages.moBeispiel einer messages.po-Datei:
msgid "Hello, World!"msgstr "Здравствуй, Мир!"
msgid "Files: %d"msgstr "Файлы: %d"Zum Kompilieren von .po in .mo verwenden Sie das Dienstprogramm msgfmt:
msgfmt messages.po -o messages.mo3. Die Erweiterung intl (Internationalization Functions)
Die Erweiterung intl bietet modernere Möglichkeiten für die Arbeit mit Locales, einschließlich der Formatierung von Zahlen, Daten und Nachrichten.
Installation
sudo apt-get install php-intl # für Ubuntu/DebianNachrichtenformatierung mit MessageFormatter
<?php$locale = 'ru_RU';$message = '{0} приветствует {1}!';$fmt = new MessageFormatter($locale, $message);echo $fmt->format(['PHP', 'Мир']);// Gibt aus: PHP приветствует Мир!?>Pluralisierung
<?php$locale = 'ru_RU';$pattern = '{0, plural, one {# Datei} few {# Dateien} other {# Dateien}}';$fmt = new MessageFormatter($locale, $pattern);echo $fmt->format([1]); // 1 Dateiecho $fmt->format([2]); // 2 Dateienecho $fmt->format([10]); // 10 Dateien?>Formatierung von Daten und Zahlen
<?php$locale = 'ru_RU';$fmt = new NumberFormatter($locale, NumberFormatter::DECIMAL);echo $fmt->format(1234567.89); // 1 234 567,89
$dateFmt = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE);echo $dateFmt->f