Smarty Locale i18n Dezimalzeichen

Vor kurzem führte ich in einem Bezahlungs-Portal die Internationalisierung ein (i18n). Ein Bestandteil war es, auch die eingesetzte Programmiersprache „einzudeutschen“ – in PHP gesprochen hieß es, das ich setlocale() einsetzen musste.

Foto: Jon Matthies (jmatthies / Flickr, CC BY 2.0)

i18n – eine Kunst für sich Foto: Jon Matthies (jmatthies / Flickr, CC BY 2.0)

i18n war schnell angepasst und eingerichtet. Vom Prinzip her einleuchtend. Doch auf einmal funktionierte die PayPal-Schnittstelle nicht mehr. Man denkt natürlich nicht unbedingt an einen Zusammenhang, wenn zwischen Zeitpunkt <Änderung> und Zeitpunkt <Fehler erkennen> ein paar Tage und viel Code liegen.

Was war geschehen? Paypal’s API erwartet bei einem Express-Checkout eine Menge von Zahlen. Meist sind das ganze Zahlen (integer) – zum Beispiel für die Anzahl Artikel. Oft hat man allerdings auch mit Dezimalzahlen (float) zu tun – und genau hier lag der Stein begraben.

Die oben angesprochene Internationalisierung greift nämlich nicht nur bei deutschen Strings oder Datums-Formaten – sondern auch bei Dezimalzahlen. Ein früheres 0.50 Euro ist jetzt ein 0,50 Euro. Und damit kommt die Paypal-API mal so gar nicht klar. Aber warum sollte sie auch?

Problem ist schnell gelöst – nach meinem setlocale(LC_ALL, 'de_DE'); wird einfach ein setlocale(LC_NUMERIC, 'C'); eingefügt – dieser Reset zu „C“ für alle Zahlenwerte führt dazu, das wieder mit einem Punkt statt Komma die Nachkommastellen (haha..) abgetrennt werden.

Flattr this!