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}">)
Lets say you have following two messages files
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: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:
3-You can set the locale for an individual page
By using the
f:viewelement with a locale attribute—for example:The locale can be dynamically set:
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:
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:
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
and German has equivallent i.e
And you have set the locale and declared mesg bundle you can access it to put the label on a command button like
Above Answer is extracted and modified from Hortsmen Core Java Server Faces book.