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

Имеются ли пакеты ресурсов в Java, поддерживающие замещение строки выполнения?

Можете ли вы сделать следующее с Java ResourceBundle?

В файле свойств...

example.dynamicresource=You currently have {0} accounts.

Во время выполнения...

int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);

Чтобы дать результат

"В настоящее время у вас 3 аккаунта".

4b9b3361

Ответ 1

Не без использования класса MessageFormat, например:

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);

Ответ 2

По своему усмотрению ResourceBundle не поддерживает заполнители свойств. Обычная идея - взять строку, которую вы получаете из пакета, и вставить ее в MessageFormat, а затем использовать ее для получения вашего параметризованного сообщения.

Если вы используете JSP/JSTL, вы можете комбинировать <fmt:message> и <fmt:param>, чтобы использовать ResourceBundle и MessageFormat под обложками.

Если вы используете Spring, то он имеет ResourceBundleMessageSource, который делает что-то подобное и может использоваться в любом месте вашей программы. Эта абстракция MessageSource (в сочетании с MessageSourceAccessor) намного удобнее, чем ResourceBundle.

Ответ 3

Существуют различные способы, в зависимости от используемой технологии просмотра. Если вы используете "plain vanilla" Java (например, Swing), используйте MessageFormat API, как было сказано ранее. Если вы используете фреймворк webapplication (это правда, если я правильно сужу вашу историю вопроса), то путь зависит от технологии просмотра и/или структуры MVC, которую вы используете. Если это, например, "plain vanilla" JSP, вы можете использовать JSTL fmt:message для этого.

<fmt:message key="example.dynamicresource">
    <fmt:param value="${bean.accountCount}">
</fmt:message>

Если это, например, JSF, вы можете использовать h:outputFormat.

<h:outputFormat value="#{bundle['example.dynamicresource']}">
    <f:param value="#{bean.accountCount}">
</h:outputFormat>

Лучше всего просто ознакомиться с документацией о технологии/структуре, которую вы используете (или рассказать об этом здесь, чтобы мы могли дать более подходящие и более подробные ответы).

Ответ 4

У Struts есть хороший утилит MessageResources, который делает именно то, что вы просите....

например.

MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);

Ограничение Он допускает максимум 3 параметра (т.е. Атрибут ресурса, param1,..., param3).

Я предлагаю использовать MessageFormat (если вы хотите использовать более трех значений параметров), как это предложил Дэвид Сайкс.

PS метод getResources доступен только в классе Struts Action.

Ответ 5

Я не думаю, что вы можете сделать эту работу для файла свойств, отличного от английского.

Мой файл message.properties имеет следующую строку:

info.fomat.log.message.start = Запуск анализа сообщения журнала в формате {0}.

И мой файл message_fr_FR.properties имеет следующую строку:

info.fomat.log.message.start = Компонент

Этот код работает только для английского

Сообщения String.format((String).getString(GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));

Он НЕ заменяет местозаполнитель значением, когда мой язык/локаль является французским: - (

Даже MessageFormat.fomat() не подходит

Ответ 6

Я не верю, что ResourceBundle может сделать это сам, но String может:

String.format(bundle.getString("example.dynamicresource"), accountCount);

Ответ 7

Помните, что при использовании MessageFormat.format() вам нужно использовать двойную кавычку ('') в вашем ресурсном пакете, если вы хотите выразить одиночную кавычку (').

Ответ 8

Формат MessageFormoat # будет работать в случае, например:

greetingTo=Have Param, saying hello {0}

Вы можете объявить два метода, например, где RB - это экземпляр ResourceBundle:

/**This is a method that takes the param to substitute the placeholder**/
public String getString(String key, Object... params  ) {
    try {
        return MessageFormat.format(this.RB.getString(key), params);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
}

/**Without a param, this will derectly delegate to ResourceBundle#getString**/
public String getString(String key) {
    try {
        return this.RB.getString(key);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
}