web-dev-qa-db-ja.com

Javaのリソースバンドルはランタイム文字列置換をサポートしていますか?

Java ResourceBundleで次のことができますか?

プロパティファイルで...

example.dynamicresource=You currently have {0} accounts.

実行時...

int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);

の結果を与えるために

「現在、3つのアカウントがあります。」

40
benstpierre

MessageFormat クラスを使用しないと、次のようなことはできません。

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
66
David Sykes

単独では、ResourceBundleはプロパティのプレースホルダーをサポートしていません。通常のアイデアは、バンドルから取得した文字列を取得してMessageFormatに貼り付け、それを使用してパラメーター化されたメッセージを取得することです。

JSP/JSTLを使用している場合は、<fmt:message>および<fmt:param>これを行うには、内部でResourceBundleMessageFormatを使用します。

Springを使用している場合、ResourceBundleMessageSource似たようなもの になり、プログラムのどこでも使用できます。このMessageSource抽象化(MessageSourceAccessorと組み合わせる)は、ResourceBundleよりもはるかに使いやすくなっています。

10
skaffman

使用しているビュー技術に応じて、さまざまな方法があります。 「プレーンバニラ」Java(例:Swing))を使用している場合は、以前に回答された MessageFormat APIを使用します。 Webアプリケーションフレームワーク(質問の履歴をここで正しく判断した場合に当てはまります)、その方法は、使用しているビューテクノロジーやMVCフレームワークによって異なります。たとえば、「プレーンバニラ」JSPの場合は、 JSTL fmt:message このため。

<fmt:message key="example.dynamicresource">
    <fmt:param value="${bean.accountCount}">
</fmt:message>

たとえばJSFの場合は、 h:outputFormat このため。

<h:outputFormat value="#{bundle['example.dynamicresource']}">
    <f:param value="#{bean.accountCount}">
</h:outputFormat>

最適な場所は、使用しているテクノロジー/フレームワークのドキュメントを参照することです(または、より適切でより詳細な回答を提供できるように、ここでそれを伝えること)。

6
BalusC

StrutsにはMessageResourcesと呼ばれる素敵なユーティリティがあり、あなたが求めるものを正確に実行します...

例えば.

MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);

制限最大3つのパラメーター(つまり、リソース属性、param1、...、param3)のみを許可します。

David Sykesの提案に従い、MessageFormat(3つ以上のパラメーター値を使用する場合)を使用することをお勧めします。

[〜#〜] ps [〜#〜]getResourcesメソッドはStruts Actionクラスでのみ使用できます。

3
Buhake Sindi

英語以外のプロパティファイルでこれを機能させることはできないと思います。

私のmessage.propertiesファイルには次の行があります。

info.fomat.log.message.start = {0}形式のログメッセージの解析を開始しています。

そして、私のmessage_fr_FR.propertiesファイルには次の行があります。

info.fomat.log.message.start = Apartir d'analyser le message connecter {0} format。

このコードは英語のコードでのみ機能します

String.format((String)messages .getString(GlobalConstants.MESSAGE_FORMAT_START)、GlobalConstants.STR_JSON));

[〜#〜] not [〜#〜]私の言語/ロケールがフランス語の場合、プレースホルダーを値に置き換えます:-(

MessageFormat.fomat()でも問題ありません

1
MRay

MessageFormoat#format は次のような場合に機能します。

greetingTo=Have Param, saying hello {0}

次のような2つのメソッドを宣言できます。RBはResourceBundleのインスタンスです。

/**This is a method that takes the param to substitute the placeholder**/
public String getString(String key, Object... params  ) {
    try {
        return MessageFormat.format(this.RB.getString(key), params);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
}

/**Without a param, this will derectly delegate to ResourceBundle#getString**/
public String getString(String key) {
    try {
        return this.RB.getString(key);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
} 
0
Jaskey

ResourceBundleでそれができるとは思いませんが、Stringでは次のことができます。

String.format(bundle.getString("example.dynamicresource"), accountCount);
0
tom

MessageFormat.format()を使用する場合は、二重引用符('')単一引用符(')。

0
tleveque