У випадку базового веб-застосування JSP / Servlet, основним підходом було б використання JSTL fmt
taglib у поєднанні з пакетами ресурсів . Набори ресурсів містять пари ключ-значення, де ключ є константою, однаковою для всіх мов, і значення різниться залежно від мови. Набори ресурсів - це, як правило, файли властивостей, які завантажує 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 = Вхід
text_es.properties
(містить іспанські ( es
) пари ключ-значення)
login.label.username = Кількість користувачів
login.label.password = Contraseña
login.button.submit = Прискорювач
Ім'я файлу пакета ресурсів має відповідати наступному шаблону 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}">
інформуєте searchbots якої мови сторінки , щоб вона не буде позначена як дубльований контент (таким чином, добре для SEO).
Випадаюче меню негайно надсилатиметься за допомогою JavaScript, коли буде обрано іншу мову, і сторінка буде оновлена заново вибраною мовою.
Однак потрібно пам’ятати, що файли властивостей за замовчуванням читаються із використанням кодування символів ISO-8859-1. Вам потрібно було б уникнути їх шляхом втечі Unicode. Це можна зробити за допомогою native2ascii.exe
інструменту, що постачається в JDK . Дивіться також цей розділ статті, щоб дізнатися більше.
Теоретичною альтернативою може бути постачання пакета з користувацьким Control
завантаженням цих файлів як UTF-8, але це, на жаль, не підтримується базовим таглібом JSTL fmt
. Вам потрібно було б усім цим керувати самостійно за допомогою Filter
. Є фреймворки (MVC), які можуть обробляти це більш прозоро, наприклад, JSF, див. Також цю статтю .