Пакет ресурсов JSTL для интернационализации и локализации

У нас есть приложение, использующее базовый 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 с французским языком, страница все равно может загружаться правильно. Означает ли это, что по умолчанию всегда используется английская версия, или это просто потому, что моя операционная система / браузер английский?

Что произойдет, если пользователь из Китая / Японии откроет мою страницу и у меня есть файл свойств на английском и французском языках?


person Yudong Li    schedule 18.09.2012    source источник


Ответы (3)


Вы можете использовать запасной языковой стандарт, чтобы решить свой второй вопрос:

Если совпадений не найдено, действие форматирования ищет так называемый параметр конфигурации резервной локали. Параметр конфигурации - это значение, устанавливаемое либо параметром контекста в файле 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

person Jasper de Vries    schedule 18.09.2012
comment
Я определенно читаю это, когда гулю, так как я могу об этом забыть? В этот момент мои мысли должны вылететь из головы. В любом случае спасибо за ответ! - person Yudong Li; 19.09.2012

Хорошо, я нашел способ решить свой вопрос 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.

person Yudong Li    schedule 18.09.2012

Ниже представлен шаблон JSP, созданный с использованием JSTL, который может помочь кому-то включить пакет ресурсов JSTL для интернационализации и локализации.

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>
person Dinesh Lomte    schedule 28.03.2013