Für die Internationalisierung von Web-Anwendungen bietet das Java-Webframework Struts bereits eingebaute Mechanismen und vorgefertigte Lösungen. Textbausteine werden dabei immer über einen eindeutigen Key referenziert. Die jeweilige sprachabhängige Ausprägung bestimmt ein Locale Objekt.
Standardmäßig verwendet Struts PropertyMessageResources. Dabei werden die Texte in altbekannten Properties-Dateien in Form von Key-Value Paaren gespeichert. Pro gewünschter Sprache wird dann eine solche Datei benötigt.
Möchte man nun aber andere Mechanismen nutzen (etwa in einer Datenbank gespeicherte Texte) oder Legacy-Anwendungen mit proprietären Internationaliserungs-Konzepten auf Struts umstellen, ist ein wenig mehr Aufwand nötig. Um etwa ein Alt-Anwendung umzustellen, die zwar Properties-Dateien in Struts Manier nutzt, jedoch über ein eigenes Konstrukt Konstanten innerhalb der Textbausteine platziert, könnte man neue Tags bauen oder alle Properties-Dateien anfassen. Eleganter ist es, seine eigene MessageResources zu implementieren:
(die hier vorgestellte Lösung bezieht sich auf das Struts-Framework Version 1.2.7)Da die Altanwendung ebenfalls auf Properties-Dateien setzte, bietet sich eine Erweiterung der Struts PropertyMessageResource an:
public class MyMessageResources extends PropertyMessageResources { ... @Override public String getMessage(Locale locale, String key) { String message = super.getMessage(locale, key); while(containsConstant(message)) { message = substituteConstant(message, key); } return message; } ... } |
Um das Verhalten anzupassen, muss nun lediglich die Methode getMessage der PropertyMessageResources Klasse überschrieben werden. Diese kann die ursprüngliche Message über die überschriebene Methode erfragen und entsprechend die Konstanten ersetzen. So weit so gut, aber wie schafft man es nun, dass seine eigene MessageResources in der Applikation auch benutzt werden? Dafür benötigt man zuallererst eine MessageResourcesFactory, die eine Instanz einer konkreten MessageResources liefert. Im hier geschilderten Fall kann dafür die vorhandene Factory für die PropertyMessageResources erweitert werden:
public class MyPropertyMessageResourcesFactory extends PropertyMessageResourcesFactory { @Override public MessageResources createResources(String config) { MyPropertyMessageResources messageResources = new MyPropertyMessageResources(this, config, this.returnNull); return messageResources; } } |
Als letzten Schritt muss man Struts die Factory nun in der struts-config.xml bekannt machen:
<message-resources parameter="languageBundle" null="false" factory="MyPropertyMessageResourcesFactory"/> |
Normalerweise wird lediglich der Name der Properties-Dateien (ohne Locale- und Dateisuffix) angegeben (parameter). In diesem Fall würde dann standardmäßig die PropertyMessageResourcesFactory Verwendung finden. Um nun seine eigene Factory zu benutzen, wird die Factory-Klasse (voll qualifizierter Klassenname) einfach über das factory Attribut bekannt gemacht. Und schon ist es vollbracht! Eigentlich sehr leicht, wenn man es denn weiß…
Tags: Java, MessageResources, Struts