Интернационализация в JSF 2.0 - PullRequest
       10

Интернационализация в JSF 2.0

5 голосов
/ 10 сентября 2011

Мне интересно, как интернационализация работает в JSF?Я читал об этом на coreservlets.com учебник, но в моем случае он работает немного по-другому.В этом уроке говорилось, что мне нужно использовать

FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale);

в actionListener (слушатель для изменения локали), а также компонент поддержки должен иметь свойство getCurrentLocale() для использования в теге <f:view>.

У меня есть 2 файла свойств с сообщениями (по умолчанию и с указанным языком), они зарегистрированы в faces-config.xml.<f:view> тег у меня есть только на одной странице (index.xhtml)

<f:view locale="#{bean.locale}">
...
</f:view>

Также у меня есть 2 кнопки (с actionListener) для каждой локали.В бэк-бине я просто изменяю текущую переменную локали (не используйте getViewRoot().setLocale(newLocale)).Но локаль меняется для всех страниц (даже если они не имеют <f:view locale="#{bean.locale}">)

1 Ответ

22 голосов
/ 10 сентября 2011

Допустим, у вас есть следующие два файла сообщений

    messages.properties
    messages_de.properties

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

1-Вы можете разрешить браузеру выбирать язык.

Установить стандартные и поддерживаемые локали в WEB-INF/faces-config.xml:

<faces-config>
   <application>
      <locale-config>
         <default-locale>en</default-locale>
         <supported-locale>de</supported-locale>
      </locale-config>
  </application>
</faces-config>

Когда браузер подключается к вашему приложению, он обычно включает значение Accept-Language в заголовке HTTP

2 - Вы можете установить локаль программно.

Вызовите метод setLocale объекта UIViewRoot:

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
viewRoot.setLocale(new Locale("de"));

3-Вы можете установить локаль для отдельной страницы
Используя элемент f:view с атрибутом locale, например:

<f:view locale="de">

Локаль может быть установлена ​​динамически:

<f:view locale="#{user.locale}"/>


Объявление пакетов сообщений
Теперь, когда языковой стандарт установлен, вы можете использовать один из следующих двух способов объявления пакетов сообщений

1-Via Face-Config Самый простой способ - предоставить файл с именемface-config.xml в каталог WEB-INF вашего приложения со следующим содержимым:

<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
   version="2.0">
   <application>
      <resource-bundle>
         <base-name>com.corejsf.messages</base-name>
         <var>msgs</var>
      </resource-bundle>
   </application>
</faces-config>

2-На каждой странице JSF, к которой требуется доступ. Вместо того чтобы использовать глобальное объявление пакета ресурсов, вы можете добавить элемент f: loadBundle к каждой странице JSF, для которой требуется доступ к пакету, например:

<f:loadBundle basename="com.corejsf.messages" var="msgs"/>

В любом случае сообщения в комплекте доступны через переменную карты с именем msgs.

Отображение соответствующей метки на кнопке Теперь допустим, что файл свойств по умолчанию, т.е. в английском есть свойство

next=Next

и у немца есть эквивалент, т.е.

next=Weiter

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

<h:commandButton value="#{msgs.next}"/>

Вышеуказанный ответ извлечен и изменен из Книга Hortsmen Core Java Server Faces .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...