ファイルを使用<resource-bundle>
すると、JSF ページに i18n テキストを含めることができます。
しかし、i18n 値を使用して Faces メッセージを設定できるように、マネージド Bean でこれらの同じプロパティにアクセスすることは可能ですか?
ファイルを使用<resource-bundle>
すると、JSF ページに i18n テキストを含めることができます。
しかし、i18n 値を使用して Faces メッセージを設定できるように、マネージド Bean でこれらの同じプロパティにアクセスすることは可能ですか?
次のように構成したと仮定します。
<resource-bundle>
<base-name>com.example.i18n.text</base-name>
<var>text</var>
</resource-bundle>
Beanがリクエストスコープの場合は、次のように<resource-bundle>
as@ManagedProperty
を注入でき<var>
ます。
@ManagedProperty("#{text}")
private ResourceBundle text;
public void someAction() {
String someKey = text.getString("some.key");
// ...
}
または、特定のキーが必要な場合:
@ManagedProperty("#{text['some.key']}")
private String someKey;
public void someAction() {
// ...
}
ただし、Beanのスコープが広い場合は#{text}
、メソッドローカルスコープでプログラムで評価します。
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = context.getApplication().evaluateExpressionGet(context, "#{text}", ResourceBundle.class);
String someKey = text.getString("some.key");
// ...
}
または、特定のキーのみが必要な場合:
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
String someKey = context.getApplication().evaluateExpressionGet(context, "#{text['some.key']}", String.class);
// ...
}
JSF自体がすでに裏で行っているのと同じ方法で、標準ResourceBundle
APIを使用して取得することもできます。コードでベース名を繰り返すだけで、次のようになります。
public void someAction() {
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle text = ResourceBundle.getBundle("com.example.i18n.text", context.getViewRoot().getLocale());
String someKey = text.getString("some.key");
// ...
}
または、JSFではなくCDIでBeanを管理している場合は、@Producer
そのためのを作成できます。
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
そして、以下のように注入します。
@Inject
private PropertyResourceBundle text;
Messages
または、 JSFユーティリティライブラリOmniFacesのクラスを使用している場合は、リゾルバーを1回設定するだけで、すべてのMessage
メソッドがバンドルを利用できるようになります。
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);
}
});
javadocおよびshowcaseページの例も参照してください。