なリソースバンドルをJavaの支援実行時の文字列置換の?
-
20-09-2019 - |
質問
できるだけ以下の基準は、"プログラミングを使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
をカバーします。
せてもらう良い機会になりそうだ利用 春, その ResourceBundleMessageSource
る なう, は、あらゆる場所で使用できます。この MessageSource
抽象化のみ MessageSourceAccessor
となることを明らかに寝利用 ResourceBundle
.
あなたが使用しているビューテクノロジに応じて様々な方法があります。あなたは「プレーン・バニラ」のJava(例えばスイング)を使用している場合は、= <のhref =「http://docs.oracle.com/javase/6/docs/api/java/text/MessageFormat.html」のrelを使用"nofollowをnoreferrerは"> MessageFormat
のAPIは以前答えとして。あなたは(私は正しくここにあなたの質問履歴を判断する場合は、真である)webアプリケーションフレームワークを使用している場合は、その方法は、あなたが使用しているビューの技術および/またはMVCフレームワークに依存します。それは例えば、「プレーン・バニラ」JSPである場合は、JSTL <のhref =「http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fmt/message.html」のrelを使用することができます= "nofollowをnoreferrer">このためfmt:message
を。
<fmt:message key="example.dynamicresource">
<fmt:param value="${bean.accountCount}">
</fmt:message>
それは、例えば、JSFのためである場合は、は、使用することができます<のhref = "http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/h/outputFormat.html" のrel = "nofollowをnoreferrer">このためh:outputFormat
でます。
<h:outputFormat value="#{bundle['example.dynamicresource']}">
<f:param value="#{bean.accountCount}">
</h:outputFormat>
ベストな場所はちょうどあなたが使用している(または、我々はより適し、より詳細な答えを与えることができるようにここでそれを伝えるために)技術/フレームワークのドキュメントを参照することです。
Strutsのあなたが求める正確に何を呼ばMessageResources
utilの素敵を持って....
例えばます。
MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);
の制限の それだけで3つのパラメータの最大値(すなわち、リソース属性、PARAM1、...、param3)ことができます。
私が使用することをお勧めののMessageFormat のデビッド・サイクスにより示唆されるように(あなたが3つの以上のパラメータ値を使用する場合)。
の PS のgetResources
方法は、ストラットAction
クラスで提供されます。
私はあなたが英語以外のプロパティファイルに対してこの作業を行うことができるとは思いません。
私のmessage.propertiesファイルには、次の行があります:
の info.fomat.log.message.start = {0}の形式でメッセージをログ解析を開始しています。の
そして、私のmessage_fr_FR.propertiesファイルには、次の行があります:
の info.fomat.log.message.start = A partir D'アナライザルメッセージコネクタ{0}の形式の
このコードは、英語のいずれかにのみ機能します。
の String.Formatの((GlobalConstants.MESSAGE_FORMAT_START)を.getString(文字列)メッセージ、GlobalConstants.STR_JSON)); の
私の言語/ロケールがフランス語であるとき、それは の値とプレースホルダに代わるものではありません: - (
でもMessageFormat.fomat()
無意味です私はResourceBundleのは、それが自分自身を行うことができます信じていませんが、文字列ことができます:
String.format(bundle.getString("example.dynamicresource"), accountCount);
MessageFormat.format()
を使用しているとき、あなたは、単一引用符(''
)を表現したい場合は、あなたのリソースバンドルに二重引用符('
)を使用する必要があることを忘れないでください。
<のhref = "http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html#format(java.lang.String,%20java.lang.Object .. 。)」のrel = "nofollowを"> MessageFormoat番号形式はには、のような場合のために働くます:
greetingTo=Have Param, saying hello {0}
あなたはRBがするResourceBundleのインスタンスであるところ、このような2つのメソッドを宣言することができます:
/**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 + "]";
}
}