Статьи

Интеграция Spring & JSF: интернационализация и локализация

Если вы работаете с приложением JSF, ориентированным на несколько языков, вы, возможно, хорошо знакомы с тегом <f: loadBundle> . Даже если ваше приложение не поддерживает интернационализацию с использованием пакетов сообщений, это, вероятно, хорошая идея. Под капотом тег <f: loadBundle> читает сообщения из Java java.util.ResourceBundle, и, хотя это будет работать, разработчики Spring часто предпочитают интерфейс org.springframework.context.MessageSource .

В качестве альтернативы <f: loadBundle> я разрабатывал новый компонент <s: messageSource>, который можно использовать для представления сообщений из любого Spring MessageSource , а также предлагал несколько других преимуществ.

Новый компонент является заменой для <f: loadBundle> .

1
2
3
4
<s:messageSource source="#{messageSource}" var="messages"/>
<p>
  <h:outputText value="#{messages.hello}"/>
</p>

Атрибутом источника может быть любое выражение EL, которое разрешается в экземпляр MessageSource . Если источник не указан, будет использоваться Spring ApplicationContext . Атрибут var — это имя переменной, которая будет использоваться для доступа к сообщениям.

В отличие от стандартного JSF, ключ загружаемого сообщения будет построен из идентификатора отображаемой страницы. Например, если предположить, что страница выше взята из файла WEB-INF / pages / messages / simple.xhtml , ключом, используемым для загрузки приветственного сообщения, будет pages.messages.simple.hello . Использование этих составных ключей предотвращает конфликты ключей сообщений и делает разметку страницы красивой и лаконичной. Вы можете использовать атрибут префикса, чтобы переопределить это поведение, если вам нужно.

Если вы сделаете ссылку на сообщение в своем XHTML, которое вы забыли определить, вы либо увидите предупреждающее сообщение (в процессе разработки), либо возникнет исключение (в процессе разработки).

Как и в стандартном JSF, ваши сообщения и заполнители для использования с <h: outputFormat>

1
pages.message.simple.welcome=Welcome to {1} with {0}
1
2
3
4
<h:outputFormat value="#{messages.welcome}">
  <f:param value="Spring"/>
  <f:param value="JSF"/>
</h:outputFormat>

Тег <h: outputFormat> немного многословен, поэтому для удобства сообщения Spring можно использовать как Map s. Это позволяет вам ссылаться на заполнители гораздо более кратко:

1
<h:outputText value="#{messages.welcome['Spring']['JSF']}"/>

Тот же синтаксис позволяет отображать объекты Java на сообщения. По умолчанию объекты сопоставляются путем создания ключа сообщения из имени класса. Например, следующий класс:

1
2
3
package org.example;
public class ExampleObject {
}

Можно ссылаться в JSF:

1
<h:outputText value="#{messages[exampleInstance]}"/>

Разрешение на следующее сообщение:

1
org.example.ExampleObject=example

Для объектов enum ключ сообщения включает имя enum, а также класс:

1
2
3
4
5
package org.example;
public enum ExampleObject {
  ONE, //mapped to message key org.example.ExampleObject.ONE
  TWO  //mapped to message key org.example.ExampleObject.TWO
}

Объектные сообщения также могут ссылаться на свойства, которые должны составлять часть сообщения:

1
2
3
4
5
6
7
8
9
org.example.PersonName=Name is {first} {last}
...
 
package org.example;
public class PersonName {
  ...
  public String getFirst() {...}
  public String getLast() {...}
}

Вы также можете определить свои собственные стратегии объектных сообщений, используя источник сообщений, который реализует интерфейс org.springframework.springfaces.message.ObjectMessageSource .

Если вы хотите проверить любой из этого кода, взгляните на пакеты org.springframework.springfaces.message и org.springframework.springfaces.message.ui из проекта GitHub .

Ссылка: Интеграция Spring & JavaServer Faces: Интернационализация и локализация от нашего партнера JCG Филиппа Уэбба в блоге Фила Уэбба в блоге.