Internationalisierung mit PHP: robuste mehrsprachige Anwendungen mit Intl und ICU
Praxisleitfaden zur Trennung von Text und Code sowie zu Locales, Katalogen, Pluralformen, Zahlen, Währungen und Datumsangaben mit PHP Intl.
Eine PHP-Anwendung wird nicht allein durch ein Array mit übersetzten Zeichenketten mehrsprachig. Ein belastbares System trennt Inhalte von der Programmlogik, wählt Sprache und Region nachvollziehbar aus, formatiert Mengen, Währungen und Datumsangaben korrekt und nutzt bei fehlenden Übersetzungen eine definierte Rückfallsprache.
Internationalisierung und Lokalisierung
Internationalisierung bereitet Software auf verschiedene Sprachen und kulturelle Regeln vor; Lokalisierung liefert Texte und Formate für ein bestimmtes Publikum. Der Code arbeitet mit stabilen Schlüsseln wie checkout.total, die Kataloge enthalten die Übersetzungen. Ein redaktionell geänderter Satz darf keine Codeänderung erzwingen.
Intl aktivieren und Locales festlegen
Die Erweiterung intl stellt ICU-Funktionen in PHP bereit. Prüfe in Produktion extension_loaded('intl') und die ICU-Version. Verwende eindeutige Kennungen wie de-DE. Verlasse dich nicht auf den Serverstandard. Eine Positivliste verhindert nicht unterstützte Werte und manipulierte Dateipfade.
<?php
$supported = ['it-IT', 'en-GB', 'de-DE', 'fr-FR', 'es-ES', 'pt-PT'];
$requested = $_GET['lang'] ?? 'it-IT';
$locale = in_array($requested, $supported, true) ? $requested : 'it-IT';
$catalogue = require __DIR__ . '/lang/' . $locale . '.php';
function trans(string $key, array $vars = []): string {
global $catalogue, $locale;
$pattern = $catalogue[$key] ?? $key;
$formatted = MessageFormatter::formatMessage($locale, $pattern, $vars);
return $formatted === false ? $pattern : $formatted;
}
Kataloge können als PHP- oder JSON-Dateien oder über einen Dienst bereitgestellt werden. Sie gehören außerhalb öffentlicher Verzeichnisse, werden beim Deployment validiert und benötigen einen gemeinsamen Mindestbestand an Schlüsseln. Die Rückfalllogik sollte zentral definiert sein.
Dynamische Meldungen und Pluralformen
Zusammengeklebte Satzteile schreiben allen Sprachen dieselbe Wortfolge vor. MessageFormatter verwendet ICU-Muster, sodass jede Übersetzung Reihenfolge, Pluralregeln und eingebettete Formate selbst bestimmt. Übergib strukturierte Werte und protokolliere Fehler der Intl-API.
Zahlen, Währungen und Datumsangaben
Speichere Daten neutral: Geldbeträge in kleinsten Einheiten oder einem sicheren Dezimalformat, Zeitpunkte in UTC und Währungen als ISO-Code. Erst bei der Ausgabe wird lokalisiert. NumberFormatter ändert Trennzeichen und die Position des Währungssymbols, rechnet aber keine Wechselkurse um. IntlDateFormatter nutzt Sprache, Kalender und eine explizite Zeitzone.
<?php
$price = new NumberFormatter($locale, NumberFormatter::CURRENCY);
echo $price->formatCurrency(1299.90, 'EUR');
$date = new IntlDateFormatter(
$locale,
IntlDateFormatter::LONG,
IntlDateFormatter::SHORT,
'Europe/Rome'
);
echo $date->format(new DateTimeImmutable('2026-11-06 10:30:00'));
Sprachauswahl
Eine sinnvolle Reihenfolge ist gespeicherte Benutzerpräferenz, geprüfte Sitzungseinstellung, signiertes Cookie, Accept-Language und schließlich der Anwendungsstandard. Der Browser-Header ist nur ein Hinweis und darf nicht ungeprüft in einem Pfad landen. Speichere das kanonische Locale und erzeuge konsistente lokalisierte URLs.
HTML, Sicherheit und SEO
Maskiere Werte erst beim Rendern passend zum HTML-, Attribut- oder JavaScript-Kontext. Übersetzungen sind standardmäßig kein vertrauenswürdiges HTML. Setze das lang-Attribut, verwende hreflang für indexierbare Varianten und pflege eine stabile Zuordnung übersetzter Slugs.
Tests und Pflege
Automatisiere Prüfungen auf gültiges JSON, fehlende Schlüssel, abweichende Platzhalter und unübersetzte Texte. Teste null, eins und mehrere Elemente sowie eine Sprache mit langen Wörtern. Fixiere die Zeitzone in Tests und protokolliere fehlende Schlüssel, ohne sie Besuchern anzuzeigen.
Fazit
Eine gute mehrsprachige Architektur hält Fachlogik und Texte getrennt und überlässt ICU die kulturelle Formatierung. Validierte Locales, versionierte Kataloge, klare Rückfälle und automatische Tests machen jede weitere Sprache zu einer kontrollierten redaktionellen Aufgabe.
Teilen
Was ist Ihre Reaktion?
Gefällt mir
0
Gefällt mir nicht
0
Liebe
0
Lustig
0
Wütend
0
Traurig
0
Wow
0