Java ResourceBundleで次のことができますか?
プロパティファイルで...
example.dynamicresource=You currently have {0} accounts.
実行時...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
の結果を与えるために
「現在、3つのアカウントがあります。」
MessageFormat クラスを使用しないと、次のようなことはできません。
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
単独では、ResourceBundle
はプロパティのプレースホルダーをサポートしていません。通常のアイデアは、バンドルから取得した文字列を取得してMessageFormat
に貼り付け、それを使用してパラメーター化されたメッセージを取得することです。
JSP/JSTLを使用している場合は、<fmt:message>
および<fmt:param>
これを行うには、内部でResourceBundle
とMessageFormat
を使用します。
Springを使用している場合、ResourceBundleMessageSource
が 似たようなもの になり、プログラムのどこでも使用できます。このMessageSource
抽象化(MessageSourceAccessor
と組み合わせる)は、ResourceBundle
よりもはるかに使いやすくなっています。
使用しているビュー技術に応じて、さまざまな方法があります。 「プレーンバニラ」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>
最適な場所は、使用しているテクノロジー/フレームワークのドキュメントを参照することです(または、より適切でより詳細な回答を提供できるように、ここでそれを伝えること)。
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
クラスでのみ使用できます。
英語以外のプロパティファイルでこれを機能させることはできないと思います。
私の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()でも問題ありません
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 + "]";
}
}
ResourceBundleでそれができるとは思いませんが、Stringでは次のことができます。
String.format(bundle.getString("example.dynamicresource"), accountCount);
MessageFormat.format()
を使用する場合は、二重引用符(''
)単一引用符('
)。