J'ai un problème avec les énumérations i18n dans mon application JSF. Quand j'ai commencé, j'avais enums avec le texte défini à l'intérieur. Mais maintenant, j'ai des clés liées à des paquets de messages dans l'énumération.Localisation des valeurs enum dans le regroupement de ressources
Exemple un de mes énumérations:
public enum OrderStatus implements CustomEnum {
PENDING("enum.orderstatus.pending"),
CANCELED("enum.orderstatus.canceled");
/**
* key in message bundle
*/
private String name;
OrderStatus(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
Dans la couche de vue, j'utiliser quelque chose comme:
<!-- input -->
<h:selectOneMenu value="#{order.status}">
<f:selectItems value="#{flowUtils.orderStatuses}"/>
</h:selectOneMenu>
<!-- output -->
<h:outputText value="#{order.status}"/>
et en Java:
public class FlowUtils {
public List<SelectItem> getOrderStatuses() {
ArrayList<SelectItem> l = new ArrayList<SelectItem>();
for(OrderStatus c: OrderStatus.values()) {
// before i18n
// l.add(new SelectItem(c, c.getName()));
// after i18n
l.add(new SelectItem(c, FacesUtil.getMessageValue(c.getName())));
}
return l;
}
}
public class FacesUtil {
public static String getMessageValue(String name) {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().getResourceBundle(context, "m").getString(name);
}
}
Il a bien fonctionné, mais quand j'avais besoin de sortir #{order.status}
, j'avais besoin de le convertir. J'ai donc implémenté un convertisseur, mais j'ai eu des problèmes avec la conversion de String
en Object
dans la méthode getAsObject()
.
web.xml:
<converter>
<converter-for-class>model.helpers.OrderStatus</converter-for-class>
<converter-class>model.helpers.EnumTypeConverter</converter-class>
</converter>
Java:
public class EnumTypeConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent comp,
String value) throws ConverterException {
// value = localized value :(
Class enumType = comp.getValueBinding("value").getType(context);
return Enum.valueOf(enumType, value);
}
@Override
public String getAsString(FacesContext context, UIComponent component,
Object object) throws ConverterException {
if (object == null) {
return null;
}
CustomEnum type = (CustomEnum) object;
ResourceBundle messages = context.getApplication().getResourceBundle(context, "m");
String text = messages.getString(type.getName());
return text;
}
}
Je suis empêtré maintenant avec ça. Quelqu'un sait-il comment internationaliser plusieurs Enums efficacement?
Le code est bon, mais cela ne fonctionnera pas dans le cas d'OP car ce n'est pas l'étiquette d'option qui est transmise au convertisseur. – BalusC
Merci, je n'étais pas au courant de ça. –