Поддерживают ли пакеты ресурсов в Java подстановку строк во время выполнения? - PullRequest
38 голосов
/ 16 марта 2010

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

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

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

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

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

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

"У вас есть 3 аккаунта."

Ответы [ 8 ]

64 голосов
/ 16 марта 2010

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

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
10 голосов
/ 16 марта 2010

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

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

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

6 голосов
/ 16 марта 2010

Существуют различные способы, в зависимости от используемой вами технологии просмотра. Если вы используете «простую ваниль» 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>

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

3 голосов
/ 16 марта 2010

В 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 (если вы хотите использовать более 3 значений параметров), как предложено Дэвидом Сайксом.

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

1 голос
/ 19 июля 2011

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

Мой файл 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 () не годится

0 голосов
/ 01 апреля 2015

Формат 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 + "]";
    }
} 
0 голосов
/ 07 октября 2013

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

0 голосов
/ 16 марта 2010

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

String.format(bundle.getString("example.dynamicresource"), accountCount);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...