Im Falle einer grundlegenden JSP / Servlet-Webanwendung würde der grundlegende Ansatz darin bestehen, JSTL- fmt
Taglib in Kombination mit Ressourcenpaketen zu verwenden . Ressourcenpakete enthalten Schlüssel-Wert-Paare, wobei der Schlüssel eine Konstante ist, die für alle Sprachen gleich ist und der Wert je nach Sprache unterschiedlich ist. Ressourcenpakete sind normalerweise Eigenschaftendateien, die von der ResourceBundle
API geladen werden . Dies kann jedoch so angepasst werden, dass Sie die Schlüssel-Wert-Paare beispielsweise aus einer Datenbank laden können.
Hier ist ein Beispiel für die Internationalisierung des Anmeldeformulars Ihrer Webanwendung mit auf Eigenschaftendateien basierenden Ressourcenpaketen.
Erstellen Sie die folgenden Dateien und fügen Sie sie in ein Paket ein, z. B. com.example.i18n
(im Fall von Maven fügen Sie sie in die darin enthaltene Paketstruktur ein src/main/resources
).
text.properties
(enthält Schlüssel-Wert-Paare in der Standardsprache, normalerweise Englisch)
login.label.username = Benutzername
login.label.password = Passwort
login.button.submit = Anmelden
text_nl.properties
(enthält niederländische ( nl
) Schlüssel-Wert-Paare)
login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen
text_es.properties
(enthält spanische ( es
) Schlüssel-Wert-Paare)
login.label.username = Nombre de usuario
login.label.password = Contraseña
login.button.submit = Acceder
Der Dateiname des Ressourcenpakets sollte dem folgenden Muster entsprechen name_ll_CC.properties
. Der _ll
Teil sollte der ISO 693-1- Sprachcode in Kleinbuchstaben sein . Es ist optional und nur erforderlich, wenn das _CC
Teil vorhanden ist. Das _CC
Teil sollte der ISO 3166-1 Alpha-2- Ländercode in Großbuchstaben sein . Es ist optional und wird häufig nur zur Unterscheidung zwischen länderspezifischen Sprachdialekten wie amerikanischem Englisch ( _en_US
) und britischem Englisch ( _en_GB
) verwendet.
Wenn noch nicht fertig, installieren Sie JSTL. Wenn Sie auf einem Servlet 2.5-Container oder einem neueren (Tomcat 6.0 usw.) ausgeführt werden und web.xml
die Servlet 2.5-Spezifikation als konform deklariert ist, legen Sie einfach jstl-1.2.jar im /WEB-INF/lib
Ordner der Webanwendung ab .
Erstellen Sie die folgende Beispiel-JSP-Datei und legen Sie sie im Webinhaltsordner ab.
login.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.example.i18n.text" />
<!DOCTYPE html>
<html lang="${language}">
<head>
<title>JSP/JSTL i18n demo</title>
</head>
<body>
<form>
<select id="language" name="language" onchange="submit()">
<option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
<option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
<option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
</select>
</form>
<form method="post">
<label for="username"><fmt:message key="login.label.username" />:</label>
<input type="text" id="username" name="username">
<br>
<label for="password"><fmt:message key="login.label.password" />:</label>
<input type="password" id="password" name="password">
<br>
<fmt:message key="login.button.submit" var="buttonValue" />
<input type="submit" name="submit" value="${buttonValue}">
</form>
</body>
</html>
Der <c:set var="language">
verwaltet die aktuelle Sprache. Wenn die Sprache als Anforderungsparameter angegeben wurde (per Sprach-Dropdown), wird sie festgelegt. Andernfalls, wenn die Sprache bereits zuvor in der Sitzung festgelegt wurde, bleiben Sie stattdessen dabei. Verwenden Sie andernfalls das vom Benutzer angegebene Gebietsschema im Anforderungsheader.
Das <fmt:setLocale>
legt das Gebietsschema für das Ressourcenpaket fest. Es ist wichtig, dass diese Zeile vor dem steht <fmt:setBundle>
.
Das <fmt:setBundle>
initialisiert das Ressourcenpaket anhand seines Basisnamens (dh des vollständig qualifizierten Paketnamens bis zum alleinigen Namen ohne den Bezeichner _ll_CC
).
Der <fmt:message>
ruft den Nachrichtenwert mit dem angegebenen Bundle-Schlüssel ab.
Das <html lang="${language}">
informiert die Suchbots darüber, in welcher Sprache die Seite ist, damit sie nicht als doppelter Inhalt markiert wird (also gut für SEO).
Das Sprach-Dropdown-Menü wird sofort per JavaScript gesendet, wenn eine andere Sprache ausgewählt wird, und die Seite wird mit der neu ausgewählten Sprache aktualisiert.
Beachten Sie jedoch, dass Eigenschaftendateien standardmäßig mit der ISO-8859-1-Zeichencodierung gelesen werden. Sie müssten ihnen durch Unicode-Escapezeichen entkommen. Dies kann mit dem von JDK bereitgestellten native2ascii.exe
Tool erfolgen. Siehe auch diesen Artikelabschnitt für weitere Details.
Eine theoretische Alternative wäre, ein Bundle mit einem benutzerdefinierten Befehl Control
zum Laden dieser Dateien als UTF-8 fmt
bereitzustellen. Dies wird jedoch von der grundlegenden JSTL- Taglib leider nicht unterstützt . Sie müssten alles selbst mit Hilfe von a verwalten Filter
. Es gibt (MVC) Frameworks, die dies transparenter handhaben können, wie JSF, siehe auch diesen Artikel .