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

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

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

в отличие от

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

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

Ответы [ 6 ]

15 голосов
/ 02 февраля 2012

Столкнувшись с тем же вопросом и поковырявшись в исходном коде, я обнаружил «дыру», которая делает это очень простым способом:

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

Этот подход не исключает использование чисел,Причиной его использования является намеки на переводчиков.

10 голосов
/ 08 апреля 2011

Боюсь, что нет, параметры - это массив объектов, поэтому для них нет возможности определить имена.Если вы всегда передаете массив параметров в одном и том же порядке, хотя вы можете использовать их следующим образом:

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}
8 голосов
/ 12 сентября 2011

Взгляните на ICU4J

Это позволяет что-то вроде этого:

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

И это намного мощнее, чем предложенные простые замены, поскольку может выполнять форматирование параметров с учетом локали (например: «Срок действия подписки истекает: {expirationDate, date, long})

http://icu -project.org / apiref / ICU4J / ком / IBM / СИС / текст / MessageFormat.html

7 голосов
/ 08 апреля 2011

К сожалению, MessageFormat API не поддерживает именованные параметры, только аргумент-индекс:

Паттерны и их интерпретация

MessageFormat использует шаблоны следующей формы:

MessageFormatPattern:
     String
     MessageFormatPattern FormatElement String

FormatElement:
     { ArgumentIndex }
     { ArgumentIndex , FormatType }
     { ArgumentIndex , FormatType , FormatStyle }
7 голосов
/ 08 апреля 2011

Все возможно для тех, кто пытается ... Я никогда не слышал о чем-то подобном для 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;
}

Это не идеально, так как вы на самом деле назвали бы это жестко закодированной строкой (что, как правило, является плохой идеей), и вы были бы вынуждены использовать только строки, но это можно сделать.Вопрос только в том, насколько это практично.

0 голосов
/ 17 июля 2018

Возможно использование библиотеки Apache Commons Lang.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...