Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Internationalization in JSF 2.0

I'm wondering how internationalization works in jsf? I have read tutorial on coreservlets.com about it, but in my case it works slightly differently. In that tutorial said that i have to use

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

in actionListener(listener for changing locale) and also backing bean has to have property getCurrentLocale() to use it in <f:view> tag.

I have 2 property files with messages(default and with specified locale), they are registered in faces-config.xml. <f:view> tag I have only at one page(index.xhtml)

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

Also I have 2 buttons(with actionListener) for each locale. In backing bean I simply modify current locale variable(don't use getViewRoot().setLocale(newLocale)). But locale changes for all pages(even if they don't have <f:view locale="#{bean.locale}">)

like image 514
maks Avatar asked Sep 09 '11 23:09

maks


1 Answers

Lets say you have following two messages files

    messages.properties
    messages_de.properties

Setting the Application Locale
There are three ways of setting the Application Locale and I think you need the first one here.

1-You can let the browser choose the locale.

Set the default and supported locales in 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>

When a browser connects to your application, it usually includes an Accept-Language value in the HTTP header

2-You can set the locale programatically.

Call the setLocale method of the UIViewRoot object:

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

3-You can set the locale for an individual page
By using the f:view element with a locale attribute—for example:

<f:view locale="de">

The locale can be dynamically set:

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


Declaring message bundles
Now that the Locale is set you can use one of the following two ways to declare message bundles

1-Via faces-config The simplest way is to supply a file named faces-config.xml in the WEB-INF directory of your application, with the following contents:

<?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-At each JSF page that needs access it. Instead of using a global resource bundle declaration, you can add the f:loadBundle element to each JSF page that needs access to the bundle, like this:

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

In either case, the messages in the bundle are accessible through a map variable with the name msgs.

Showing appropriate label on button Now lets say default properties file i.e english has property

next=Next

and German has equivallent i.e

next=Weiter

And you have set the locale and declared mesg bundle you can access it to put the label on a command button like

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

Above Answer is extracted and modified from Hortsmen Core Java Server Faces book.

like image 186
Shahzeb Avatar answered Nov 23 '22 17:11

Shahzeb