Поддерживают ли пакеты ресурсов в Java замену строк во время выполнения?

StackOverflow https://stackoverflow.com/questions/2451049

  •  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 + "]";
    }
} 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top