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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Wert, der übergeben wird durch den Konverter nicht die option label, wie Sie scheinen zu erwarten, aber der Wert der option. Die beste Vorgehensweise ist, dies nicht in der Modell-Seite, aber in der Ansicht Seite, denn das Modell sollte nicht nötig sein i18n bewusst.
Als am Ansatz, Sie sind im Grunde unnötig overcomplicating Dinge. Seit JSF 1.2 gibt es eine builtin
EnumConverter
die kick automatisch an und seit JSF 2.0 können Sie Durchlaufen eine generische array-oderList
imf:selectItems
durch die neuevar
Attribut, ohne die Notwendigkeit zum duplizieren der Werte über einenList<SelectItem>
im Modell.Hier ist, wie die Bohnen Aussehen kann:
Und hier ist, wie die view Aussehen kann (unter der Annahme, dass
msg
bezieht sich auf die<var>
wie hast du Sie definiert in<resource-bundle>
imfaces-config.xml
):Das ist alles.
Unabhängig von der problem, Sie haben Tippfehler in der enum-name und message-keys, die es sein sollte
Und mehr sauber wäre, halten die bundle-keys aus dem enum und enum nutzen, sich als Teil eines bundle-Taste. E. g.
InformationsquelleAutor BalusC
Ich habe meine Lösung hier: Internationalisierung von mehreren enums (übersetzung von enum-Werte) - aber immer noch Hoffnung für die weitere Verbesserung.
EDIT: mit der Hilfe von @Joop Eggen, wir haben eine wirklich Coole Lösung:
BEARBEITEN wieder: vollständige und ready-to-use Lösung:
Machen eine Klasse
Machen es zu einem benutzerdefinierten EL-Funktion
Fügen Sie die taglib zu Ihrem web.xml
Haben die properties-Dateien enum_en.Eigenschaften und enum_yourlanguage.Eigenschaften wie diese
Fügen Sie den properties-Dateien die als resource-bundles zu Ihrem faces-config.xml
Fügen Sie den custom-taglib, um Ihre xhtml-Dateien
Und - voilà - Sie können nun den Zugriff auf die übersetzten enum-Werte in jsf:
InformationsquelleAutor Manuel M
Gut enum ist einfach eine andere Klasse. Es gibt nichts stoppen Sie hinzufügen analysieren und zu-string-Konvertierung Methoden, Analyse und Ausgabe von locale-sensitiven Nachrichten.
Vielleicht ist es gegen Einzelne Verantwortlich-Prinzip (tut es das?), aber ich glaube, dass enum-verantwortlich für die Analyse und die Rückkehr locale-aware Werte ist die richtige Sache zu tun.
Nur fügen Sie zwei Methoden wie folgt:
Ich hoffe, ich habe den code richtig, da bin ich nicht die Prüfung mit IDE jetzt ist... Ist es das was Sie gesucht haben?
Danke, ich war mir nicht bewusst.
InformationsquelleAutor Paweł Dyda
Berechne ich die Nachrichten-Taste in der enum-wie unten gezeigt wird; also kein Grund zu halten Sie die Tasten mit zusätzlichen Parametern auf die enum -
Dann nutze ich es so
mit Einstellungen ein org.springframework.Kontext.Unterstützung.ReloadableResourceBundleMessageSource in den app-Kontext
InformationsquelleAutor Rolf Schenk
In den Fall, jemand ist auf der Suche nach einer einfachen utility-Bibliothek zu handhaben enum Internationalisierung, werfen Sie bitte einen Blick auf https://github.com/thiagowolff/litefaces-enum-i18n
Das Artefakt ist auch in Maven Central:
Im Grunde, Sie gerade hinzufügen müssen, um das Artefakt zu Ihrem Projekt und definieren Sie die jeweiligen enum-Schlüssel folgenden beschriebenen enum-Namenskonventionen. Die übersetzungen (und auch CSS-Klassennamen) kann abgerufen werden, mithilfe der bereitgestellten EL-Funktionen.
InformationsquelleAutor Thiago Wolff