Formatter

Die I18n\MessageFormatter-Klasse ist eine Erweiterung der Text\MessageFormatter-Klasse. Sie formatiert einen vorgegebenen Text und ersetzt die übergebenen Platzhalter.

Die Standardbegrenzer sind { und }. Diese können aber einfach durch die Methode MessageFormatter::setMarker($start, $end) ersetzt werden.

$locale=\Alvine\I18n\Locale::getInstance('de');
$text="Wir kaufen {n} Autos";
$map=new Alvine\Types\Map();
$map['n']='5';
$f=new \Alvine\I18N\MessageFormatter($locale, $map);
echo (string) $f->format($text);
// ⇢ Wir kaufen 5 Autos

Kommen die Begrenzer in dem zu formatierenden Text vor, so müssen diese mit einem \ escaped werden.

$locale=\Alvine\I18n\Locale::getInstance('de');
$text="Wir kaufen \{n\} Autos";
$map=new Alvine\Types\Map();
$map['n']='5';
$f=new \Alvine\I18N\MessageFormatter($locale, $map);
echo (string) $f->format($text);
// ⇢ Wir kaufen {n} Autos

In dem Beispiel wird START und END als Begrenzer verwendet und einmal escaped und nur einmal ersetzt.

$locale=\Alvine\I18n\Locale::getInstance('de');

$map=new \Alvine\Types\Map([
    'fahren'=>'ok',
    'object'=>'Auto']);

$m=new \Alvine\I18N\MessageFormatter($locale, $map);
$m->setMarker('START', 'END');
echo $m->format('Wir \STARTfahren\END mit dem STARTobjectEND');
// ⇢ Wir STARTfahrenEND mit dem Auto

Für Plathalter können auch Callback-Funktionen definiert werden. Somit ist es möglich die Ersetzung frei zu programmieren.

$locale=\Alvine\I18n\Locale::getInstance('de');
$map=new \Alvine\Types\Map();
$m=new \Alvine\I18N\MessageFormatter($locale, $map);
// ⇢ Der Methodenname ist Casesesitive. $m->ondiph würde nicht aufgerufen.
$m->onDiph=function($obj, $value) {
    return "Auto";
};
echo (string) $m->format('{Diph}haus'); // Autohaus.
// ⇢ Autohaus

Als Erweiterung zur Text\MessageFormatter-Klasse kann die I18n\MessageFormatter-Klasse mit Pluralregeln umgehen.

$locale=\Alvine\I18n\Locale::getInstance('de');

$map=new \Alvine\Types\Map([
    'anzahl'=>1,
    'fahren'=>'ok',
    'object'=>'Auto']);

$m=new \Alvine\I18N\MessageFormatter($locale, $map);
$m->setMarker('START', 'END');

$prop=new \Alvine\Types\Properties();
$text=new \Alvine\I18n\PropertyText($prop, 'anzahl');

echo $m->format($text, null, 'anzahl');

Als Erweiterung zur Text\MessageFormatter-Klasse kann die I18n\MessageFormatter-Klasse mit Pluralregeln umgehen.

Mit der Methode MessageFormatter::format($text, \Alvine\Types\Map $map=null, $pluralRuleKey=null) lässt sich ein Text formatieren. Dazu muss als erstes Argument die Zeichenkette und als zweiter Parameter optional eine Map übergeben werden.

Als letzter Parameter kann noch bestimmt werden ob in dem Satz ein Zahlwort für die Bestimmung der Mehrzahlregelung vorkommt. Wird eine Mehrzahlregel verwendet, so muss der Text vom Typ \Alvine\I18n\PropertyText sein.