Dynamischer Zugriff auf i18n.properties mit OGNL in Struts 2

In Struts 2 ist es, wie in jedem anderen guten MVC-Framework auch, sehr einfach moeglich Texte zu lokalisieren. Darunter versteht man in Fachkreisen das Auslagern von Texten aus den JSP-Seiten in Propertie-Dateien. Das bietet den Vorteil der Internationalisierbarkeit. Englische Texte koennen in der Datei “package_en.properties” abgelegt werden und deutsche Texte in der Datei “package_de.properties”. Je nachdem welches Locale in der HTTP-Session abgelegt ist greift das Framework entweder auf die deutsche Datei oder auf die englische Datei zu.
Eine Propertie-Datei besteht aus Schluesseln und Werten

firstname=Vorname
lastname=Nachnam

Der Zugriff auf die Texte ist in Struts 2 mit dem folgenden Tag moeglich.

<s:text name="firstname"/>

Der Tag wird, sofern der Schluessel “firstname” in einer Propertie-Datei gefunden wird, durch den Wert “Vorname” ersetzt. Wenn der Schluessel in keiner Propertie-Datei gefunden wird, gibt das Framework den Schluessel als Text aus. Also “firstname”.
Struts 2 benutzt OGNL (Object-Graph-Navigation-Language) um auf die Werte einer Action-Klasse aus einer JSP Seite zu zugreifen. Irgendwann bin ich auf die Idee gekommen mit dynamischen Werten auf die Propertie-Dateien zu zugreifen. Mein erster naiver Versuch sah wie folgt aus.

<s:text name="%{dayOfWeek}"/>

Das hat leider nicht funktioniert, die Seite konnte nicht gerendert werden. Nach einigem Forschen in der OGNL Docu bin ich auf die richtige Loesung gekommen.

<s:text name="%{#attr['dayOfWeek']}"/>

Das funktioniert natuerlich nur wenn der Wert auf dem Stack liegt und die entsprechende Action-Klasse einen Getter “getDayOfWeek()” bereitstellt.
In JSF ist so ein dynamischer Zugriff auf Propertie Dateien aus einer JSP oder XHTML-Seite heraus nicht moeglich. In einer JSF Applikation wuerde man in der ManagedBean auf die Propertie-Datei zugreifen und den Wert ueber eine Variable zur Verfuegung stellen. So das die JSP/XHTML-Seite ueber die Variable Zugriff erlangt.
Das Ergebniss waere das selbe. Jedoch finde ich die Loesung mit OGNL viel eleganter.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s