В случае базового веб-приложения JSP / Servlet базовый подход будет использовать JSTL fmt
taglib в сочетании с комплектами ресурсов . Пакеты ресурсов содержат пары ключ-значение, где ключ является константой, которая одинакова для всех языков, и значение отличается для каждого языка. Пакеты ресурсов обычно представляют собой файлы свойств , которые загружаются с помощью ResourceBundle
API. Однако это можно настроить так, чтобы вы могли загружать пары ключ-значение, например, из базы данных.
Вот пример того, как интернационализировать форму входа в систему вашего веб-приложения с помощью пакетов ресурсов на основе файла свойств.
Создайте следующие файлы и поместите их в какой-нибудь пакет, например, com.example.i18n
(в случае Maven поместите их в структуру пакета внутри src/main/resources
).
text.properties
(содержит пары ключ-значение на языке по умолчанию, обычно на английском)
login.label.username = Username
login.label.password = Password
login.button.submit = Sign in
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 в * 1062 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. Вы должны были бы избежать их через побеги Юникода. Это можно сделать с помощью поставляемого JDK инструмента native2ascii.exe
. Смотрите также этот раздел статьи для более подробной информации.
Теоретической альтернативой может быть предоставление пакета с пользовательским Control
для загрузки этих файлов в формате UTF-8, но, к сожалению, это не поддерживается базовым тегом JSTL fmt
. Вам нужно было бы управлять всем этим самостоятельно с помощью Filter
. Существуют (MVC) фреймворки, которые могут обрабатывать это более прозрачно, например, JSF, см. Также эту статью .