Ответ 1
В случае базового веб-приложения 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. Это необязательно и часто используется для различения языковых диалектов, специфичных для страны, таких как American English (_en_US
) и Британский английский (_en_GB
). -
Если это еще не сделано, установите JSTL. Если вы работаете на контейнере Servlet 2.5 или новее (Tomcat 6.0 и т.д.), И ваш
web.xml
объявлен соответствующим спецификации Servlet 2.5, тогда просто поставьте jstl-1.2.jar в папке webapp/WEB-INF/lib
. -
Создайте следующий пример 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">
управляет текущим языком. Если язык был предоставлен как параметр запроса (по выпадающему языку), он будет установлен. Иначе, если язык уже был предварительно установлен в сеансе, тогда придерживайтесь его. Else использует локализованный пользователем язык в заголовке запроса.<fmt:setLocale>
устанавливает языковой стандарт для набора ресурсов. Важно, чтобы эта строка была до<fmt:setBundle>
.<fmt:setBundle>
инициализирует пакет ресурсов по его базовому имени (то есть полное имя пакета до тех пор, пока не будет указано имя без спецификатора_ll_CC
).<fmt:message>
извлекает значение сообщения указанным ключом пакета.<html lang="${language}">
сообщает поисковым роботам, на каком языке находится страница, чтобы он не был помечен как дублирующийся контент (таким образом, хорошо для SEO).Выпадающий язык сразу же отправит JavaScript, когда будет выбран другой язык, и страница будет обновлена с помощью выбранного языка.
Однако вам нужно иметь в виду, что файлы свойств по умолчанию считываются с использованием кодировки символов ISO-8859-1. Вам нужно будет избежать их путем unicode-экранов. Это можно сделать с помощью инструмента native2ascii.exe
, поставляемого JDK. См. Также этот раздел статьи для более подробной информации.
Теоретической альтернативой было бы поставлять комплект с пользовательским Control
для загрузки этих файлов как UTF-8, но, к сожалению, поддерживаемый базовым JSTL fmt
taglib. Вам нужно будет управлять всем этим с помощью Filter
. Существуют (MVC) фреймворки, которые могут обрабатывать это более прозрачным образом, например JSF, также в этой статье.