Internationalisierung in JSF, wann Nachrichtenbündel und Ressourcenbündel verwenden?

84

Wann und wie soll ich verwenden <resource-bundle>und <message-bundle>Tags für die Lokalisierung in faces-config.xml? Die Unterschiede zwischen diesen beiden sind mir nicht sehr klar.

jsfQ
quelle

Antworten:

147

<message-bundle>

Das <message-bundle>ist immer dann zu verwenden, wenn Sie JSF-Standardwarn- / Fehlermeldungen überschreiben möchten, die vom JSF-Validierungs- / Konvertierungsmaterial verwendet werden. Schlüssel zu den Standardwarn- / Fehlermeldungen finden Sie in Kapitel 2.5.2.4 der JSF-Spezifikation .

Beispiel: Messages_xx_XX.propertiesDateien im com.example.i18nPaket wie folgt, die die Standardnachricht überschreiben required="true":

com/example/i18n/Messages_en.properties

javax.faces.component.UIInput.REQUIRED = {0}: This field is required

com/example/i18n/Messages_nl.properties

javax.faces.component.UIInput.REQUIRED = {0}: Dit veld is vereist

kann wie folgt konfiguriert werden (ohne den Gebietsschemaspezifizierer _xx_XXund die Dateierweiterung!):

<message-bundle>com.example.i18n.Messages</message-bundle>

<Ressourcen-Bündel>

Das <resource-bundle>ist immer dann zu verwenden, wenn Sie ein lokalisiertes Ressourcenpaket registrieren möchten, das in der gesamten JSF-Anwendung verfügbar ist, ohne dass dies <f:loadBundle>in jeder einzelnen Ansicht angegeben werden muss.

Zum Beispiel Text_xx_XX.propertiesDateien im com.example.i18nPaket wie folgt:

com/example/i18n/Text_en.properties

main.title = Title of main page
main.head1 = Top heading of main page
main.form1.input1.label = Label of input1 of form1 of main page

com/example/i18n/Text_nl.properties

main.title = Titel van hoofd pagina
main.head1 = Bovenste kop van hoofd pagina
main.form1.input1.label = Label van input1 van form1 van hoofd pagina

kann wie folgt konfiguriert werden (ohne den Gebietsschemaspezifizierer _xx_XXund die Dateierweiterung!):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

und main.xhtmlwie folgt verwendet werden:

<h:head>
    <title>#{text['main.title']}</title>
</h:head>
<h:body>
    <h1 id="head1">#{text['main.head1']}</h1>
    <h:form id="form1">
        <h:outputLabel for="input1" value="#{text['main.form1.input1.label']}" />
        <h:inputText id="input1" label="#{text['main.form1.input1.label']}" />
    </h:form>
</h:body>

ValidationMessages (JSR303 Bean Validation)

Da Java EE 6 / JSF 2, gibt es auch die neu JSR303 Bean Validation API , die von denen dargestellt wird @NotNull, Size, @Maxusw. Anmerkungen des javax.validation.constraintsPakets. Sie sollten verstehen, dass diese API völlig unabhängig von JSF ist. Es ist nicht Teil von JSF, aber JSF passiert einfach zu haben , Unterstützung bei Validierungen Phase für sie. Das heißt, es ermittelt und erkennt das Vorhandensein einer JSR303-Implementierung (z. B. Hibernate Validator) und delegiert dann die Validierung an diese (die <f:validateBean disabled="true"/>übrigens durch Verwendung deaktiviert werden kann).

Gemäß Kapitel 4.3.1.1 der JSR303-Spezifikation muss die benutzerdefinierte JSR303-Validierungsnachrichtendatei genau den Namen haben ValidationMessages_xx_XX.propertiesund im Stammverzeichnis des Klassenpfads abgelegt werden (also nicht in einem Paket!).


Lokalisierung

In den obigen Beispielen steht der _xx_XXDateiname für die (optionale) Sprache und die Ländercodes. Wenn dies überhaupt nicht vorhanden ist, wird es zum Standardpaket (Fallback). Wenn die Sprache beispielsweise vorhanden ist _en, wird sie verwendet, wenn der Client diese Sprache im Accept-LanguageHTTP-Anforderungsheader explizit angefordert hat . Gleiches gilt für das Land, zB _en_USoder _en_GB.

Sie können die unterstützten Gebietsschemas sowohl für das Nachrichten- als auch für das Ressourcenpaket generisch im <locale-config>Element von angeben faces-config.xml.

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>nl</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

Das gewünschte Gebietsschema muss über festgelegt werden <f:view locale>. Siehe auch Lokalisierung in JSF, wie Sie sich das ausgewählte Gebietsschema pro Sitzung anstatt pro Anforderung / Ansicht merken .

BalusC
quelle
1
Hallo Balus C, können wir mehrere <message-bundle> verwenden und wie kann man es von Java Bean aus aufrufen?
T8Z
Bei der Verwendung des <Ressourcen-Bündels> muss besonders auf die Ordnerstruktur geachtet werden. Wenn Sie sagen, dass Sie in gesicht-config.xml <Ressourcenbündel> <Basenname> org.abc.def.messages </ Basisname> <var> msg </ var> </ Ressourcenbündel> Folgendes haben, dann Alle message.properties, message_es.properties und message_de.properties sollten sich nur im Ordner 'src / main / resources / org / abc / def' befinden. dh erstellen Sie keinen 'Nachrichten'-Ordner unter dem' Def'-Ordner. Bis 'def' erwartet das Ressourcenpaket, wo es erwartet, dass alle files_xx.properties-Dateien gefunden werden.
Rahul Saini