Java ResourceBundle で次のことができますか?
プロパティファイルで...
example.dynamicresource=You currently have {0} accounts.
実行時に...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
の結果を与えるには
「あなたは現在3つのアカウントを持っています。」
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>
andを組み合わせてこれを行うことができます。これは、カバーの下でand<fmt:param>
を使用します。ResourceBundle
MessageFormat
たまたまSpringを使用している場合は、似ResourceBundleMessageSource
たようなことを行う があり、プログラムのどこでも使用できます。この抽象化 ( と組み合わせる) は、 よりもはるかに使いやすいです。MessageSource
MessageSourceAccessor
ResourceBundle
使用しているビュー テクノロジに応じて、さまざまな方法があります。「プレーンなバニラ」Java(Swingなど)を使用している場合は、MessageFormat
前に回答したAPIを使用してください。Web アプリケーション フレームワークを使用している場合 (ここで質問履歴を正しく判断すれば、これは本当です)、使用しているビュー テクノロジや MVC フレームワークによって方法が異なります。たとえば「プレーン バニラ」JSP の場合は、JSTLfmt: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>
最適な場所は、使用しているテクノロジー/フレームワークのドキュメントを参照することです (または、より適切で詳細な回答を提供できるように、ここでそれを伝えてください)。
MessageResources
Struts には、まさにあなたが求めていることを実行する便利な 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) のみが許可されます。
David Sykes が提案したように、 MessageFormat (3 つ以上のパラメーター値を使用する場合) を使用することをお勧めします。
PSメソッドはStrutsクラスgetResources
でのみ使用できます。Action
英語以外のプロパティ ファイルでこれを機能させることはできないと思います。
私の message.properties ファイルには次の行があります。
info.fomat.log.message.start={0} 形式のログ メッセージの解析を開始しています。
私の message_fr_FR.properties ファイルには次の行があります。
info.fomat.log.message.start=一部の分析ファイル メッセージ コネクタ {0} 形式。
このコードは英語のコードでのみ機能します
String.format((String) メッセージ .getString(GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));
私の言語/ロケールがフランス語の場合、プレースホルダーを値に置き換えません:-(
MessageFormat.format() でさえダメ
MessageFormat#formatは、次のような場合に機能します。
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 + "]";
}
}
ResourceBundle 自体がそれを実行できるとは思いませんが、String は次のことができます。
String.format(bundle.getString("example.dynamicresource"), accountCount);
一重引用符 ( ) を表現したい場合は、リソースバンドルで二重引用符 ( )を使用MessageFormat.format()
する必要があることに注意してください。''
'