Tengo un problema con i18n enumeraciones en mi aplicación JSF. Cuando comencé, tenía enumeraciones con el texto definido en el interior. Pero ahora, tengo claves atadas a paquetes de mensajes en la enumeración.Localizando valores de enumeración en el paquete de recursos
Ejemplo uno de mis enumeraciones:
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;
}
}
En la capa vista, usar algo como:
<!-- input -->
<h:selectOneMenu value="#{order.status}">
<f:selectItems value="#{flowUtils.orderStatuses}"/>
</h:selectOneMenu>
<!-- output -->
<h:outputText value="#{order.status}"/>
y 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);
}
}
funcionó bien, pero cuando necesitaba dar salida a #{order.status}
, necesitaba convertirlo. Así que implementé un convertidor, pero tuve problemas con la conversión de String
a Object
en el método 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;
}
}
estoy enredado ahora con eso. ¿Alguien sabe cómo internacionalizar múltiples Enums de manera eficiente?
El código es correcto, pero esto no funcionará en el caso de OP ya que no es la etiqueta de opción que se pasa al convertidor. – BalusC
Gracias, no estaba al tanto de eso. –