Unter der Annahme, dass Sie es so konfiguriert haben, wie folgt:
<resource-bundle>
<base-name>com.example.i18n.text</base-name>
<var>text</var>
</resource-bundle>
Wenn Ihr Bean Anfrage ist scoped, kann man einfach die <resource-bundle>
als @ManagedProperty
durch seine <var>
injizieren:
@ManagedProperty("#{text}")
private ResourceBundle text;
public void someAction() {
String someKey = text.getString("some.key");
// ...
}
Oder wenn Sie nur einen bestimmten Schlüssel benötigen:
@ManagedProperty("#{text['some.key']}")
private String someKey;
public void someAction() {
// ...
}
Wenn Ihr Bean jedoch in einem breiteren Rahmen, dann auswerten #{text}
programmatisch in Verfahren lokalen Bereich:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = context.getApplication().evaluateExpressionGet(context, "#{text}", ResourceBundle.class);
String someKey = text.getString("some.key");
// ...
}
Oder wenn Sie nur einige spezifische Schlüssel brauchen:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
String someKey = context.getApplication().evaluateExpressionGet(context, "#{text['some.key']}", String.class);
// ...
}
Sie können es sogar einfach durch die Standard-API ResourceBundle
auf die gleiche Weise bekommen, wie JSF selbst bereits unter der Co tut vers, dann würden Sie brauchen nur die Basisnamen im Code zu wiederholen:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = ResourceBundle.getBundle("com.example.i18n.text", context.getViewRoot().getLocale());
String someKey = text.getString("some.key");
// ...
}
Oder wenn Sie Bohnen von CDI statt JSF Sie bei der Verwaltung, dann können Sie ein @Producer
dafür schaffen:
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
Und es injizieren, wie unten:
@Inject
private PropertyResourceBundle text;
Wenn Sie alternativ die Messages
Klasse der JSF-Dienstprogrammbibliothek OmniFaces verwenden, können Sie den Resolver einfach so festlegen, dass alle Message
-Methoden das Bundle verwenden.
Messages.setResolver(new Messages.Resolver() {
public String getMessage(String message, Object... params) {
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", Faces.getLocale());
if (bundle.containsKey(message)) {
message = bundle.getString(message);
}
return MessageFormat.format(message, params);
}
});
Siehe auch das Beispiel in den javadoc und die showcase page.
'Wenn Ihr Bean Anfrage' ist scoped ist, dass der einzige Bereich, der Kann ich auf die Property-Datei zugreifen? –
@Kuriel: JSF '@ ManagedProperty' ist nicht in der Lage, einen engeren Bereich in einem breiteren Umfang zu injizieren. Nur CDI '@ Inject' ist. Wenn Sie CDI verwenden, gehen Sie zu http://stackoverflow.com/q/28045667 – BalusC
@BalusC welche Syntaxform sollte beim Schreiben von Text mit Parametern in der Ressourcenbündel-Datei verwendet werden? –