次のようにmessage.propertiesレコードを作成する方法はありますか?
message.myMessage=This message is for ${name} in ${location}
とは対照的に
message.myMessage = This message is for {0} in {1}
メッセージを作成するとき、必要な順序やパラメーターの数は必ずしもわかりませんが、名前でいくつかのプロパティを渡すことができ、正しいものだけが使用されます。
恐れ入りますが、パラメータはオブジェクト配列であるため、名前を定義する方法はありません。次のように使用できますが、常に同じ順序でパラメーターの配列を渡す場合:
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}
まったく同じ質問に直面し、ソースコードを調べた後、非常に簡単な方法でそれを可能にする「抜け穴」を見つけました。
message.myMessage = This message is for {0,,name} in {1,,location}
このアプローチは、数字の使用を排除するものではありません。それを使用する理由は、翻訳の人々にヒントを与えるためです。
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
やってみる人なら何でも可能です…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;
}
実際にはハードコードされた文字列で呼び出すため(これは一般的に悪い考えです)、文字列のみを使用することを余儀なくされるため、理想的ではありませんが、実行できます。唯一の問題は、それが実用的かどうかです。
残念ながら、 MessageFormat
API は名前付きパラメーターをサポートせず、argument-indexのみをサポートします。
パターンとその解釈
MessageFormatは、次の形式のパターンを使用します。
MessageFormatPattern:
String
MessageFormatPattern FormatElement String
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
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