Классы 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 в файлы сообщений.