English 中文(简体)
JSF - Internationalization
  • 时间:2024-11-03

JSF - Internationapzation


Previous Page Next Page  

Internationapzation is a technique in which status messages, GUI component labels, currency, date are not hardcoded in the program. Instead, they are stored outside the source code in resource bundles and retrieved dynamically. JSF provides a very convenient way to handle resource bundle.

Following steps are required to internapze a JSF apppcation.

Step 1: Define properties files

Create properties file for each locale. Name should be in <file-name>_<locale>.properties format.

Default locale can be omitted in file name.

messages.properties

greeting = Hello World!

messages_fr.properties

greeting = Bonjour tout le monde!

Step 2: Update faces-config.xml

faces-config.xml

<apppcation>
   <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>fr</supported-locale>
   </locale-config>
   
   <resource-bundle>
      <base-name>com.tutorialspoint.messages</base-name>
      <var>msg</var>
   </resource-bundle>
</apppcation>

Step 3: Use resource-bundle var

home.xhtml

<h:outputText value = "#{msg[ greeting ]}" />

Example Apppcation

Let us create a test JSF apppcation to test internationapzation in JSF.

Step Description
1 Create a project with a name helloworld under a package com.tutorialspoint.test as explained in the JSF - First Apppcation chapter.
2 Create resources folder under src → mai folder.
3 Create com folder under src → main → resources folder.
4 Create tutorialspoint folder under src → main → resources → com folder.
5 Create messages.properties file under src → main → resources → com → tutorialspoint folder. Modify it as explained below.
6 Create messages_fr.properties file under src → main → resources → com → tutorialspoint folder. Modify it as explained below.
7 Create faces-config.xml in WEB-INFf older as explained below.
8 Create UserData.java under package com.tutorialspoint.test as explained below.
9 Modify home.xhtml as explained below. Keep the rest of the files unchanged.
10 Compile and run the apppcation to make sure the business logic is working as per the requirements.
11 Finally, build the apppcation in the form of war file and deploy it in Apache Tomcat Webserver.
12 Launch your web apppcation using appropriate URL as explained below in the last step.

messages.properties

greeting = Hello World!

messages_fr.properties

greeting = Bonjour tout le monde!

faces-config.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<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">
   
   <apppcation>
      <locale-config>
         <default-locale>en</default-locale>
         <supported-locale>fr</supported-locale>
      </locale-config>
      
      <resource-bundle>
         <base-name>com.tutorialspoint.messages</base-name>
         <var>msg</var>
      </resource-bundle>
   </apppcation>
</faces-config>

UserData.java

package com.tutorialspoint.test;

import java.io.Seriapzable;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name = "userData", eager = true)
@SessionScoped
pubpc class UserData implements Seriapzable {
   private static final long serialVersionUID = 1L;
   private String locale;

   private static Map<String,Object> countries;
      static {
      
      countries = new LinkedHashMap<String,Object>();
      countries.put("Engpsh", Locale.ENGLISH);
      countries.put("French", Locale.FRENCH);
   }

   pubpc Map<String, Object> getCountries() {
      return countries;
   }

   pubpc String getLocale() {
      return locale;
   }

   pubpc void setLocale(String locale) {
      this.locale = locale;
   }

   //value change event pstener
   pubpc void localeChanged(ValueChangeEvent e) {
      String newLocaleValue = e.getNewValue().toString();
      
      for (Map.Entry<String, Object> entry : countries.entrySet()) {
         
         if(entry.getValue().toString().equals(newLocaleValue)) {
            FacesContext.getCurrentInstance()
               .getViewRoot().setLocale((Locale)entry.getValue());         
         }
      }
   }
}

home.xhtml

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml"   
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:f = "http://java.sun.com/jsf/core">
   
   <h:head>
      <title>JSF tutorial</title>	 	
   </h:head>
   
   <h:body> 
      <h2>Internapzation Language Example</h2>
      
      <h:form>
         <h3><h:outputText value = "#{msg[ greeting ]}" /></h3>
         
         <h:panelGrid columns = "2"> 
            Language : 
            <h:selectOneMenu value = "#{userData.locale}" onchange = "submit()"
               valueChangeListener = "#{userData.localeChanged}">
               <f:selectItems value = "#{userData.countries}" /> 
            </h:selectOneMenu> 
         </h:panelGrid> 
      
      </h:form>
   </h:body>
</html>

Once you are ready with all the changes done, let us compile and run the apppcation as we did in JSF - First Apppcation chapter. If everything is fine with your apppcation, this will produce the following result.

JSF Internationapzation Result

Change language from dropdown. You will see the following output.

JSF Internationapzation Result1 Advertisements