Formater

Mit Hilfe der Klasse \Alvine\Text\MessageFormatter lassen sich sehr einfach Ersetzungen durchführen. In dem folgenden einfachen Beispiel wird einfach ein Platzhalter ersetzt.

$text="Wir kaufen {n} Autos";
$map=new Alvine\Types\Map();
$map['n']='5';
$f=new \Alvine\Text\MessageFormatter($map);
echo (string) $f->format($text);
// ⇢ Wir kaufen 5 Autos

Soll der Platzhalter nicht ersetzt werden, so können die Sonderzeichen maskiert werden. Hierzu ist dem Sonderzeichen einfach ein \ voranzustellen.

$text="Wir kaufen \{n\} Autos";
$map=new Alvine\Types\Map();
$map['n']='5';
$f=new \Alvine\Text\MessageFormatter($map);
echo (string) $f->format($text);
// ⇢ Wir kaufen {n} Autos

Die Standardbegrenzer { und } können durch beliebige Zeichenketten ersetzt werden. Im folgenden Beispiel werden diese durch START und END ersetzt. Auch hier funktioniert das maskieren der Begrenzer.

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

$m=new \Alvine\Text\MessageFormatter($map);

// Marker setzen
$m->setMarker('START', 'END');

echo $m->format('Wir \STARTfahren\END mit dem STARTobjectEND'); 
// ⇢ Wir STARTfahrenEND mit dem Auto

Eine Besonderheit ist die Möglichkeit Funktionen zu definieren. Dadurch lassen sich sehr komfortabel Ersetzungen durchführen.

$map=new \Alvine\Types\Map();
$m=new \Alvine\Text\MessageFormatter($map);

// Der Methodenname ist Case-Sesitive. $m->ondiph würde nicht aufgerufen.
$m->onDiph=function($obj, $value) {
    return "Auto";
};

echo (string) $m->format('{Diph}haus.'); 
// ⇢ Autohaus.

Wie im folgendem Beispiel dokumentiert, lassen sich Ersetzungen auch rekursiv verwenden.

$text="Wir kaufen {n} Autos";
$map=new Alvine\Types\Map();
$map['n']='{a}'; // erste Ersetzung ⇢ Wir kaufen {a} Autos
$map['a']='4';   // zweite Ersetzung ⇢ Wir kaufen 4 Autos
$f=new \Alvine\Text\MessageFormatter($map);
echo (string) $f->format($text);