Locale

Problem

Obwohl JSF automatisch die Internationalisierung einer Web Applikation durchführt, wie beispielsweise die richtige Locale für UIViewRoot [2] zu setzen, stossen Entwickler trotzdem noch auf einige spezielle Probleme:

<locale-config> <default-locale>en</default-locale> <supported-locale>en</supported-locale> <supported-locale>de</supported-locale> </locale-config>

Ablauf

JSF ermittelt die Locale in folgender Reihenfolge:

  1. Es wird nach einer Übereinstimmung zwischen den Request Localen (Header Accept-Language) und den Supported Locales gesucht
  2. Application Default Locale aus der Faces Config Datei
  3. JVM Default Locale

Aber es ist besser auch die Property Datei der Application Default Locale mit einem Suffix zu bennen. (index_en.properties statt index.properties)
Für den Fall dass diese nicht mit der JVM Default Locale übereinstimmt, wird die Property Datei mit JVM Locale Suffix verwendet und nicht die Property Datei ohne Suffix.

Seite

Eine Möglichkeit eine eigene Locale für die Seiten zu setzen ist das Locale Attribute im f:view Tag [4] zu definieren. Dies kann man hard codiert als String oder als Locale Attribute einer Bean tun.

<f:view locale="en"> <f:view locale="#{user.locale}">

ViewHandler

Meine bevorzugte Lösung ist die Verwendung eines benutzerdefinierten ViewHandler, der den JSF ViewHandler [5] oder den Facelets ViewHandler [6] erweitert. Einzige was man dazu tun muss ist die Klasse in der Faces Config Datei zu registrieren.

<application> <view-handler>de.icoding.CustomViewHandler</view-handler> </application>

Um die Locale für alle Seiten nach eigenen Bedingungen zu setzen, überschreibt man nur die Methode calculateLocale. In einer SEO Applikation schreibt man einfach:

public Locale calculateLocale(FacesContext context) { String path = null; path = context.getExternalContext().getRequestServletPath(); if (path.indexOf("/de/") > 0) return Locale.GERMAN; else return Locale.ENGLISH; }

Application

Manchmal benötigt man die Default Locale oder möchte über alle Supported Locales iterieren. Die JSF Klasse Application [7] stellt dafür alle notwendigen Methoden zur Verfügung:

FacesContext context = FacesContext.getCurrentInstance(); context.getApplication().getDefaultLocale(); context.getApplication().getSupportedLocales();

Resourcen

[1] Mojarra 1.2
[2] javax.faces.component.UIViewRoot
[3] faces-config.xml
[4] com.sun.faces.taglib.jsf_core.ViewTag
[5] javax.faces.application.ViewHandler
[6] com.sun.facelets.FaceletViewHandler
[7] javax.faces.application.Application

Johannes Hammoud Locale 01.09.2008

I Coding : Community über Java Programmierung

Sprache Englisch+-

Java JSF JavaScript HTML CSS NetBeans GlassFish MySQL

Impressum

Besuche
6307349
Heute
511