In einem kleinen Webprojekt das als Single-Page Application realisiert ist, gab es Bedarf nach Internationalisierung diverser Textbausteine im Frontend. Das Frontend ist als JSP realisiert. Möglichkeiten der Internationalisierung gibt es in Java natürlich mit dem ResourceBundle. Diese Vorgehensweise in einer JSP zu wählen ist IMHO nicht besonders elegant:
[GeSHi lang=java]
<%
java.util.Locale locale = request.getLocale();
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com.xyz.myBundle", locale);
bundle.getString("key");
%>
[/GeSHi]
Ein weiterer Weg wäre, sich bei einem Framework wie Apache Struts zu bedienen. Ziemlich teurer Einkauf, man schießt hierbei definitiv mit Kanonen auf Spatzen! Ich empfehle hier die Benutzung der JSTL. Man bindet die entsprechenden Tag-Libraries im Kopf der JSP ein:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
und könnte der JSP das Laden der jeweiligen Property-Dateien zur Internationalisierung überlassen:
<c:if test="${lang==null}">
<fmt:setBundle basename="com.xyz.myBundle" var="lang" scope="session"/>
</c:if>
Der Zugriff erfolgt dann mit
<fmt:message key="hello" bundle="${lang}"/>
auf die lokalisierte Version des Keys "hello".
Soweit die Theorie... Für die Praxis sollte man bedenken, welche Version der JSTl (1.0 / 1.1) und JSP (1.2 / 2.0) man gewählt hat. Die Kombination entscheidet darüber, welche TLD der JSTL man wählen sollte. Die Kombination JSTL 1.1 und JSP 2.0 oder JSP 1.2 sollte problemlos funktionieren. JSTL 1.0 und JSP 2.0 wird problembehaftet sein und folgende Fehlermeldung hervorbringen:
According to TLD or attribute directive in tag file, attribute value does not accept any expressions
Abhilfe schaffen kann hier eine Änderung der Taglib Direktive in der JSP von
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
nach
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Das man der JSP das Laden der Property-Dateien überlässt, ist in dem konkreten Fall einer Single-Page Application verschmerzbar. Bei mehreren Seiten sollte dieses aber besser im Rahmen der Applikation geschehen. Hierzu bedient man sich der web.xml und erweitert sie wie folgt:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>com.xyz.myBundle</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
Der Parameter javax.servlet.jsp.jstl.fmt.fallbackLocale definiert ein Fallback Locale für den Fall, dass keine entsprechende Property Datei definiert wurde.
Die komplette JSP sieht wie folgt aus:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h2>Hello World!</h2>
<fmt:message key="hello" />
</body>
</html>
Property Datei com/xyz/myBundle_en.properties enthält:
hello=Hello!
Property Datei com/xyz/myBundle_de.properties enthält:
hello=Hallo!
Weitere Links: