Подтвердить что ты не робот

Как я могу использовать именованные параметры в файле messages.properties?

Есть ли способ записи сообщений .properties следующим образом

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

в отличие от

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

Когда я создаю сообщения, мне не обязательно знать порядок/сколько параметров необходимо, но я могу просто передать несколько свойств по имени, и будут использоваться только правильные.

4b9b3361

Ответ 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 }