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.