Die Lokalisierung enum-Werte im resource-bundle

Ich habe ein problem mit i18n Enumerationen in meine JSF-Anwendung. Als ich anfing, hatte ich Enumerationen, die mit dem definierten text im inneren. Aber jetzt, ich habe die Schlüssel gebunden message-bundles in der enum.

Beispiel einer meiner enums:

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;
    }

}

In der view-Schicht, verwende ich etwas wie:

<!-- input -->
<h:selectOneMenu value="#{order.status}">
    <f:selectItems value="#{flowUtils.orderStatuses}"/>
</h:selectOneMenu>

<!-- output -->
<h:outputText value="#{order.status}"/>

und in 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);
    }
}

Es funktionierte gut, aber wenn ich brauchte, um die Ausgabe #{order.status}, die ich brauchte, um Sie zu konvertieren.
Also ich implementiert-Konverter, bekam aber ärger mit der Umwandlung von String zu Object im getAsObject() Methode.

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;
    }

}

Bin ich verschränkte nun mit, dass. Weiß jemand, wie die Internationalisierung der mehrere Enums effizient?

InformationsquelleAutor marioosh | 2010-12-07

Schreibe einen Kommentar