4 Stimmen

Was ist die MessageFormatter-Klasse in PHP 5.3 gut für?

Mit PHP +5.3 und 6 kommen ein paar neue i18n-Klassen. Eine davon ist die MessageFormatter-Klasse, die eine unvollständige Idee zu sein scheint. Ich hoffe, dass ich einfach etwas übersehe.

Das gegebene Beispiel scheint zu zeigen, dass, wenn man DIE SPRACHE, DIE MAN BENUTZT, SCHON KENNT, dann diese Klasse die Zahlen für dich richtig formatiert.

Das ergibt:

4,560 monkeys on 123 trees make 37.073 monkeys per tree
4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum

Wenn Sie also die Sprache bereits kennen (deshalb müssen Sie sie schreiben), warum verwenden Sie dann nicht einfach die number_format()-Funktion, wo Sie korrekte Zahlen benötigen? Warum benötigen Sie dafür eine ganze Klasse?

Ein Beispiel, das etwas anderes als die Formatierung von Zahlen macht, würde wirklich helfen.

3voto

Pascal MARTIN Punkte 384469

number_format ermöglicht es lediglich, Zahlen zu formatieren... nun ja, Zahlen -- und es formatiert sie nur als reine Zahlen.

Andererseits macht die MessageFormater-Klasse mehr als das :

  • Sie ermöglicht es Ihnen, Zahlen zu formatieren, ja ; aber nicht nur als "reine Zahlen", sondern auch als (zum Beispiel) Geld
    • Und sowohl das Format einer Zahl als auch die Währungseinheit sind je nach Locale unterschiedlich.
    • Zum Beispiel würde man in Frankreich 1234,25 € verwenden ; während in den USA man etwas wie $1,234.25 verwenden würde
  • Sie ermöglicht es Ihnen, mehr als nur Zahlen zu formatieren :
    • Sie können auch Daten wie z.B. Datum formatieren
    • einschließlich der Namen der Tage/Monate
  • Und sie tut mehr als nur das Formatieren von Daten : sie ermöglicht es Ihnen, vollständige Zeichenfolgen anzugeben, in denen Sie Platzhalter verwenden können -- um anzuzeigen, welche Art von Daten sie darstellen sollen.
    • Dieser letzte Punkt ist wichtig, wenn Sie versuchen, eine Anwendung zu übersetzen/lokalisieren : Formate ändern sich, ja ; aber auch die Positionen der Daten können sich je nach Sprache ändern.

Dies ist großartig, wenn Sie eine Anwendung entwickeln und jemand anderen die Übersetzungen für Sie machen lassen :

  • Sie codieren Ihre Anwendung so, dass sie ihre Übersetzungszeichenfolgen aus einer Datei lädt, die von der Sprache abhängt
    • Und Sie sagen für jede Zeichenfolge, in welcher Reihenfolge Sie die Daten übergeben werden
  • Dann nimmt jemand anderes Ihre (englische, zum Beispiel) Übersetzungsdatei und übersetzt sie in eine andere Sprache
    • Die gleichen Platzhalter wie Sie für dynamische Daten
    • Platzieren sie in einer anderen Reihenfolge, falls erforderlich
  • Dann, wenn Ihre Anwendung ausgeführt wird :
    • Sie laden die richtige Übersetzungsdatei,
    • Sie fügen die Daten ein,
    • Und niemand muss sich um das Formatieren der Zahlen/Daten/... oder um die Reihenfolge der Daten in den Zeichenfolgen kümmern ; was großartig ist ;-)

Beachten Sie auch, dass MessageFormater einige zusätzliche Funktionen bietet, wie die Methode MessageFormatter::parseMessage, die genau das Gegenteil bewirkt.

Ich habe diese noch nicht wirklich benutzt, aber in manchen Situationen könnte sie nützlich sein, würde ich wetten.

Schließlich sagen Sie dies :

Das gegebene Beispiel scheint zu zeigen, dass wenn Sie DIE SPRACHE, DIE SIE VERWENDEN, BEREITS KENNEN

Ja, MessageFormater geht davon aus, dass Sie wissen, in welcher Sprache Ihre Anwendung gerade rendert.

Die Rolle der MessageFormater-Klasse besteht darin... Nachrichten zu formatieren -- nichts weiter.
Aber Sie haben einige andere Klassen, die es Ihnen ermöglichen, zu erkennen, welche Sprache Sie verwenden sollten ;-)

Zum Beispiel sollten Sie sich die Locale-Klasse ansehen -- die Methode Locale::acceptFromHttp könnte Sie besonders interessieren (quoting) :

Versucht die Locale zu finden, die die vom HTTP "Accept-Language" Header angeforderte Sprachenliste befriedigen kann

Im Grunde genommen sollte dies Ihnen helfen zu erkennen, welche Sprache der Browser akzeptiert, die von Ihrem Benutzer verwendet wird -- was höchstwahrscheinlich darauf hindeutet, welche Sprache/Locale der aktuelle Benutzer am ehesten verstehen kann.

Zum Beispiel, wenn mein Browser dies für den Accept-Language HTTP-Header senden würde :

fr,en;q=0.7,en-us;q=0.3

würde Locale::acceptFromHttp mir anzeigen, dass ich die 'fr' locale bevorzuge -- was auch der Fall ist ^^

3voto

Gordon Punkte 304254

Ich glaube, du verwechselst, was die MessageFormatter macht:

MessageFormatter ist eine konkrete Klasse, die es Benutzern ermöglicht, verknüpfte, sprachneutrale Nachrichten zu erstellen. Die Methoden, die in dieser Klasse bereitgestellt werden, werden verwendet, um alle Nachrichten zu erstellen, die von Endbenutzern gesehen werden.

Das ist ganz anders als ein number_format, das nur eine Zahl mit gruppierten Tausendern formatiert.

Weiter zitierend (Hervorhebung von mir):

MessageFormatter nimmt eine Reihe von Objekten, formatiert sie und fügt dann die formatierten Zeichenfolgen an den entsprechenden Stellen in das Muster ein. Auswahlformate können in Verbindung mit MessageFormatter verwendet werden, um Pluralformen zu handhaben, Zahlen abzugleichen und aus einem Array von Elementen auszuwählen. Typischerweise stammt das Nachrichtenformat aus Ressourcen und die Argumente werden zur Laufzeit dynamisch gesetzt.

Wenn du das mit einer nativen Funktion vergleichen musst, dann ist es eher wie eine ortsbezogene preg_replace_callback, die number_format, date_format und ausgefallene Ersetzungen wie

"{0} ergab {1,choice,0#keine Fehler|1#einzelner Fehler|1<{1, number} Fehler}"

Es sollte auch betont werden, dass MessageFormatter nur ein Unterpaket ist, das ein ziemlich funktionsreiches I10n-Framework vervollständigt.

Sieh dir diesen Artikel über Internationalisierung in PHP 5.3 an.

0voto

hobbs Punkte 204816

Versuchen Sie, die Beschreibung des Formats auf der ICU-Website zu lesen, von der es stammt - wie üblich für PHP, ihre Dokumentation enthält keine Begründung, keine Organisation und vollständig unvollständige Beispiele, aber das bedeutet nicht, dass die Bibliothek nutzlos ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X