Jsf-internationalization

提供:Dev Guides
移動先:案内検索

JSF-国際化

国際化は、ステータスメッセージ、GUIコンポーネントラベル、通貨、日付をプログラムにハードコーディングしない手法です。 代わりに、リソースバンドルのソースコードの外部に保存され、動的に取得されます。 JSFは、リソースバンドルを処理する非常に便利な方法を提供します。

JSFアプリケーションを内部化するには、次の手順が必要です。

ステップ1:プロパティファイルを定義する

各ロケールのプロパティファイルを作成します。 名前は<file-name> _ <locale> .properties形式である必要があります。

デフォルトのロケールはファイル名で省略できます。

messages.properties

greeting = Hello World!

messages_fr.properties

greeting = Bonjour tout le monde!

ステップ2:faces-config.xmlを更新する

faces-config.xml

<application>
   <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>fr</supported-locale>
   </locale-config>

   <resource-bundle>
      <base-name>com.finddevguides.messages</base-name>
      <var>msg</var>
   </resource-bundle>
</application>

ステップ3:リソースバンドル変数を使用する

home.xhtml

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

応用例

テストJSFアプリケーションを作成して、JSFの国際化をテストしましょう。

Step Description
1 Create a project with a name helloworld under a package com.finddevguides.test as explained in the JSF - First Application chapter.
2 Create resources folder under src → mai folder.
3 Create com folder under src → main → resources folder.
4 Create finddevguides folder under src → main → resources → com folder.
5 Create messages.properties file under src → main → resources → com → finddevguides folder. Modify it as explained below.
6 Create messages_fr.properties file under src → main → resources → com → finddevguides 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.finddevguides.test as explained below.
9 Modify home.xhtml as explained below. Keep the rest of the files unchanged.
10 Compile and run the application to make sure the business logic is working as per the requirements.
11 Finally, build the application in the form of war file and deploy it in Apache Tomcat Webserver.
12 Launch your web application 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">

   <application>
      <locale-config>
         <default-locale>en</default-locale>
         <supported-locale>fr</supported-locale>
      </locale-config>

      <resource-bundle>
         <base-name>com.finddevguides.messages</base-name>
         <var>msg</var>
      </resource-bundle>
   </application>
</faces-config>

UserData.java

package com.finddevguides.test;

import java.io.Serializable;
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
public class UserData implements Serializable {
   private static final long serialVersionUID = 1L;
   private String locale;

   private static Map<String,Object> countries;
      static {

      countries = new LinkedHashMap<String,Object>();
      countries.put("English", Locale.ENGLISH);
      countries.put("French", Locale.FRENCH);
   }

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

   public String getLocale() {
      return locale;
   }

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

  //value change event listener
   public 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>Internalization 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>

すべての変更を完了したら、JSF-最初のアプリケーションの章で行ったようにアプリケーションをコンパイルして実行します。 すべてがアプリケーションで問題ない場合、次の結果が生成されます。

JSF国際化結果

ドロップダウンから言語を変更します。 次の出力が表示されます。

JSF国際化結果1