Классы 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 commentscomments.one=This element contains one commentcomments.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 в файлы сообщений.