Localisation des valeurs enum dans le regroupement de ressources

J'ai un problème avec i18n les énumérations dans mon application JSF. Quand j'ai commencé, j'ai eu des enums avec le texte défini à l'intérieur. Mais maintenant, j'ai des touches liée à message embarque dans l'enum.

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 la vue, j'utilise 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'ai eu besoin de sortie #{order.status}j'avais besoin de le convertir.
J'ai donc mis en place un convertisseur, mais a eu des ennuis avec la conversion de String à Object dans le getAsObject() méthode.

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é aujourd'hui. Quelqu'un sait comment internationaliser plusieurs Énumérations de manière efficace?

source d'informationauteur marioosh