Frage

Facelets alle Funktionen für sauberere oder lesbarer internationalisierten Text Benutzeroberfläche markiert das, was Sie kann sonst tun JSF mit?

Zum Beispiel mit einfachen JSF, mit h:. Output ist eine sehr ausführliche Art und Weise Variablen in Meldungen zu interpolieren

Klarstellung: Ich weiß, dass ich eine Nachricht Dateieintrag hinzufügen können, die wie folgt aussieht:

label.widget.count = You have a total of {0} widgets.

und zeigt diese (wenn ich bin mit Seam) mit:

<h:outputFormat value="#{messages['label.widget.count']}">
   <f:param value="#{widgetCount}"/>
</h:outputFormat>

aber das ist eine Menge Unordnung zur Ausgabe eines Satz -. Genau die Art von Sache, die JSF einen schlechten Namen gibt

War es hilfreich?

Lösung

Sie können Ihre eigenen Gesichter Tag-Bibliothek erstellen, um es weniger ausführlich, so etwas wie:

<ph:i18n key="label.widget.count" p0="#{widgetCount}"/>

Dann die taglib Ihrer Ansicht nach dir erstellen: /components/ph.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">

<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
    <namespace>http://peterhilton.com/core</namespace>

    <tag>
        <tag-name>i18n</tag-name>
        <source>i18n.xhtml</source>
    </tag>

</facelet-taglib>

/components/i18n.xhtml erstellen

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"        
    xmlns:f="http://java.sun.com/jsf/core">

    <h:outputFormat value="#{messages[key]}">
            <!-- crude but it works -->
        <f:param value="#{p0}" />
        <f:param value="#{p1}" />
        <f:param value="#{p2}" />
        <f:param value="#{p3}" />
    </h:outputFormat>

</ui:composition>

Sie können sich wahrscheinlich eine elegante Art und Weise der Weitergabe die Argumente mit einer wenig Forschung finden.

Jetzt ist Ihre neue taglib in web.xml registrieren

<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>
        /components/ph.taglib.xml
    </param-value>
</context-param>

Fügen Sie einfach xmlns:ph="http://peterhilton.com/core" auf Ihre Ansichten und du bist fertig!

Andere Tipps

Da Sie Seam verwenden, Sie EL in der Nachrichten-Datei verwenden können.

Eigentum:

label.widget.count = You have a total of #{widgetCount} widgets.

XHTML:

<h:outputFormat value="#{messages['label.widget.count']}" />

Das nach wie vor verwendet output, ist aber weniger ausführlich.

Ich habe noch nie über eine andere Art und Weise kommen, es zu tun andere als output. Es ist leider recht ausführlich.

Das einzige, was ich vorschlagen kann, die Nachricht in einem Backing Bean schafft und dann, dass anstatt Message ausgegeben wird.

In meinem Fall habe ich Spring Message mit JSF integriert (mit MessageSourcePropertyResolver ). Dann ist es ziemlich einfach, in Ihren Begleitband Bohnen parametrisierte Nachrichten zu bekommen - Sie müssen nur wissen, was Ihr Benutzergebietsschema ist in (wieder, ich habe die Locale erwischen eine Backing Bean-Eigenschaft gebunden, so dass es über JSF oder Java zugänglich ist) <. / p>

Ich denke, Parameter - insbesondere in Nachrichten - sind eine Sache, JSF wirklich besser machen könnte

!

Ich habe diesen mehr gedacht, und es fällt mir ein, dass ich wahrscheinlich meine eigene JSTL Funktion schreiben könnte, die einen Nachrichtenschlüssel und eine variable Anzahl von Parametern nimmt:

<h:outputText value="#{my:message('label.widget.count', widgetCount)}"/>

und wenn meine Nachricht Funktion das Ergebnis vor der Ausgabe HTML-codiert, würde ich nicht einmal die h verwenden muß: output

#{my:message('label.widget.count', widgetCount)}

Sie können die Naht Interpolator verwenden:

<h:outputText value="#{interpolator.interpolate(messages['label.widget.count'], widgetCount)}"/>

Es hat @BypassInterceptors auf, so sollte die Leistung in Ordnung sein.

Sie können die Bean direkt verwenden, wenn Sie die Nachrichten zu interpolieren.

label.widget.count = You have a total of #{widgetCount} widgets.
label.welcome.message = Welcome to #{request.contextPath}!
label.welcome.url = Your path is ${pageContext.servletContext}.

${messages['label.widget.count']} ist enougth.

Dies funktioniert gut mit Spring:

package foo;

import javax.el.ELContext;
import javax.el.ELException;
import javax.el.ExpressionFactory;
import javax.el.ResourceBundleELResolver;
import javax.faces.context.FacesContext;

import org.springframework.web.jsf.el.SpringBeanFacesELResolver;

public class ELResolver extends SpringBeanFacesELResolver {
    private static final ExpressionFactory FACTORY = FacesContext
            .getCurrentInstance().getApplication().getExpressionFactory();
    private static final ResourceBundleELResolver RESOLVER = new ResourceBundleELResolver();

    @Override
    public Object getValue(ELContext elContext, Object base, Object property)
            throws ELException {
        Object result = super.getValue(elContext, base, property);
        if (result == null) {
            result = RESOLVER.getValue(elContext, base, property);
            if (result instanceof String) {
                String el = (String) result;
                if (el.contains("${") | el.contains("#{")) {
                    result = FACTORY.createValueExpression(elContext, el,
                            String.class).getValue(elContext);
                }
            }
        }
        return result;
    }
}

Und ...

Sie müssen die EL-Resolver in faces-config.xml von org.springframework.web.jsf.el.SpringBeanFacesELResolver zu

ändern

Viele Grüße

<el-resolver>foo.ELResolver</el-resolver>

Verwenden Resource und Eigenschaftsdateien.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top