2009-01-30 3 views
11

Wir lokalisieren den Benutzerschnittstellentext für eine Webanwendung, die auf Java 5 ausgeführt wird, und haben ein Dilemma darüber, wie Nachrichten ausgegeben werden, die in Eigenschaftendateien definiert sind - die von java.util.Properties verwendete Art.Soll ich java.text.MessageFormat für lokalisierte Nachrichten ohne Platzhalter verwenden?

Einige Nachrichten enthalten einen Platzhalter, der mit gefüllt wird. Zum Beispiel:

search.summary = Your search for {0} found {1} items. 

Message ist ärgerlich, weil ein Apostroph ein Sonderzeichen, obwohl sie häufig in englischem Text ist. Sie haben zwei für eine wörtliche Apostroph eingeben:

warning.item = This item''s {0} is not valid. 

jedoch drei Viertel der 1000-Anwendung oder so Meldungen keine Platzhalter enthalten. Das bedeutet, dass wir ausgeben können sie direkt, Message zu vermeiden, und lassen Sie die einfachen Anführungszeichen allein:

help.url = The web page's URL 

Frage: sollten wir Message verwenden für alle Nachrichten, für eine konsistente Syntax oder Message vermeiden, wo wir können, so die meisten Nachrichten brauchen nicht zu entkommen?

Es gibt eindeutig Vor-und Nachteile in beide Richtungen.

Beachten Sie, dass die API-Dokumentation für Message das Problem erkennt und schlägt vor, eine nicht-Lösung:

Die Regeln für Anführungszeichen innerhalb Nachrichtenformat Muster leider verwendet haben etwas verwirrend erwiesen. Insbesondere ist es nicht immer offensichtlich, Localizer, ob einfache Anführungszeichen verdoppelt werden müssen oder nicht. Stellen Sie sicher, Lokalisierer über die Regeln zu informieren, und sagen Sie ihnen (z. B. mit Kommentare in Ressource Bundle Quelle Dateien) welche Zeichenfolgen von MessageFormat verarbeitet werden.

Antwort

2

Schreiben Sie einfach Ihre eigene Implementierung von MessageFormat ohne diese lästige Funktion. Sie können sich den Code von SLF4J Logger ansehen.

Sie haben ihre eigene Version von Nachrichtenformatierer, die wie folgt verwendet werden:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 

leeren Platzhalter mit Standardreihenfolge verwendet werden könnten, und für einige Lokalisierungs Fälle gezählt, wo verschiedene Sprachen Permutationen von Worten oder Teilen tun von Sätze.

+0

Ist es möglich, dass die Bibliothek zu verwenden, nur wenn ein String formatiert werden? –

+0

scheint dieser Mechanismus tief in den Code eingegraben zu sein. Vielleicht hast du mehr Glück: http://logback.qos.ch/download.html –

+0

In der Tat, ich denke, ich werde nach einer alternativen Implementierung suchen. –

-1

Eine weitere Alternative ... Wenn Sie die Eigenschaftendatei laden, wickeln Sie den Eingabestream einfach in einen FilterInpuStream, der jedes einzelne Anführungszeichen verdoppelt.

+0

Nicht alle seine Nachrichten erfordern zwei einfache Anführungszeichen. Das bedeutet, dass er die Nachrichtenformatstrings hacken muss. Eek. – JonMR

1

Verwenden Sie zum Anführen das `Zeichen anstelle von '. Wir benutzen es die ganze Zeit ohne Probleme.

Verwenden Sie MessageFormat nur dann, wenn Sie es benötigen, andernfalls wird der Code nur aufgebläht und hat keinen zusätzlichen Wert.

0

Meiner Meinung nach ist Konsistenz für so etwas wichtig. Eigenschaftsdateien und MessageFormat haben bereits viele Einschränkungen.Wenn Sie diese Probleme finden, können Sie Ihre Eigenschaftendateien "kompilieren", um richtig erzeugte zu erzeugen. Aber ich würde sagen, mit MessageFormat überall zu verwenden. Auf diese Weise müssen Sie sich nicht darum kümmern, welche Strings formatiert sind und welche nicht. Es wird einfacher damit umzugehen, da Sie die Nachrichtenverarbeitung an eine Bibliothek übergeben können und sich nicht um die Details auf einer hohen Ebene kümmern müssen.

2

Am Ende haben wir beschlossen, durch das Apostroph Problem Seite-Schritt immer ‚lockig‘ mit zitiert:

warning.item = This item\u2019s {0} is not valid. 
Verwandte Themen