JSF: locale verliert Wert nach Navigation

Status
Nicht offen für weitere Antworten.

daily

Aktives Mitglied
Hallo zusammen.

Folgendes Problem:
Ich setze per
Code:
FacesContext.getCurrentInstance().getViewRoot().setLocale(Locale.ENGLISH);
die locale auf englisch und reRender alles damit es auf englisch angezeigt wird. Wenn ich aber jetzt weiter navigiere (also auf eine andere jsp) verliert die locale ihren Wert und alles ist wieder deutsch. Warum? Und wie kann ich das ändern?

Gruß daily
 

Luu

Aktives Mitglied
Hm, wahrscheinlich ziehtsich Java auf der neuen Seite die Locale aus den gesendeten Http-Headern, einfach auf jeder seite (bzw mbean) entsprechend setzen ..
 

Terminator

Aktives Mitglied
JSF hat nen bestimmten Ablauf zur Bestimmung der Locale: JSF Locale
Must also für jede View setzen und gegenfalls gewählten Wert auch noch in irgend nem Session Objekt speichern.
 

daily

Aktives Mitglied
Erstmal Dnake für die Antworten!

Für alle die es in Zukunft vielleicht interessiert: Ich habs folgendermaßen gelöst:

1. Eine ManagedBean mit Scope "session" als SessionBean. Das ganze als Singleton und schwups hab ich nen schönen sessionweiten Speicher.

Code:
public final class SessionBean {

    private static final SessionBean instance = new SessionBean();

    private SessionBean() {}

    public static SessionBean getInstance() {
        return instance;
    }

	private Locale selectedLocale;

	public Locale getSelectedLocale() {
		return selectedLocale;
	}

	public void setSelectedLocale(Locale selectedLocale) {
		this.selectedLocale = selectedLocale;
	}
}

2. das LoginBean setzt mir die entsprechende locale in der SessionBean (Sprachauswahl erfolgt beim Login):

Code:
  Locale locale = Locale.GERMAN;
  super.getSession().setSelectedLocale(locale);
  FacesContext.getCurrentInstance().getViewRoot()
    .setLocale(locale);

P.S. "super.getSession()" deshalb weil ich die SessionBean in einer Basisklasse auf der alle meine Beans aufbauen instanziert habe.

3. Zum Beispiel in der menu.jsp steht oben:

Code:
<jsp:useBean class="de.....beans.MenuBean" id="mBean"/>
<% mBean.init(); %>

Die Initialisierung läuft so:
Code:
	private boolean localeLoaded = false;
	private boolean initialized = false;
	
	public MenuBean() {
		super();
		if (!localeLoaded) {
                        localeLoaded = true;
			FacesContext.getCurrentInstance().getViewRoot().setLocale(
				super.getSession().getSelectedLocale());			
		}
	}
	
	public String init(){			
		if (!initialized){
			initialized = true;
			return "initialized";
		}
		else return null;
	}
Durch den zurückgegebenen String wird eine redirect-Navigation auf die menu.jsp selbst getriggert. Das ist nötig weil ansonsten zwar die locale geändert ist, aber die messages noch auf der default locale stehen. Erst nachdem man irgendwas in der bean anstößt würdw auf z.B. englisch umgestellt.
Durch die booleans wird sichergestellt dass die locale nur einmal geladen und die redirect Navi nur einmal durchgeführt wird.
 
Zuletzt bearbeitet:

gex

Bekanntes Mitglied
Dass beim Login mal initial ein locale gesetzt werden muss ist soweit klar.
Sobald du ein Bean hast, welches das locale zurückgibt, kann man es aber auch ein bisschen einfacher haben:
Code:
<f:view locale="#{bean.selectedLocale}">
 

Terminator

Aktives Mitglied
genau
und da user bestimmt net imma jedesmol neu wählen will
warum dann net gleich im user object, welches dann oder irgendwann mal aus db geladen wird
 

daily

Aktives Mitglied
Dass beim Login mal initial ein locale gesetzt werden muss ist soweit klar.
Sobald du ein Bean hast, welches das locale zurückgibt, kann man es aber auch ein bisschen einfacher haben:
Code:
<f:view locale="#{bean.selectedLocale}">

Super, Danke!

genau
und da user bestimmt net imma jedesmol neu wählen will
warum dann net gleich im user object, welches dann oder irgendwann mal aus db geladen wird

Wird früher oder später sicher so gelöst werden. Allerdings entwickel ich momentan nur einen POC mit Mockdaten für die Software meiner Firma ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben