Статьи

Java: перемещение условий в файлы сообщений

Классы Java ResourceBundle и MessageFormat предоставляют хороший набор инструментов для разрешения локализованных сообщений в приложениях Java. В этом посте приведен небольшой пример того, как вы можете перемещать простые связанные с сообщениями условия из вашего Java-кода в файлы сообщений с помощью ChoiceFormat . Если вы уже знаете ChoiceFormat я не думаю, что вы узнаете что-то новое в этом посте. Однако, по моему опыту, многие разработчики не знают об этой милой маленькой функции.

Предположим, у нас есть приложение, в котором пользователи могут комментировать некоторые виды контента. Где-то в приложении мы хотим отобразить простое сообщение, которое показывает, как часто комментируется определенный фрагмент контента. Мы хотим показать следующие сообщения в зависимости от количества комментариев:

Количество комментариев Сообщение
0 Этот элемент не содержит комментариев
1 Этот элемент содержит один комментарий
2+ Этот элемент содержит комментарии [numberOfComments]

Для реализации этой функции с использованием Java ResourceBundle и MessageFormat мы могли бы использовать следующий код.

Файл сообщения (например, messages_en.properties ):

1
2
3
comments.no=This element contains no comments
comments.one=This element contains one comment
comments.multiple=This element contains {0} comments

Java-код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
private String resolveMessage(String key, Object... args) {
  String pattern = bundle.getString(key);
  return MessageFormat.format(pattern, args);
}
 
private String getMessage(int numberOfComments) {
  String message = null;
  if (numberOfComments == 0) {
    message = resolveMessage("comments.no");
  else if (numberOfComments == 1) {
    message = resolveMessage("comments.one");
  else {
    message = resolveMessage("comments.multiple", numberOfComments);
  }
  return message;
}

Метод resolveMessage() используется для разрешения ключа сообщения в реальном сообщении, используя ResourceBundle и MessageFormat . Для реализации запрошенной функции мы добавили три ключа сообщения в файл свойств. В getMessage() мы реализовали логику, чтобы решить, какой ключ сообщения следует использовать, основываясь на переданной переменной numberOfComments .

Метод getMessage() дает ожидаемый результат:

1
2
3
4
getMessage(0)   // "This element contains no comments"
getMessage(1)   // "This element contains one comment"
getMessage(2)   // "This element contains 2 comments"
getMessage(10)  // "This element contains 10 comments"

Однако на самом деле существует более простой способ сделать это. На самом деле мы можем переместить полную логику, реализованную в getMessage() в файл свойств.

Нам нужно определить только один ключ:

1
comments.choice=This element contains {0,choice,0#no comments|1#one comment|1<{0} comments}

Используя это сообщение, мы можем полностью удалить логику getMessage() :

1
2
3
private String getMessageUsingChoice(int numberOfComments) {
  return resolveMessage("comments.choice", numberOfComments);
}

Результат точно такой же:

1
2
3
4
getMessageUsingChoice(0)   // "This element contains no comments"
getMessageUsingChoice(1)   // "This element contains one comment"
getMessageUsingChoice(2)   // "This element contains 2 comments"
getMessageUsingChoice(10)  // "This element contains 10 comments"

Давайте внимательнее посмотрим на определенное сообщение:

  • 0, choice — сообщает MessageFormat, что мы хотим применить ChoiceFormat для первого параметра (0)
  • 0 # no comments — означает, что мы хотим использовать сообщение без комментариев, если первый параметр равен 0
  • 1 # один комментарий — возвращает один комментарий, если первый параметр равен 1
  • 1 <{0} comments — использует комментарии подшаблона {0}, если первый параметр больше 1

В заключение, выбор обеспечивает хороший способ перемещения простых условий, связанных с сообщениями, из кода Java в файлы сообщений.