Ответ 1
Не без использования класса MessageFormat, например:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
Можете ли вы сделать следующее с Java ResourceBundle?
В файле свойств...
example.dynamicresource=You currently have {0} accounts.
Во время выполнения...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
Чтобы дать результат
"В настоящее время у вас 3 аккаунта".
Не без использования класса MessageFormat, например:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
По своему усмотрению ResourceBundle
не поддерживает заполнители свойств. Обычная идея - взять строку, которую вы получаете из пакета, и вставить ее в MessageFormat
, а затем использовать ее для получения вашего параметризованного сообщения.
Если вы используете JSP/JSTL, вы можете комбинировать <fmt:message>
и <fmt:param>
, чтобы использовать ResourceBundle
и MessageFormat
под обложками.
Если вы используете Spring, то он имеет ResourceBundleMessageSource
, который делает что-то подобное и может использоваться в любом месте вашей программы. Эта абстракция MessageSource
(в сочетании с MessageSourceAccessor
) намного удобнее, чем ResourceBundle
.
Существуют различные способы, в зависимости от используемой технологии просмотра. Если вы используете "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>
Лучше всего просто ознакомиться с документацией о технологии/структуре, которую вы используете (или рассказать об этом здесь, чтобы мы могли дать более подходящие и более подробные ответы).
У 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
.
Я не думаю, что вы можете сделать эту работу для файла свойств, отличного от английского.
Мой файл 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() не подходит
Я не верю, что ResourceBundle может сделать это сам, но String может:
String.format(bundle.getString("example.dynamicresource"), accountCount);
Помните, что при использовании MessageFormat.format()
вам нужно использовать двойную кавычку (''
) в вашем ресурсном пакете, если вы хотите выразить одиночную кавычку ('
).
Формат 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 + "]";
}
}