Можно ли сделать следующее с 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 , то для этого можно объединить
и
, что использует ResourceBundle
и MessageFormat
под обложками.
Если вы используете Spring , тогда у него есть ResourceBundleMessageSource
, который делает нечто подобное , и его можно использовать в любом месте вашей программы. Эта абстракция MessageSource
(в сочетании с MessageSourceAccessor
) намного удобнее в использовании, чем ResourceBundle
.
В Struts есть хорошая утилита под названием MessageResources
, которая делает именно то, о чем вы просите.....
e.g.
MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);
Limitation Она позволяет использовать только максимум 3 параметра (т.е. атрибут ресурса, param1, ..., param3).
Я предлагаю использовать MessageFormat (если вы хотите использовать более 3 значений параметров), как предложил Дэвид Сайкс.
PS метод getResources
доступен только в классе Struts Action
.
Есть разные способы, в зависимости от технологии представления, которую вы используете. Если вы используете "простую ванильную" 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>
Лучше всего просто обратиться к документации технологии/фреймворка, который вы используете (или рассказать об этом здесь, чтобы мы могли дать более подходящие и более подробные ответы).
Я не думаю, что ResourceBundle может сделать это сам, но String может:
String.format(bundle.getString("example.dynamicresource"), accountCount);