# Mehrsprachigkeit



## inspector_71 (11. Sep 2007)

Guten Morgen!

Also, für eine Web-Applikation soll ich die Sprachen Deutsch und Englisch anbieten.

Arbeit mit Servlets, JSP und EJBs.

Auf der Startseite besteht die Möglichkeit einen "english-version" Link anzuklicken, dann wird die Startseite erneut aufgerufen, mit einem Parameter ?language=english

Habe ein Servlet erstellt, welches zuerst aufgerufen wird und dann an die Start.jsp Seite weiter leitet. IN diesem Servlet habe ich eine Methode implementiert, in der die Language abgefragt wird, beim ersten Aufruf ist language null, dass heißt defaultmäßig deutsch.

In dieser Methode weise ich sämtliche Buttons, Texte usw. zu, entweder in deutsch oder in englisch, in den JSP Seiten habe ich dann z.B: <%=session.getAttribute("button_pwd") %> für den Button stehen, einmal wird der Pfad für die englische Grafik zugewiesen, oder eben der Pfad für die Deutsche Grafik...

Nun meine Frage: Was hält ihr von dieser Lösung, mir ist keine Andere eingefallen...

Vielen Dank,
John


----------



## ms (11. Sep 2007)

Verwendest du nur Servlets und Jsp's oder ein Framework wie Struts oder JSF?

ms


----------



## inspector_71 (11. Sep 2007)

hi ms!

nur Serlvets, JSP und EJB...


----------



## ms (11. Sep 2007)

Schau dir mal ResourceBundles an.
Und für JSP's wären da die JSTL-Format-Libraries zu empfehlen.

ms


----------



## inspector_71 (11. Sep 2007)

Vielen Dank!

Aber, generell, ist meine Lösung halbwegs passabel oder soll ich alles umschreiben?

:-(


----------



## ms (11. Sep 2007)

Kommt drauf an wieviele Servlets und JSP's du hast. ResourceBundles sind halt der Standardweg um sowas zu realisieren. Ausserdem schickt der Browser sowieso die eingestellte Sprache des Browsers mit. Es ist also in der Regel nicht mehr unbedingt notwendig dies vom Benutzer am Beginn aussuchen zu lassen. 

Aber um deine Frage zu beantworten: So wie ich das sehe, speicherst du dir alle Texte in der Session. Ich halte es für sehr fragwürdig, für jeden Benutzer, alle Texte in der jeweils gewünschten Sprache in der Session zu halten.

ms


----------



## inspector_71 (11. Sep 2007)

danke ms, wegen der sessions war ich mir sowieso nicht sicher, wusste nur nicht wohin ich sie sonst speichern sollte... ))
werde mir mal deinen tipp ansehen, vielen dank nochmals


----------



## ms (11. Sep 2007)

Der ApplicationContext bietet sich hier an.

ms


----------



## inspector_71 (11. Sep 2007)

ApplicationContext
Du meinst zum Abspeichern? Hmm, wie kann ich das denn verstehen, was meinst du unter ApplicationContext?


PS: Bin eigentlich ein ABAP Entwickler, deshalb meine vielleicht etwas naive Fragestellung :-D


----------



## ms (12. Sep 2007)

Sorry, wenn das nicht ganz klar war. Ich meinte den ServletContext.
In der init()-Methode des Servlets dem ServletContext ein Attribut zuweisen.
Z.B. eine Map mit verschiedenen Locales als key und den dazugehörigen Listen mit Texten als values.


```
/**
	 * Initialization of the servlet. 

	 *
	 * @throws ServletException if an error occure
	 */
	public void init() throws ServletException {
		getServletContext().setAttribute("...", "...");
	}
```

ms


----------



## Gast (12. Sep 2007)

Naja, auch nicht so gut. Was spricht gegen das jeweilige Neuladen des Bundles pro Request? Zur Not kannst du noch nen eigenen Cache mit reinprogrammieren.

Ich würde das auch nicht in der init()-Methode eines Servlets machen - da muss sichergestellt werden. dass der erste Request über das Servlet geht. Stattdessen nimm lieber einen ServletContextListener, der beim Start und Stop der Anwendung aufgerufen wird.


----------



## Guest (12. Sep 2007)

Naja, auch nicht so gut. Was spricht gegen das jeweilige Neuladen des Bundles pro Request? Zur Not kannst du noch nen eigenen Cache mit reinprogrammieren.

Ich würde das auch nicht in der init()-Methode eines Servlets machen - da muss sichergestellt werden. dass der erste Request über das Servlet geht. Stattdessen nimm lieber einen ServletContextListener, der beim Start und Stop der Anwendung aufgerufen wird.


----------



## Guest (12. Sep 2007)

ok, soweit so gut, aber was ist genau ein ServletContextListener?


----------



## ms (12. Sep 2007)

Gast hat gesagt.:
			
		

> Naja, auch nicht so gut. Was spricht gegen das jeweilige Neuladen des Bundles pro Request? Zur Not kannst du noch nen eigenen Cache mit reinprogrammieren.
> 
> Ich würde das auch nicht in der init()-Methode eines Servlets machen - da muss sichergestellt werden. dass der erste Request über das Servlet geht. Stattdessen nimm lieber einen ServletContextListener, der beim Start und Stop der Anwendung aufgerufen wird.


Das Neuladen des Bundles pro Request ist ja noch schlimmer als pro Session.

Bitte klär mich auf was du genau meinst. Der Request geht doch immer über das Servlet.

ms


----------



## Ralf Ueberfuhr (16. Sep 2007)

Pro Session heißt aber auch, dass diese Daten persistent gehalten werden, im Cluster synchronisiert werden müssen etc. In der Session dürfen nur serialisierbare Objekte stecken, und ResourceBundles gehören nicht unbedingt dazu.

Ein ServletContextListener ist ein Listener, der beim Erzeugen und Zerstören des ServletContext benachrichtigt wird. Der Programmierer implementiert dieses Interface und registriert seine Klasse in der web.xml.

So lädst du das ResourceBundle nur einmal PRO ANWENDUNG.


----------



## Guest (19. Okt 2007)

Also, hab das mal per ResourceBundle gelöst, mit entsprechenden properites Dateien, wo die eigentlichen Texte drinnen stehen.

Nun meine Frage, ich hab etliche jsp Files, die entsprechend der Sprache unterschiedliche Buttons und Texte ausgeben.

Muss ich das dann jeweils so schreiben:

Ist jetzt ein Pfad für eine Grafik.

<%=bundle.getString("button_register")%>


Wenn das so ist dann muss ich ResourceBundle irgendwo speichern, richtig (in der session?)?

Oder soll ich es jedes mal aufs neue laden mit  ResourceBundle bundle = ResourceBundle.getBundle( baseName ); 

Wisst ihr was ich meine?


----------



## Guest (19. Okt 2007)

So in etwa, da speicher ich die Texte in der Session, ist das ok?

messages = ResourceBundle.getBundle("WebMessages",	
         locale); 	
session.setAttribute("messages", messages);

und in den jsp Seiten:

<% ResourceBundle messages = (ResourceBundle)session.getAttribute("messages"); %>

und dann werden die Texte entsprechend ausgegeben:

<td>*<%=messages.getString("login_name")%>*</td>	
<td>*<%=messages.getString("description")%>*</td>	

usw...


----------



## Guest (19. Okt 2007)

Blödsinn, geht gar nicht, ResourceBundle ist non-serializable!

 :!:


----------

