Internationalisierung (i18n) in PHP: Vollständiger Leitfaden mit Beispielen

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

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=gettext


Beispiel 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.mo


Beispiel 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.mo


3. 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/Debian


Nachrichtenformatierung 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

Empfehlungen