Question

Facelets possède-t-il des fonctionnalités permettant de mieux étiqueter le texte d'une interface utilisateur internationalisée internationalisée? peut faire autrement en utilisant JSF?

Par exemple, avec JSF simple, utiliser h: outputFormat est un moyen très détaillé d’interpoler des variables dans des messages.

Clarification: Je sais que je peux ajouter une entrée de fichier message ressemblant à ceci:

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

et affichez-le (si j'utilise Seam) avec:

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

mais c’est beaucoup de fouillis pour produire une phrase - le genre de chose qui donne un mauvais nom à JSF.

Était-ce utile?

La solution

Vous pouvez créer votre propre bibliothèque de balises de faces pour la rendre moins explicite, comme par exemple:

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

Créez ensuite la balise tag dans votre répertoire de vue: /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>

Créer / Composants / i18n.xhtml

<?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>

Vous pouvez probablement trouver un moyen élégant de passer les arguments avec un peu de recherche.

Enregistrez maintenant votre nouvelle balise tag dans web.xml

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

Ajoutez simplement xmlns: ph = "http: //peterhilton.com/core" " à vos vues et vous êtes tous ensemble!

Autres conseils

Puisque vous utilisez Seam, vous pouvez utiliser EL dans le fichier de messages.

Propriété:

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

XHTML:

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

Ceci utilise toujours outputFormat, mais est moins détaillé.

Je n'ai jamais trouvé d'autre moyen de le faire que outputFormat. Il est malheureusement assez prolixe.

La seule autre chose que je puisse suggérer est de créer le message dans un bean de support, puis de le générer plutôt que de messageFormat.

Dans mon cas, j'ai intégré MessageSource de Spring avec JSF (avec MessageSourcePropertyResolver ). Ensuite, il est assez facile dans vos beans de support d’obtenir des messages paramétrés - vous devez simplement savoir dans quel environnement local se trouve votre utilisateur (là encore, le paramètre Locale est lié à une propriété de bean de support, elle est donc accessible via JSF ou Java). / p>

Je pense que les paramètres, en particulier dans les messages, sont une chose que JSF pourrait vraiment faire mieux!

J'y ai pensé plus souvent, et il me semble que je pourrais probablement écrire ma propre fonction JSTL qui prend une clé de message et un nombre variable de paramètres:

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

et si ma fonction de message HTML code le résultat avant la sortie, je n'aurais même pas besoin d'utiliser le h: outputText

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

Vous pouvez utiliser l'interpolateur Seam:

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

Il a @BypassInterceptors dessus donc la performance devrait être ok.

Vous pouvez utiliser le bean directement si vous interpolez les messages.

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']} est en cours.

Celui-ci fonctionne très bien avec 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;
    }
}

Et ...

Vous devez modifier le résolveur EL dans faces-config.xml de org.springframework.web.jsf.el.SpringBeanFacesELResolver en .

Cordialement

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

Utiliser les fichiers ResourceBundle et de propriétés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top