Поддерживают ли пакеты ресурсов в Java замену строк во время выполнения?
-
20-09-2019 - |
Вопрос
Можете ли вы сделать следующее с помощью Java ResourceBundle?
В файле свойств...
example.dynamicresource=You currently have {0} accounts.
Во время выполнения...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
Чтобы дать результат
«В настоящее время у вас есть 3 аккаунта».
Решение
Не без использования Формат сообщения класс, например:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
Другие советы
Самостоятельно, ResourceBundle
не поддерживает заполнители свойств.Обычная идея состоит в том, чтобы взять строку, полученную из комплекта, и вставить ее в MessageFormat
, а затем используйте его для получения параметризованного сообщения.
Если вы используете JSP/JSTL, то вы можете объединить <fmt:message>
и <fmt:param>
для этого используется ResourceBundle
и MessageFormat
под одеялом.
Если вы случайно используете Весна, то он имеет ResourceBundleMessageSource
который делает что-то подобное, и может использоваться в любом месте вашей программы.Этот MessageSource
абстракция (в сочетании с MessageSourceAccessor
) гораздо приятнее использовать, чем ResourceBundle
.
Существуют различные способы, в зависимости от используемой вами технологии просмотра.Если вы используете «простую ванильную» Java (например.Swing), затем используйте MessageFormat
API, как было сказано ранее.Если вы используете платформу веб-приложений (что верно, если я правильно оцениваю историю ваших вопросов), то способ зависит от используемой вами технологии просмотра и/или структуры MVC.Если это, например, «простой ванильный» 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 параметра (т.е.атрибут ресурса, параметр1, ..., параметр3).
Я предлагаю использовать Формат сообщения (если вы хотите использовать более трех значений параметров), как предложил Дэвид Сайкс.
ПС тот getResources
метод доступен только в Struts Action
сорт.
Я не думаю, что вы сможете сделать это для файла свойств, не являющегося английским.
В моем файле message.properties есть следующая строка:
info.fomat.log.message.start=Начинаем анализировать сообщение журнала в формате {0}.
И в моем файле message_fr_FR.properties есть следующая строка:
info.fomat.log.message.start=Формат части анализатора сообщения {0}.
Этот код работает только для английского языка.
String.format((String) messages .getString(GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));
Оно делает НЕТ замените заполнитель значением, если мой язык/язык французский :-(
Даже MessageFormat.fomat() бесполезен
Я не верю, что ResourceBundle может сделать это сам, но String может:
String.format(bundle.getString("example.dynamicresource"), accountCount);
Помните, что при использовании MessageFormat.format()
вам нужно использовать двойную кавычку (''
) в вашем пакете ресурсов, если вы хотите выразить одинарную кавычку ('
).
Формат сообщения#формат будет работать для такого случая:
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 + "]";
}
}