Start · Sprachen · PHP · Referenz · MessageFormatter

MessageFormatter

Klasse

Formatiert Nachrichten mit ICU-Regeln in einer Locale-abhängigen Weise, z. B. Pluralformen, Datumsangaben und Zahlen.

seit PHP 5.3.0 Kategorie: string

Signatur

class MessageFormatter

Beschreibung

MessageFormatter ist eine PHP-Klasse aus der intl-Erweiterung, die auf der ICU MessageFormat-Syntax basiert. Sie ermöglicht es, lokalisierte Nachrichten zu erstellen, in denen Platzhalter für Variablen, Zahlen, Datumsangaben und Pluralformen definiert werden können – abhängig von der jeweiligen Locale (Spracheinstellung).

Die Klasse eignet sich besonders für Anwendungen, die mehrsprachige Ausgaben benötigen: Man definiert ein Muster (Pattern) wie '{name} hat {count, plural, one {# Nachricht} other {# Nachrichten}}' und übergibt zur Laufzeit die konkreten Werte. Die Formatierung – inklusive korrekter Pluralregeln – erfolgt automatisch gemäß der angegebenen Locale.

Im Vergleich zu einfachen sprintf-Lösungen unterstützt MessageFormatter komplexe Regeln wie Pluralformen (die je nach Sprache erheblich variieren), Auswahlmuster (select), Datumsformate (date, time) und Zahlenformate (number). Das macht ihn zur bevorzugten Lösung in professionellen Internationalisierungs-Szenarien (i18n).

Die Klasse kann sowohl objektorientiert als auch über statische Methoden und die prozedurale Hilfsfunktion msgfmt_create() verwendet werden. Voraussetzung ist die aktivierte intl-PHP-Erweiterung und eine ausreichend aktuelle ICU-Bibliothek.

Parameter

Name Typ Default Beschreibung
$locale Pflicht string Die Locale, gemäß der die Nachricht formatiert werden soll, z. B. 'de_DE', 'en_US' oder 'fr_FR'.
$pattern Pflicht string Das ICU-MessageFormat-Muster mit Platzhaltern, z. B. '{name} hat {count, plural, one {# Datei} other {# Dateien}} gelöscht.'

Rückgabewert

Typ

Beispiele

Einfache Variablen-Substitution

<?php
$fmt = new MessageFormatter('de_DE', 'Hallo, {name}! Du hast {count} neue Nachrichten.');
$result = $fmt->format(['name' => 'Anna', 'count' => 5]);
echo $result;
Hallo, Anna! Du hast 5 neue Nachrichten.

Pluralformen je nach Locale

<?php
$pattern = '{count, plural, one {# Datei wurde} other {# Dateien wurden}} gelöscht.';

$fmtDe = new MessageFormatter('de_DE', $pattern);
echo $fmtDe->format(['count' => 1]) . PHP_EOL;
echo $fmtDe->format(['count' => 3]) . PHP_EOL;

$fmtEn = new MessageFormatter('en_US', $pattern);
echo $fmtEn->format(['count' => 1]) . PHP_EOL;
echo $fmtEn->format(['count' => 3]) . PHP_EOL;
1 Datei wurde gelöscht. 3 Dateien wurden gelöscht. 1 Datei wurde gelöscht. 3 Dateien wurden gelöscht.

Statische Methode formatMessage()

<?php
$result = MessageFormatter::formatMessage(
    'de_DE',
    'Der Preis beträgt {preis, number, currency}.',
    ['preis' => 12.99]
);
echo $result;
Der Preis beträgt 12,99 €.

Datumsformatierung mit MessageFormatter

<?php
$fmt = new MessageFormatter('de_DE', 'Heute ist {datum, date, long}.');
$result = $fmt->format(['datum' => mktime(0, 0, 0, 6, 15, 2024)]);
echo $result;
Heute ist 15. Juni 2024.

Fehlerbehandlung bei ungültigem Muster

<?php
$fmt = MessageFormatter::create('de_DE', '{name, ungueltigerTyp}');
if ($fmt === null) {
    echo 'Formatter konnte nicht erstellt werden.';
} else {
    $result = $fmt->format(['name' => 'Test']);
    if ($result === false) {
        echo 'Fehler: ' . $fmt->getErrorMessage() . ' (Code: ' . $fmt->getErrorCode() . ')';
    } else {
        echo $result;
    }
}

// Wichtig · Fallstricke

Voraussetzung: Die intl-PHP-Erweiterung muss aktiviert sein (extension=intl in der php.ini). Die verfügbaren Features hängen von der Version der installierten ICU-Bibliothek ab – ältere ICU-Versionen unterstützen möglicherweise nicht alle Pluralregeln oder Formatierungsoptionen.

Fehlerbehandlung: Im Fehlerfall geben format() und parse() false zurück. Über getErrorCode() und getErrorMessage() lassen sich Details zum Fehler ermitteln. Die statische Methode MessageFormatter::create() gibt null zurück, wenn der Formatter nicht erstellt werden konnte.

Indizierte vs. benannte Platzhalter: ICU MessageFormat unterstützt sowohl numerisch indizierte Platzhalter ({0}, {1}) als auch benannte ({name}). Beim Aufruf von format() muss das Array entsprechend numerisch oder assoziativ aufgebaut sein.

Performance: Für häufig verwendete Muster empfiehlt es sich, das MessageFormatter-Objekt einmalig zu erstellen und wiederzuverwenden, statt bei jedem Aufruf formatMessage() zu verwenden, da der Konstruktor das Pattern kompiliert.