13

ファイルを使用<resource-bundle>すると、JSF ページに i18n テキストを含めることができます。

しかし、i18n 値を使用して Faces メッセージを設定できるように、マネージド Bean でこれらの同じプロパティにアクセスすることは可能ですか?

4

3 に答える 3

45

次のように構成したと仮定します。

<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自体がすでに裏で行っているのと同じ方法で、標準ResourceBundleAPIを使用して取得することもできます。コードでベース名を繰り返すだけで、次のようになります。

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ページの例も参照してください。

于 2012-12-01T03:55:52.887 に答える