# JSF: locale verliert Wert nach Navigation



## daily (12. Mrz 2009)

Hallo zusammen.

Folgendes Problem:
Ich setze per 		

```
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 (12. Mrz 2009)

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


----------



## Terminator (12. Mrz 2009)

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 (12. Mrz 2009)

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.


```
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):


```
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:


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

Die Initialisierung läuft so:

```
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.


----------



## gex (12. Mrz 2009)

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:

```
<f:view locale="#{bean.selectedLocale}">
```


----------



## Terminator (12. Mrz 2009)

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 (13. Mrz 2009)

gex hat gesagt.:


> 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:
> 
> ```
> ...



Super, Danke!



Terminator hat gesagt.:


> 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


----------

