Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Предоставление локализованных сообщений и меток

Сообщения и метки должны быть адаптированы в соответствии с языком и регионом пользователя. Существует два подхода к предоставлению локализованных сообщений и меток в веб-приложении.

  • Укажите версию веб-страницы в каждой из целевых локалей и попросите сервлет контроллера отправить запрос на соответствующую страницу в зависимости от запрашиваемой локали. Этот подход полезен, если необходимо интернационализировать большие объёмы данных на странице или во всём веб-приложении.

  • Изоляция любых чувствительных к локали данных на странице в bundle-ресурсы и обращение к ним, чтобы соответствующее переведённое сообщение автоматически выбиралось и вставлялось на страницу. Таким образом, вместо создания строк непосредственно в вашем коде, вы создаёте пакет ресурсов, который содержит переводы, и читаете переводы из этого пакета, используя соответствующий ключ.

Приложение Duke's Bookstore следует второму подходу. Вот несколько строк из bundle-ресурса по умолчанию messages.properties:

TitleShoppingCart=Shopping Cart
TitleReceipt=Receipt
TitleBookCatalog=Book Catalog
TitleCashier=Cashier
TitleBookDescription=Book Description
Visitor=You are visitor number
What=What We\'re Reading

Создание Локали

Чтобы получить подходящие для данного пользователя строки, веб-приложение либо извлекает локаль (заданную в языковых настройках браузера) из запроса, используя метод getLocale, либо позволяет пользователю явно выбрать локаль.

Компонент может явно установить локаль с помощью тега fmt:setLocale.

Элемент locale-config в файле конфигурации регистрирует локаль по умолчанию, а также регистрирует другие поддерживаемые локали. Этот элемент в Duke's Bookstore регистрирует английский язык как язык по умолчанию и указывает, что поддерживаются также немецкий, французский и испанский языки.

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

LocaleBean в приложении Duke's Bookstore использует метод getLocale для получения локали.

public class LocaleBean {

    ...
    private FacesContext ctx = FacesContext.getCurrentInstance();
    private Locale locale = ctx.getViewRoot().getLocale();;

    ...
}

Настройка bundle-ресурса

Bundle-ресурс устанавливается с помощью элемента resource-bundle в файле конфигурации. Настройка для Duke's Bookstore выглядит следующим образом:

<resource-bundle>
    <base-name>
        javaeetutorial.dukesbookstore.web.messages.Messages
    </base-name>
    <var>bundle</var>
</resource-bundle>

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

public String toString(Locale locale) {
    ResourceBundle res =
        ResourceBundle.getBundle(
            "javaeetutorial.dukesbookstore.web.messages.Messages", locale);
    return res.getString(name() + ".string");
}

Кроме того, приложение может использовать тег f:loadBundle для установки bundle-ресурса. Этот тег загружает корректныц bundle-ресурс в соответствии с локалью, хранящейся в FacesContext.

<f:loadBundle basename="javaeetutorial.dukesbookstore.web.messages.Messages"
    var="bundle"/>

Bundle-ресурсы, содержащие сообщения, на которые явно ссылаются из атрибута тега JavaServer Faces с использованием выражения значения, должны быть зарегистрированы с использованием элемента resource-bundle в файле конфигурации.

Для получения дополнительной информации об использовании этого элемента см. Регистрация сообщений приложения.

Получение локализованных сообщений

Веб-компонент, написанный на Java, получает bundle-ресурс из сессии:

ResourceBundle messages = (ResourceBundle)session.getAttribute("messages");

Затем он ищет строку, связанную с ключом person.lastName, следующим образом:

messages.getString("person.lastName");

Вы можете использовать тег message или messages только для отображения сообщений, помещённых в очередь в компоненте в результате регистрации конвертера или валидатора в компоненте. В следующем примере показан тег message, который отображает сообщение об ошибке, поставленное в очередь во входном компоненте userNo, если зарегистрированный в компоненте валидатор не может проверить значение, введённое пользователем в компонент.

<h:inputText id="userNo" value="#{userNumberBean.userNumber}">
    <f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
...
<h:message style="color: red; text-decoration: overline"
           id="errors1" for="userNo"/>

Для получения дополнительной информации об использовании тегов message и messages см. Отображение сообщений об ошибках с тегами h:message и h:messages.

На сообщения, которые не поставлены в очередь компонента и поэтому не загружаются автоматически, ссылаются с помощью выражения значения. Вы можете ссылаться на локализованное сообщение практически из любого атрибута тега JavaServer Faces.

Выражение значения, которое ссылается на сообщение, имеет одинаковую нотацию, независимо от того, загрузили ли вы bundle-ресурс тегом loadBundle или зарегистрировали его с помощью элемента resource-bundle в файле конфигурации.

Нотацией выражения значения является var.message, в которой var соответствует атрибуту var тега loadBundle или элемент var определён в элементе resource-bundle файла конфигурации, а message соответствует ключу сообщения, содержащемуся в пакете ресурсов, который упоминается с помощью атрибута var.

Вот пример из bookcashier.xhtml в Duke's Bookstore:

<h:outputLabel for="name" value="#{bundle.Name}" />

Обратите внимание, что bundle соответствует элементу var из файла конфигурации, а Name соответствует ключу в bundle-ресурсе.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)