© Excellent backgrounds/Shutterstock.com
Kolumne: EnterpriseTales

Kolumne: EnterpriseTales


Im dritten Teil unserer kleinen Serie zu Java 8 und Enterprise beschäftigen wir uns mit dem Thema Internationalisierung und Resource Loading. Hier gibt es in Java 8 eine interessante Erweiterung, die natürlich auch in Java EE verwendet werden kann.

Der Standardmechanismus in Java zum Laden von Ressourcen ist das ResourceBundle [1]. Dieses kümmert sich auch um die Internationalisierung. Beim Laden eines ResourceBundles wird auf Basis eines definierten Algorithmus [2] das korrekte Bundle für Sprache und Land ermittelt und geladen.

ResourceBundle in JSF

Um ein ResourceBundle in JSF zu nutzen, muss es entweder in der faces-config.xml eingetragen werden (Listing 1) oder als lokales Bundle über das Tag f:loadBundle in die XHTML-Seite eingebunden werden. An beiden Stellen muss jeweils ein Variablenname angegeben werden, über den dann innerhalb eines Expression-Language-Ausdrucks auf dieses Bundle zugegriffen werden kann. In unserem Beispiel wäre das über msg['myKey'] möglich. Innerhalb von JSF kann zusätzlich über FacesApplication.getResourceBundle programmatisch auf das Bundle zugegriffen werden.

Listing 1

<faces-config> <application> <resource-bundle> <base-name>com.sample.messages</base-name> <var>msg</var> </resource-bundle> </application> </faces-config>

Ladeprozess anpassen

Neben dem Namen (in Listing 1 ist das messages) kann ein ResourceBundle noch Locale-spezifisch ausgeprägt sein. Der Bezeichner für das Locale wird dabei durch einen Unterstrich vom Namen getrennt (z. B. messages_de). Das Locale selbst kann auch wieder aus mehreren Teilen bestehen (vgl. [3]), die auch durch Unterstriche getrennt sind (z. B. messages_de_DE_northern). Das erste Suffix steht dabei für die Sprache (de), das zweite für das Land (DE) und alle weiteren stellen beliebige Varianten dar, die der Wichtigkeit nach sortiert sein sollten.

Der Standardalgorithmus zum Ermitteln eines ResourceBundles schaut zunächst nach, ob es eine Properties-Datei mit dem konfigurierten Namen und dem aktuellen Locale im Classpath gibt. In Listing 1 und dem Locale de_DE wäre das eine Datei namens messages_de_DE.properties im Ordner com/sample. Ist diese nicht vorhanden, wird überprüft, ob es eine gleichnamige Klasse gibt, die von ResourceBundle ableitet. Das wäre im Beispiel eine Klasse Messages_de_DE.class im Pack­age com.sample. Gibt es beides nicht, wird versucht, eine sprachspezifische Ressource zu finden (messages_DE.properties bzw. Messages_DE.class). Den letzten Versuch unternimmt der Algorithmu...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang