Как я могу использовать именованные параметры в файле messages.properties?
Есть ли способ записи сообщений .properties следующим образом
message.myMessage=This message is for ${name} in ${location}
в отличие от
message.myMessage = This message is for {0} in {1}
Когда я создаю сообщения, мне не обязательно знать порядок/сколько параметров необходимо, но я могу просто передать несколько свойств по имени, и будут использоваться только правильные.
Ответы
Ответ 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}
Ответ 2
После того, как вы столкнулись с одним и тем же вопросом и зациклились на исходном коде, я нашел "петлевую дыру", которая позволяет очень просто:
message.myMessage = This message is for {0,,name} in {1,,location}
Этот подход не исключает использование чисел. Причина его использования - дать подсказки переводчикам.
Ответ 3
Взгляните на 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
Ответ 4
Все возможно для тех, кто пытается... Я никогда не слышал о чем-то подобном для 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;
}
Он не идеален, поскольку вы на самом деле называете его жестко закодированной строкой (как правило, плохая идея), и вам придется использовать только строки, но это можно сделать. Вопрос только в том, что это практично.
Ответ 5
К сожалению, MessageFormat
API не поддерживает именованные параметры, только аргумент-индекс:
Шаблоны и их интерпретация
MessageFormat использует шаблоны следующего вида:
MessageFormatPattern:
String
MessageFormatPattern FormatElement String
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }