2012-09-18 24 views
10

Tenemos una aplicación que usa el JSP/servlet básico que todo el texto actualmente en inglés está codificado en las páginas JSP. Estamos considerando las internacionalizaciones de nuestra aplicación, por lo que necesitamos algún tipo de forma de extraer el texto en el archivo de propiedades.Paquete de recursos JSTL para internacionalización y localización

Aquí es lo que he hecho hasta ahora:
1) Crear un archivo llamado XXXXX-messages_en.properties, añadir el par clave/valor en el archivo de propiedades, por ejemplo, AAAAA = Hello World

2) Carga JSTL taglibs pertinentes en la página JSP

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 

3) Reemplazar el texto anterior con

<fmt:message key="AAAAA" bundle="${XXXXX}"/> 

4) Agregar la etiqueta setBundle en la página JSP:

<fmt:setBundle basename="XXXXX-messages" var="XXXXX"/> 

Y reinicie el servidor, todo se muestra correctamente.

Sin embargo, mi pregunta sobre el uso de la biblioteca JSTL internacionalización es:

PREGUNTA 1) Parece que tengo que añadir <fmt:setBundle> etiqueta en cada uno de singe páginas JSP, que es un poco feo y si hay algo que necesita cambio en el futuro (¿cambio de nombre?) esto hará la vida más difícil.

Creo que tal vez puedo crear una página separada y poner esto <fmt:setBundle> en él, y luego incluir esta página usando <jsp:include>. ¿O puedo inyectar esto a través de un filtro de servlet? Yo diría que no estoy muy contento con ninguna de las opciones.

¿Hay alguna manera recomendada de hacerlo?

PREGUNTA 2) ¿Cómo se especifica un idioma predeterminado si no hay ningún archivo de propiedades de coincidencia allí? He probado en mi caso, si puse <fmt:setLocale> en la página JSP con un idioma francés, la página aún puede cargarse correctamente. ¿Eso significa que la versión en inglés es siempre la predeterminada o es simplemente porque mi sistema operativo/navegador es inglés?

¿Qué pasará si un usuario Chino/Japonés abre mi página y tengo las propiedades en inglés y en francés archivadas allí?

Respuesta

6

Se puede utilizar una configuración regional alternativa para resolver la segunda pregunta:

Si no se encuentra ninguna coincidencia, la acción de formato busca el ajuste de configuración de respaldo de la configuración regional llamada. Una configuración es un valor establecido por un parámetro de contexto en el archivo web.xml de la aplicación o por una acción JSTL o código Java en uno de los ámbitos JSP. Para establecer la configuración regional alternativa en la web.archivo XML, incluye estos elementos:

<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

+0

Definitivamente leído esto cuando Google en todo, así que ¿cómo puedo olvidar al respecto? Mi mente debe salir de mi cabeza en ese momento. De todos modos, gracias por tu respuesta! –

8

OK, he encontrado la manera de resolver mi propia pregunta 1. Básicamente lo que tengo que hacer es poner esto en web.xml:

<context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>XXXXX-messages</param-value> 
</context-param> 

Al hacer esto, puedo guardar la etiqueta de setBundle en cada página jsp.

2

A continuación se presenta la plantilla JSP creado usando JSTL, puede ayudar a alguien a incorporar JSTL Recursos Paquete de internacionalización y localización.

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> 


A continuación se muestra el archivo home.jsp muestra la header.jsp y footer.jsp incluido junto con el cuerpo.

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> 


archivo 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> 
Cuestiones relacionadas