Supponendo che è stato configurato come segue:
<resource-bundle>
<base-name>com.example.i18n.text</base-name>
<var>text</var>
</resource-bundle>
Se il chicco è richiesta ambito, si può solo iniettare il <resource-bundle>
come @ManagedProperty
dal suo <var>
:
@ManagedProperty("#{text}")
private ResourceBundle text;
public void someAction() {
String someKey = text.getString("some.key");
// ...
}
Oppure se hai bisogno di una chiave specifica:
@ManagedProperty("#{text['some.key']}")
private String someKey;
public void someAction() {
// ...
}
Se il chicco è comunque in un ambito più ampio, quindi valutare #{text}
livello di codice in modalità ambito locale:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = context.getApplication().evaluateExpressionGet(context, "#{text}", ResourceBundle.class);
String someKey = text.getString("some.key");
// ...
}
Oppure, se avete solo bisogno di un po 'di chiave specifica:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
String someKey = context.getApplication().evaluateExpressionGet(context, "#{text['some.key']}", String.class);
// ...
}
Si può anche solo ottenere tramite l'API standard ResourceBundle
allo stesso modo che JSF stesso sta già facendo sotto il vers, si avrebbero solo bisogno di ripetere il nome di base in codice:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = ResourceBundle.getBundle("com.example.i18n.text", context.getViewRoot().getLocale());
String someKey = text.getString("some.key");
// ...
}
Oppure, se si sta gestendo i fagioli dal CDI invece di JSF, allora è possibile creare un @Producer
per questo:
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
e iniettare come qui sotto:
@Inject
private PropertyResourceBundle text;
In alternativa, se si utilizza la classe Messages
della libreria di utilità JSF OmniFaces, è possibile impostare il risolutore una sola volta in modo che tutti i metodi Message
utilizzino il pacchetto.
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);
}
});
Vedi anche l'esempio nella javadoc e showcase page.
'Se il chicco è richiesta ambito' è che l'unico scopo che può accedere al file propperties? –
@Kuriel: JSF '@ ManagedProperty' non è in grado di iniettare un ambito più ristretto in un ambito più ampio. Solo CDI '@ Inject'. Se ti capita di utilizzare CDI, vai su http://stackoverflow.com/q/28045667 – BalusC
@BalusC quale modulo di sintassi dovrebbe essere usato durante la scrittura di testo con i parametri nel file del pacchetto di risorse? –