i18n-fieldtypes module für Silverstripe

Heute möchte ich mal ein Silverstripe Modul von mir vorstellen: silverstripe-i18n-fieldtypes
Es ist eigentlich eher ein Work-around für fehlenden oder ungenügenden I18n Support in sapphire.
Eigentlich sind wir hier alle Fans von Silverstripe, da es für Coder einfach anzupassen ist, aber
speziell beim Umgang mit Datums und Currency Typen in Silverstripe merkt man, dass da noch was fehlt.
Es kann gut sein, dass die nächste Version von sapphire das Modul obsolet machen -ich hoffe es sogar-
aber bis dahin, soll dieses Modul helfen.

Für Datum Werte mit deutscher Formatierung muss man zB überall in den templates folgendes machen

$Datetime.FormatI18N(%e. %B %G).

Es reicht nicht einfach sowas in der config anzugeben:

i18n::set_locale('de_DE');

Und das ist schon ganz schön nervig.
Aber hier hilft dann das Modul.

Sapphire kennt verschiedene Wege zur Formatierung, die in Zukunft wahrscheinlich noch vereinheitlicht werden.
Im Groben sind das:

  • – PHP setlocale for LC_TIME
  • – Zend Date
  • – sapphire Money Class based on Zend Currency
  • – sapphire deprecated Currency class for compatibility

Da muss man dann schauen was für einen passt, das Modul unterstützt auf jeden Fall alle diese.

Installiert wird es, wie alle Silverstripe Module, einfach in die Root-ebene des Projects kopieren und fertig.

In der mysite/_config.php muss man dann einfach die jeweilige Datums oder Currency Klasse
mit der Subklasse des Moduls ersetzen und schon hat man den vollen Zugriff auf zB die ZEND Datums Klasse

i18n::set_default_locale('de_DE');
Object::useCustomClass('SS_Datetime','ZendDate',true);

Will man kein Zend benutzen, kann der PHP Weg über die locale gegangen werden.
Die Formatierungen finden sich im lang file des Moduls, können aber auch explizit angegeben werden.

Alle Möglichkeiten sind in der _config.php erklärt:

//Date Formating -the PHP way-
//Object::useCustomClass('SS_Datetime','I18nDatetime', true);
//values then come from the lang file
//if you want to use custom formating then set also:
//I18nDatetime::setFormatNice('%e. %B %G');

//Date Formating -the Zend way-
//Object::useCustomClass('SS_Datetime','ZendDate', true);
//values then come from the lang file
//if you want to use custom formating then set also:
//ZendDate::setFormatNice('j. F Y, G:i');

//Money Formating -the SS Currency Way-
//Object::useCustomClass('Currency','I18nCurrency', true)
//values then come from the lang file
//if you want to use custom formating then set also:
//I18nCurrency::setDecimalDelimiter(','); 
//I18nCurrency::setThousandDelimiter('.'); 

//Money Formating -the Money / Zend way -
//Object::useCustomClass('Money','CustomMoney', true);
//@see http://framework.zend.com/manual/en/zend.currency.options.html
//CustomMoney::setOptions(array('display' => Zend_Currency::USE_SHORTNAME,
//                                                        'position' => Zend_Currency::RIGHT));

Auf meiner TODO stehen dann noch weitere Sprachfiles, sowie ein paar UnitTests.
Probierts mal aus und über feedback freut man sich natürlich.