Mehrsprachigkeit

Status
Nicht offen für weitere Antworten.

inspector_71

Mitglied
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

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

ms
 

ms

Top Contributor
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

Mitglied
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
 

inspector_71

Mitglied
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

Top Contributor
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.

Code:
	/**
	 * Initialization of the servlet. 

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

ms
 
G

Gast

Gast
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.
 
G

Guest

Gast
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.
 
G

Guest

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

:p
 

ms

Top Contributor
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

Bekanntes Mitglied
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.
 
G

Guest

Gast
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?

:)
 
G

Guest

Gast
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...
 
G

Guest

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

:!:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben