41

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

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

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

実行時に...

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

の結果を与えるには

「あなたは現在3つのアカウントを持っています。」

4

8 に答える 8

73

次のようなMessageFormatクラスを使用しないわけではありません。

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
于 2010-03-15T22:58:51.743 に答える
10

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

JSP/JSTLを使用している場合は、 <fmt:message>andを組み合わせてこれを行うことができます。これは、カバーの下でand<fmt:param>を使用します。ResourceBundleMessageFormat

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

于 2010-03-15T23:02:23.213 に答える
6

使用しているビュー テクノロジに応じて、さまざまな方法があります。「プレーンなバニラ」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>

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

于 2010-03-15T23:03:46.087 に答える
3

MessageResourcesStruts には、まさにあなたが求めていることを実行する便利な 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

于 2010-03-15T23:13:42.173 に答える
1

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

私の 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() でさえダメ

于 2011-07-19T17:44:30.883 に答える
0

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 + "]";
    }
} 
于 2015-04-01T02:38:45.423 に答える
0

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

String.format(bundle.getString("example.dynamicresource"), accountCount);
于 2010-03-15T23:03:10.093 に答える
0

一重引用符 ( ) を表現したい場合は、リソースバンドルで二重引用符 ( )を使用MessageFormat.format()する必要があることに注意してください。'''

于 2013-10-07T18:42:31.137 に答える