Действительно снабдить пакеты в строковой замене поддержки Java во время выполнения?

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

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

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

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

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

Дать результат

"У Вас в настоящее время есть 3 учетных записи".

38
задан benstpierre 15 March 2010 в 22:56
поделиться

5 ответов

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

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
64
ответ дан 27 November 2019 в 03:24
поделиться

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

Если вы используете JSP / JSTL , то для этого можно объединить и , что использует ResourceBundle и MessageFormat под обложками.

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

10
ответ дан 27 November 2019 в 03:24
поделиться

В 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.

3
ответ дан 27 November 2019 в 03:24
поделиться

Есть разные способы, в зависимости от технологии представления, которую вы используете. Если вы используете "простую ванильную" 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>

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

6
ответ дан 27 November 2019 в 03:24
поделиться

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

String.format(bundle.getString("example.dynamicresource"), accountCount);
0
ответ дан 27 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: