web-dev-qa-db-ja.com

messages.propertiesファイルで名前付きパラメーターを使用するにはどうすればよいですか?

次のようにmessage.propertiesレコードを作成する方法はありますか?

message.myMessage=This message is for ${name} in ${location}

とは対照的に

message.myMessage = This message is for {0} in {1}

メッセージを作成するとき、必要な順序やパラメーターの数は必ずしもわかりませんが、名前でいくつかのプロパティを渡すことができ、正しいものだけが使用されます。

20
questioner

恐れ入りますが、パラメータはオブジェクト配列であるため、名前を定義する方法はありません。次のように使用できますが、常に同じ順序でパラメーターの配列を渡す場合:

message.myMessage = This message is for {0} in {1}
message.myNameMessage = This message is for {0}
message.myLocationMessage = This message is for people in {1}
message.myAlternateMessage = The message params are location: {1}; name: {0}
10
krock

まったく同じ質問に直面し、ソースコードを調べた後、非常に簡単な方法でそれを可能にする「抜け穴」を見つけました。

message.myMessage = This message is for {0,,name} in {1,,location}

このアプローチは、数字の使用を排除するものではありません。それを使用する理由は、翻訳の人々にヒントを与えるためです。

15
Yuriy Zubarev

ICU4Jを見てください

これにより、次のようなことが可能になります。

message.myMessage=This message is for {name} in {location}.

また、パラメータのロケール対応のフォーマットを実行できるため、提案された単純な置換よりもはるかに強力です(つまり、「サブスクリプションの有効期限:{expirationDate、date、long})

http://icu-project.org/apiref/icu4j/com/ibm/icu/text/MessageFormat.html

8
Mihai Nita

やってみる人なら何でも可能です…Javaでそんなことは聞いたことがありませんが、自分で書くことはできます。

この例を見てください:

public String format(String message, String... arguments) {
    for (String argument : arguments) {
        String[] keyValue = argument.split("=");
        if (keyValue.length != 2)
            throw new IllegalArgumentException("Incorrect argument: " + argument);
        String placeholder = "${" + keyValue[0] + "}";
        if (!message.contains(placeholder))
            throw new IllegalArgumentException(keyValue[0] + " does not exists.");
        while (message.contains(placeholder))
            message = message.replace(placeholder, keyValue[1]);
    }

    return message;
}

実際にはハードコードされた文字列で呼び出すため(これは一般的に悪い考えです)、文字列のみを使用することを余儀なくされるため、理想的ではありませんが、実行できます。唯一の問題は、それが実用的かどうかです。

7
Paweł Dyda

残念ながら、 MessageFormat AP​​I は名前付きパラメーターをサポートせず、argument-indexのみをサポートします。

パターンとその解釈

MessageFormatは、次の形式のパターンを使用します。

MessageFormatPattern:
     String
     MessageFormatPattern FormatElement String

FormatElement:
     { ArgumentIndex }
     { ArgumentIndex , FormatType }
     { ArgumentIndex , FormatType , FormatStyle }
7
matt b

Apache commonslangライブラリを使用することが可能です。

https://commons.Apache.org/proper/commons-lang/

    Properties messages = ...
    Map<String, String> m = new HashMap<>();
    m.put("name", "Mithu");
    m.put("location", "Dhaka");
    StrSubstitutor sub = new StrSubstitutor(m);
    String msg = sub.replace(messages.getProperty("message.myMessage"));
    // msg = This message is for Mithu in Dhaka