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>
JSF ermittelt die Locale in folgender Reihenfolge:
Accept-Language) und den Supported Locales gesuchtAber 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.
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}">
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;
}
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();
[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