Eigene Texte bei Validierung und Konvertierung in JSF 1.2

JSF bringt für die Eingabe und Konvertierung von Daten schon ein paar Fehlermeldungen mit.

So erscheint z.B. bei einem h:inputText Element bei dem das Attribut requrired="true" gesetzt ist die Meldung “Validation Error: Value is required.“. Entwickelt man eine Anwendung mit deutschem Frontend sollte dieser Text dann allerdings auch auf Deutsch dargestellt werden. Glücklicherweise bringt die JSF 1.2 Implementierung von Sun auch gleich ein deutsches Resource Bundle mit und der Ausgabetext heißt dann “Validierungs-Fehler: Wert wird benötigt.“.

Um eine Meldung zu erhalten muss der JSF Code wie folgt aussehen:

<h:inputText id="myInputField" value="#{myBean.myStringAttribute}" required="true"/>
<h:message for="myInputField"/>

Siehe auch in der JSF 1.2 Tag Library Documentation für h:inputText und h:message.

Nun aber zum eigentlichen Problem. Obwohl in der faces.xml lediglich eine deutsche Locale als unterstützt angegeben ist erscheint bei einem Konverterfehler ein englischer Text während bei einem Pflichtfeld ein deutscher Text erscheint. Hier die Angabe aus der faces.xml für die deutsche Locale:

  <locale-config>
   <default-locale>de</default-locale>
   <supported-locale>de</supported-locale>
  </locale-config>

Schaut man in das letzte verfügbare JSF 1.2 Update 12 APi Jar (jsf-api.jar) von Sun findet man im Package javax.faces alle Recource Bundle Dateien für die Fehlermeldungen (in früheren JSF 1.2 RI Releases sind die Resource Bundle Dateien in jsf-impl.jarMessages_de.propertiesJSF 1.2 RI – Resource Bundle. Schaut man sich diese an sieht man leider, dass lediglich die Validator Texte und übersetzt wurden. Die Converter Texte sind weiterhin in Englisch vorhanden.

Möchte man diese Texte nun in deutsch haben oder die Default Texte abändern reicht es aus in seiner eigenen Message Resource Bundle Datei die Keys zu überschreiben. Im folgenden alle vorgegebenen Converter und Validator Message Keys die man überschreiben kann eingedeutscht:

javax.faces.converter.BigDecimalConverter.DECIMAL={2}: ''{0}'' muss eine vorzeichenbehaftete Dezimalzahl sein.
javax.faces.converter.BigDecimalConverter.DECIMAL_detail={2}: ''{0}'' muss eine vorzeichenbehaftete Dezimalzahl die keine oder mehrere Stellen gefolgt von einem Dezimalpunkt und Nachkommastellen.  Beispiel: {1}
javax.faces.converter.BigIntegerConverter.BIGINTEGER={2}: ''{0}'' muss eine Zahl mit ein oder mehr Ziffern sein.
javax.faces.converter.BigIntegerConverter.BIGINTEGER_detail={2}: ''{0}'' muss eine Zahl mit ein oder mehr Ziffern sein. Beispiel: {1}
javax.faces.converter.BooleanConverter.BOOLEAN={1}: ''{0}'' muss entweder 'true' oder 'false'.
javax.faces.converter.BooleanConverter.BOOLEAN_detail={1}: ''{0}'' muss entweder 'true' oder 'false'. Jeder Wert anders als 'true' wird als 'false' interpretiert.
javax.faces.converter.ByteConverter.BYTE={2}: ''{0}'' muss eine Zahl zwischen 0 und 255 sein.
javax.faces.converter.ByteConverter.BYTE_detail={2}: ''{0}'' muss eine Zahl zwischen 0 und 255 sein. Beispiel: {1}
javax.faces.converter.CharacterConverter.CHARACTER={1}: ''{0}'' muss ein gültiges Zeichen sein.
javax.faces.converter.CharacterConverter.CHARACTER_detail={1}: ''{0}'' muss ein gültiges ASCII Zeichen sein.
javax.faces.converter.DateTimeConverter.DATE={2}: ''{0}'' ist ein ungültiges Datum. Beispiel: {1}
javax.faces.converter.DateTimeConverter.DATE_detail={2}: ''{0}'' ist ein ungültiges Datum. Beispiel: {1}
javax.faces.converter.DateTimeConverter.TIME={2}: ''{0}'' ist eine ungültige Zeitangabe.
javax.faces.converter.DateTimeConverter.TIME_detail={2}: ''{0}'' ist eine ungültige Zeitangabe. Example: {1}
javax.faces.converter.DateTimeConverter.DATETIME={2}: ''{0}'' ungültiges Datum und Zeitangabe.
javax.faces.converter.DateTimeConverter.DATETIME_detail={2}: ''{0}'' ungültiges Datum und Zeitangabe. Beispiel: {1}
javax.faces.converter.DateTimeConverter.PATTERN_TYPE={1}: Ein 'pattern' oder 'type' Attribute muss definiert werden um den Wert ''{0}'' zu konvertieren.
javax.faces.converter.DoubleConverter.DOUBLE={2}: ''{0}'' muss eine Zahl mit ein oder mehreren Ziffern sein.
javax.faces.converter.DoubleConverter.DOUBLE_detail={2}: ''{0}''  muss eine Zahl zwischen 4.9E-324 und 1.7976931348623157E308 sein. Beispiel: {1}
javax.faces.converter.EnumConverter.ENUM={2}: ''{0}'' muss zu einem Enum konvertierbar sein.
javax.faces.converter.EnumConverter.ENUM_detail={2}: ''{0}'' muss zu dem Enum konvertierbar sein, dass die Konstante  ''{1}'' entählt.
javax.faces.converter.EnumConverter.ENUM_NO_CLASS={1}: ''{0}'' muss zu einem Enum konvertierbar, aber keine Enum Klasse vorhanden.
javax.faces.converter.EnumConverter.ENUM_NO_CLASS_detail={1}: ''{0}'' muss zu einem Enum konvertierbar, aber keine Enum Klasse vorhanden.
javax.faces.converter.FloatConverter.FLOAT={2}: ''{0}'' muss eine Zahl mit ein oder mehreren Ziffern sein.
javax.faces.converter.FloatConverter.FLOAT_detail={2}: ''{0}'' muss eine Zahl zwischen 1.4E-45 und 3.4028235E38 sein. Beispiel: {1}
javax.faces.converter.IntegerConverter.INTEGER={2}: ''{0}'' muss eine Zahl mit ein oder mehreren Ziffern sein.
javax.faces.converter.IntegerConverter.INTEGER_detail={2}: ''{0}''  muss eine Zahl zwischen -2147483648 und 2147483647 sein. Beispiel: {1}
javax.faces.converter.LongConverter.LONG={2}: ''{0}'' muss eine Zahl mit ein oder mehreren Ziffern sein.
javax.faces.converter.LongConverter.LONG_detail={2}: ''{0}'' muss eine Zahl zwischen -9223372036854775808 und 9223372036854775807. Beispiel: {1}
javax.faces.converter.NumberConverter.CURRENCY={2}: ''{0}'' ist kein gültiges Währungszeichen.
javax.faces.converter.NumberConverter.CURRENCY_detail={2}: ''{0}'' ist kein gültiges Währungszeichen. Beispiel: {1}
javax.faces.converter.NumberConverter.PERCENT={2}: ''{0}'' ist keine gültige Prozentangabe.
javax.faces.converter.NumberConverter.PERCENT_detail={2}: ''{0}'' ist keine gültige Prozentangabe. Beispiel: {1}
javax.faces.converter.NumberConverter.NUMBER={2}: ''{0}'' ist keine Zahl.
javax.faces.converter.NumberConverter.NUMBER_detail={2}: ''{0}'' ist keine Zahl. Beispiel: {1}
javax.faces.converter.NumberConverter.PATTERN={2}: ''{0}'' ist kein Zahlenmuster.
javax.faces.converter.NumberConverter.PATTERN_detail={2}: ''{0}'' ist kein Zahlenmuster. Beispiel: {1}
javax.faces.converter.ShortConverter.SHORT={2}: ''{0}'' muss eine Zahl mit ein oder mehreren Ziffern sein.
javax.faces.converter.ShortConverter.SHORT_detail={2}: ''{0}'' muss eine Zahl zwischen -32768 und 32767. Beispiel: {1}
javax.faces.converter.STRING={1}: Konnte ''{0}'' nicht zu einem String konvertieren.

javax.faces.validator.DoubleRangeValidator.LIMIT=Validierungs-Fehler: Spezifiziertes Attribut kann nicht in einen Double-Typ umgewandelt werden.
javax.faces.validator.DoubleRangeValidator.MAXIMUM={1}: Validierungs-Fehler: Wert ist gru00F6u00DFer als zulu00E4ssiges Maximum ''{0}''.
javax.faces.validator.DoubleRangeValidator.MINIMUM={1}: Validierungs-Fehler: Wert ist kleiner als zulu00E4ssiges Minimum ''{0}''.
javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE={2}: Validation Error: Specified attribute is not between the expected values of {0} and {1}.
javax.faces.validator.DoubleRangeValidator.TYPE={0}: Validierungs-Fehler: Wert ist nicht vom richtigen Datentyp.
javax.faces.validator.LengthValidator.LIMIT=Validierungs-Fehler: Spezifiziertes Attribut kann nicht in korrekten Typ umgewandelt werden.
javax.faces.validator.LengthValidator.MAXIMUM={1}: Validierungs-Fehler: Wert ist gru00F6u00DFer als zulu00E4ssiges Maximum ''{0}''.
javax.faces.validator.LengthValidator.MINIMUM={1}: Validierungs-Fehler: Wert ist kleiner als zulu00E4ssiges Minimum ''{0}''.
javax.faces.validator.LongRangeValidator.LIMIT=Validierungs-Fehler: Spezifiziertes Attribut kann nicht in korrekten Typ umgewandelt werden.
javax.faces.validator.LongRangeValidator.MAXIMUM={1}: Validierungs-Fehler: Wert ist gru00F6u00DFer als zulu00E4ssiges Maximum ''{0}''.
javax.faces.validator.LongRangeValidator.MINIMUM={1}: Validierungs-Fehler: Wert ist kleiner als zulu00E4ssiges Minimum ''{0}''.
javax.faces.validator.LongRangeValidator.NOT_IN_RANGE={2}: Validation Error: Specified attribute is not between the expected values of {0} and {1}.
javax.faces.validator.LongRangeValidator.TYPE={0}: Validierungs-Fehler: Wert ist nicht vom richtigen Datentyp.
javax.faces.validator.RequiredValidator.FAILED=Validierungs-Fehler: Wert wird benu00F6tigt.
javax.faces.validator.NOT_IN_RANGE=Validierungs-Fehler: Spezifiziertes liegt nicht zwischen {0} und {1}.

Wer sich diese Datei im Originalzustand anschauen möchte kann sie sich hier herunterladen: Messages_de.properties
Wer meine Übersetzung direkt als Datei haben möchte kann sie sich hier herunterladen: Messages_de_angepasst.properties

Und da ich selbst immer wieder nach diesen Message Keys suche ist dieser Blog Artikel entstanden =).

Tags: , , , ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

wirlich ein SEHR netter beitrag ,-)

eine bescheidene frage: wo definiere ich meine eigene message resource bundle datei?
ich hab meine jetzige unter:

src/package/message/message_de.properties

und habe

javax.faces.validator.RequiredValidator.FAILED=Validierungs-Fehler: Wert wird ben\u00F6tigt.

in die property datei eingefügt sowie einen eintrag unter faces-config:

package.message.message

ich bekomme aber nicht die fehlermeldung von oben …

vielen dank
hiro

Das freut mich ja, dass dies ein wirklich SEHR netter Beitrag ist ;)

Als erstes musst du in der faces-config.xml angeben welche Sprachen unterstützt werden und wo die Resource Bundle zu finden ist. Das ganze passiert im <application> Element:

package.message.message

Dann kannst du die Message Resource Bundle mit der JSF Komponente f:loadBundle direkt in deiner JSF Seite laden. Für dein Resource Bundle oben wäre die Angabe wie folgt:
<f:loadBundle basename=”package.message.message” var=”messages”/>

Hoffe das hilft weiter.
Grüße
Markus

hallo,

danke für deine antwort ,-)

worauf ich hinaus möchte ist, kann ich mit deiner übersetzten properties datei, durch einfaches einbinden in die applikation, die englischen texte einfach überschreiben?
oder muss ich die fehlermeldungen selber produzieren?

ich hoffe du verstehst was ich meine :-)

vielen dank
hiro

ENTSCHULDIGE MEINE DUMMHEIT ,-|

es ist natürlich so wie du es beschrieben hast … man sollte halt dafür sorgen, dass auch das gewünschte in der property steht bei mir war es:

javax.faces.component.UIInput.REQUIRED= Validierungs-Fehler: Wert wird ben\u00F6tigt.

also besten dank und bitte weiter solche SEHR netten beiträge :-)

hiro

Ja, man sollte natürlich den richtigen Key überschreiben ;).
Aber schön, dass es jetzt bei dir geklappt hat.

Hinterlasse einen Kommentar