JSF Dil Desteği nasıl yapılır?


Merhaba,

JSF'te dil desteğini nasıl yapılabildiğini anlatmaya çalışacağım.

JSF ile geliştirmiş olduğumuz bir web uygulamasının çoklu dil desteği sağlayarak daha fazla kitleye hitap etmesini isteyebiliriz. Bunun yapmamız gereken ise uygulamamıza çoklu dil desteğini sağlamalıyız. Dil desteği için properties dosyalarının oluşturmamız gerekiyor. Mantık şu şekilde hangi dilleri ekleyecek isek ona ait bir tane properties dosyası oluşturmamız gerekmektedir.




Resimde görüldüğü gibi bir messages dosyamız var ve Türkçe ve İngilizce için _tr ve _en dosyalarımız mevcut. Properties dosyasındaki çalışma mantığı Java'daki Map gibi key,value ikilisi olarak düşünülebilir. "=" sol tarafındaki key sağ tarafındaki ise value olarak işler. İşleyiş olarak tüm messages_xx.properties dosyalarında aynı key-value oluşturup dillere göre karşılığını yazıyoruz. Bu sayede uygulama içerisinden o keyi çağırdığımızda dile karşılık gelen value yu çağıracaktır.

messages_tr.properties
welcome=Hoşgeldiniz

messages_en.properties
welcome=Welcome



Tanımlamış olduğumuz bu properties dosyalarını tanımlama yapmak için faces-config.xml dosyasında aşağıdaki şekilde düzenleme yapmak gerekmektedir.
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">

    <application>
        <resource-bundle>
            <base-name>/messages</base-name>
            <var>messages</var>
        </resource-bundle>
        <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>tr</supported-locale>
        </locale-config>
    </application>
    
    
</faces-config>



index.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"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      >

    <h:body>

     <h:form>

 <h2>
            <h:outputText value="#{messages.welcome}" />
 </h2>

 <h:panelGrid columns="2">

  Language :
                <h:selectOneMenu value="#{languageController.localeCode}" onchange="submit()"
   valueChangeListener="#{languageController.countryLocaleCodeChanged}">
      <f:selectItems value="#{languageController.countriesInMap}" />
     </h:selectOneMenu>

 </h:panelGrid>

      </h:form>

    </h:body>
</html>



LanguageController.java
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

/**
 *
 * @author Omer Faruk Kurt
 * @Created on date 13/04/2017 15:36:55 
 */
@ManagedBean
public class LanguageController implements java.io.Serializable{
    private static final long serialVersionUID = -2957151240177998514L;

    private String localeCode;

 private static Map<String,Object> countries;
 static{
  countries = new LinkedHashMap<String,Object>();
  countries.put("English", Locale.ENGLISH); //label, value
  countries.put("Türkçe", new Locale("tr"));
 }

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


 public String getLocaleCode() {
  return localeCode;
 }


 public void setLocaleCode(String localeCode) {
  this.localeCode = localeCode;
 }

 public void countryLocaleCodeChanged(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());

           }
               }
 }

    
}


Sonuç olarak







Sorunsuz javalı günler

Yorum Gönder

0 Yorumlar