В случае базового веб-приложения JSP / сервлета основным подходом будет использование библиотеки тегов JSTL в сочетании с fmt
пакетами ресурсов . Пакеты ресурсов содержат пары ключ-значение, где ключ является константой, которая одинакова для всех языков, а значение различается для разных языков. Пакеты ресурсов обычно представляют собой файлы свойств, которые загружаются ResourceBundle
API. Однако это можно настроить так, чтобы вы могли загружать пары ключ-значение, например, из базы данных.
Вот пример того, как интернационализировать форму входа в ваше веб-приложение с пакетами ресурсов на основе файлов свойств.
Создайте следующие файлы и поместите их в какой-нибудь пакет, например com.example.i18n
(в случае Maven, поместите их в структуру пакета внутри src/main/resources
).
text.properties
(содержит пары ключ-значение на языке по умолчанию, обычно английском)
login.label.username = Имя пользователя
login.label.password = Пароль
login.button.submit = Войти
text_nl.properties
(содержит голландский (nl
пары ключ-значение ))
login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen
text_es.properties
(содержит es
пары "ключ-значение" испанский ( ))
login.label.username = Nombre de usuario
login.label.password = Contraseña
login.button.submit = Acceder
Имя файла пакета ресурсов должно соответствовать следующему шаблону name_ll_CC.properties
. _ll
Часть должна быть в нижнем регистре ISO 693-1 код языка. Это необязательно и требуется только при _CC
наличии детали. _CC
Часть должна быть в верхнем регистре ISO 3166-1 Alpha-2 код страны. Это необязательно и часто используется только для различения языковых диалектов, характерных для конкретной страны, например американского английского ( _en_US
) и британского английского ( _en_GB
).
Если это еще не сделано, установите JSTL. Если вы используете контейнер Servlet 2.5 или новее (Tomcat 6.0 и т. Д.) И web.xml
объявлен соответствующим спецификации Servlet 2.5, просто поместите jstl-1.2.jar в /WEB-INF/lib
папку webapp .
Создайте следующий пример файла JSP и поместите его в папку веб-материалов.
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>
<c:set var="language">
Управляет текущим языком. Если язык был указан в качестве параметра запроса (в раскрывающемся списке языков), он будет установлен. В противном случае, если язык уже был установлен в сеансе, придерживайтесь его. В противном случае используйте указанный пользователем языковой стандарт в заголовке запроса.
<fmt:setLocale>
Устанавливает стандарт для пакета ресурсов. Очень важно , чтобы эта линия перед<fmt:setBundle>
тем .
<fmt:setBundle>
Инициализирует пакет ресурсов его базовым имя (то есть полное квалифицированное имя пакета , пока с единственным именем без _ll_CC
спецификатора).
В <fmt:message>
Извлекает значение сообщений указанным расслоения ключа.
Он <html lang="${language}">
сообщает поисковым роботам, на каком языке находится страница, чтобы она не была помечена как дублирующийся контент (что хорошо для SEO).
Раскрывающийся список языков будет немедленно отправлен JavaScript, когда будет выбран другой язык, и страница будет обновлена с новым выбранным языком.
Однако следует помнить, что файлы свойств по умолчанию читаются с использованием кодировки символов ISO-8859-1. Вам нужно будет избежать их с помощью escape-кодов Unicode. Это можно сделать с помощью native2ascii.exe
инструмента, поставляемого JDK . См. Также этот раздел статьи для более подробной информации.
Теоретической альтернативой было бы предоставление пакета с Control
возможностью загрузки этих файлов как UTF-8, но, к сожалению, это не поддерживается базовой fmt
библиотекой тегов JSTL . Вам нужно будет управлять всем этим самостоятельно с помощью файла Filter
. Существуют (MVC) фреймворки, которые могут обрабатывать это более прозрачным образом, например JSF, см. Также эту статью .