Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 3
  • 242

Po zdefiniowaniu  language properties i zdefiniowaniu locale-config w faces-config, znalazłem taki kod do obsługi przełączania języków z poziomu aplikacji (ManagedBean dla języków):

 

import java.io.Serializable;
import java.util.Locale;
import java.util.logging.Logger;

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



/**
 * Used for managing i18n in application for each user
 * @author Krzysztof Grajek
 *
 */
@ManagedBean
@SessionScoped
public class LanguageSwitcher implements Serializable {

    private static final long serialVersionUID = 2756934361134603857L;
    private static final Logger LOG = Logger.getLogger(LanguageSwitcher.class.getName());
   
    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }


    public void changeLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }
   
}

 

I fragmencik kodu do zmieniania języków z poziomu strony xhtmla:

 

<h3>Language switcher:</h3>
               <h:form id="langauge_form">
                  <h:commandLink action="#{languageSwitcher.changeLanguage('pl')}" value="Polski" /> |
                  <h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" />
               </h:form>

 

Jednak powyższy zestaw pozwala jedynie na zmianę języków na stronie xhtmla, na której aktualnie jesteśmy. Pytanie: jak sprawić, by raz wybrana zmiana zastosowała się do całej aplikacji/wszystkich podstron xhtmla?

 

Bartosz_Cichowicz
  • Zapytał
  • @ Bartosz_Cichowicz | 18.10.2014
    • 14
    • 1
    • 3

Odpowiedzi (3)

  • 11

Wystarczy w każdym facelecie dodać znacznik:

<f:view locale="#{languageSwitcher.locale}" />
  • Odpowiedział
  • @ | 18.10.2014
  • TRENER MODERATOR ALTKOM AKADEMII
Komentarze
dziękuje! nie zwróciłem na to uwagi
wszystko teraz działa
Skomentował : @ Bartosz_Cichowicz ,18.10.2014
  • 14
  • 1
  • 3
  • 0

Jednak pojawił się dalszy błąd niemożliwości dostania się do beana languageSwitcher. Jako że

@SessionScoped jest wykonywane po @ViewScoped , nie mógł zainicjować tej klasy (po jednorazowym użyciu zmiany języków już wszystko działało, jednak bez użycia, po próbie przejścia na inna stronę xhtmla, pojawiał się ten błąd).

Znalazłem poradę, by użyć @PostConstruct do wymuszenia inicjalizacji klasy, jednak pojawił się inny błąd:

 

FATAL:   JSF1073: javax.faces.view.facelets.TagAttributeException caught during processing of RESTORE_VIEW 1 : UIComponent-ClientId=, Message=/manageBooks.xhtml @7,49 locale="#{languageSwitcher.locale}" An error occurred performing resource injection on managed bean languageSwitcher


FATAL:   /manageBooks.xhtml @7,49 locale="#{languageSwitcher.locale}" An error occurred performing resource injection on managed bean languageSwitcher

 

Kod wygląda tak:

 

import java.io.Serializable;
import java.util.Locale;
import javax.annotation.PostConstruct;

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


@ManagedBean
@SessionScoped
public class LanguageSwitcher implements Serializable {

   
     private Locale locale;
     
    @PostConstruct
    public void init() {
    locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
    }
    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }
  

    public void changeLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }

  }
Bartosz_Cichowicz
  • Odpowiedział
  • @ Bartosz_Cichowicz | 19.10.2014
    • 14
    • 1
    • 3
  • 11

Wydaje mi się, że problem leży w inicjalizacji wartości atrybutu locale.

Proszę spróbować zdefiniować metodę init() następująco:

 

@PostConstruct
public void init() {
    locale = new Locale("pl"); // lub inna lokalizacja domyślna
}
  • Odpowiedział
  • @ | 19.10.2014
  • TRENER MODERATOR ALTKOM AKADEMII
Komentarze
Działa!
Skomentował : @ Bartosz_Cichowicz ,19.10.2014
  • 14
  • 1
  • 3