JSTL Resource Bundle для интернационализации и локализации
У нас есть приложение, использующее базовый JSP/сервлет, который весь текст на английском языке жестко закодирован на страницах JSP. Мы рассматриваем вопрос о интернационализации нашего приложения, поэтому нам нужны какие-то способы извлечь текст из файла свойств.
Вот что я сделал до сих пор:
1) Создайте файл с именем XXXXX-messages_en.properties
, добавьте пару ключ/значение в файл свойств, например. AAAAA = Hello World
2) Загрузите соответствующие теглибы JSTL на страницу JSP
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
3) Замените предыдущий текст на
<fmt:message key="AAAAA" bundle="${XXXXX}"/>
4) Добавьте тег setBundle в страницу JSP:
<fmt:setBundle basename="XXXXX-messages" var="XXXXX"/>
И перезапустите сервер, все отображается правильно.
Однако мой вопрос об использовании библиотеки интернационализации JSTL:
ВОПРОС 1) Кажется, что я должен добавить тег <fmt:setBundle>
на каждую из отдельных страниц JSP, что немного уродливо, и если что-то нужно изменить в будущем (смена имени?), это усложнит жизнь.
Я думаю о том, что я могу создать отдельную страницу и поместить в нее <fmt:setBundle>
, а затем включить эту страницу с помощью <jsp:include>
. Или я могу ввести это через фильтр сервлета? Я бы сказал, что я не совсем доволен вариантами.
Есть ли какой-нибудь рекомендуемый способ сделать это?
ВОПРОС 2) Как указать язык по умолчанию, если там нет файлов свойств соответствия? Я тестировал в своем случае, если я помещаю <fmt:setLocale>
на страницу JSP с французским языком, страница может загружаться правильно. Означает ли это, что английская версия всегда является по умолчанию или просто потому, что моя операционная система/браузер - английский?
Что произойдет, если китайский/японский пользователь откроет мою страницу, и у меня есть английский и французский файл свойств там?
Ответы
Ответ 1
Вы можете использовать резервную локаль, чтобы решить свой второй вопрос:
Если совпадение не найдено, действие форматирования будет искать так называемый параметр конфигурации резервной локали. Параметр конфигурации - это значение, заданное либо параметром контекста в файле web.xml приложения, либо действием JSTL или кодом Java в одной из областей JSP. Чтобы установить резервную локаль в файле web.xml, включите эти элементы:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en</param-value>
</context-param>
http://onjava.com/onjava/2002/09/11/jstl2.html
Ответ 2
Хорошо, я нашел способ решить свой собственный вопрос 1.
В основном мне нужно сделать это в web.xml:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>XXXXX-messages</param-value>
</context-param>
Сделав это, я могу сохранить тег setBundle на каждой странице jsp.
Ответ 3
Ниже представлен шаблон JSP, созданный с использованием JSTL, может помочь кому-то включить пакет JSTL Resource Bundle для интернационализации и локализации.
template.tag
<%@tag description="UI Template" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<fmt:setLocale value="en" scope="session" />
<fmt:setBundle basename="resources.labels" var="label" scope="session" />
<fmt:setBundle basename="resources.messages" var="msg" scope="session" />
<html>
<body>
<div id="pageHeader">
<jsp:invoke fragment="header"/>
</div>
<div id="body">
<jsp:doBody/>
</div>
<div id="pageFooter">
<jsp:invoke fragment="footer"/>
</div>
</body>
</html>
Ниже находится файл home.jsp, в котором заголовок header.jsp и footer.jsp включены вместе с телом.
home.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<t:template>
<jsp:attribute name="header">
<jsp:include page="../header.jsp" />
</jsp:attribute>
<jsp:attribute name="footer">
<jsp:include page="../footer.jsp" />
</jsp:attribute>
<jsp:body>
<font style="font-family: Arial; font-size: 10pt; color: blue; font-weight: bold">
<fmt:message bundle="${msg}" key="message.loginSuccess" />
</font>
<br/>
<font style="font-family: Arial; font-size: 10pt; font-weight: bold">
<fmt:message bundle="${label}" key="label.home" />
</font>
</jsp:body>
</t:template>
Файл web.xml
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.labels</param-value>
<param-value>resources.messages</param-value>
</context-param>