2012-09-18 18 views
10

Abbiamo un'applicazione che utilizza il JSP/servlet di base che tutto il testo attualmente in inglese è codificato in modo rigido nelle pagine JSP. Stiamo prendendo in considerazione le internazionalizzazioni della nostra app, quindi abbiamo bisogno di alcuni modi per estrarre il testo nel file delle proprietà.JSTL Resource Bundle per internazionalizzazione e localizzazione

Ecco cosa ho fatto fino ad ora:
1) Creare un file chiamato XXXXX-messages_en.properties, aggiungere la coppia chiave/valore nel file delle proprietà, ad es. AAAAA = Hello World

2) Carico JSTL taglibs pertinenti nella pagina JSP

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

3) Sostituire il testo precedente, con

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

4) Aggiungere tag setBundle nella pagina JSP:

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

E riavviare il server, tutto viene visualizzato correttamente.

Tuttavia, la mia domanda per quanto riguarda l'utilizzo di libreria JSTL internazionalizzazione è:

DOMANDA 1) Sembra che devo aggiungere <fmt:setBundle> tag in ciascuna delle singe pagine JSP, che è un po 'brutto, e se qualcosa deve cambiare in futuro (cambio di nome?) questo renderà la vita più difficile.

Ho pensato di poter creare una pagina separata e inserire questo <fmt:setBundle> in esso e quindi includere questa pagina utilizzando <jsp:include>. O posso iniettare questo tramite un filtro servlet? Direi che non sono abbastanza soddisfatto di entrambe le opzioni.

C'è qualche modo consigliato per farlo?

DOMANDA 2) Come specificare una lingua predefinita se non ci sono file di proprietà delle corrispondenze? Ho provato nel mio caso, se inserisco <fmt:setLocale> nella pagina JSP con una lingua francese, la pagina può ancora essere caricata correttamente. Significa che la versione inglese è sempre l'impostazione predefinita o è semplicemente perché il mio sistema operativo/browser è inglese?

Cosa succederà se un utente cinese/giapponese apre la mia pagina e ho file di proprietà in inglese e francese?

risposta

6

È possibile utilizzare impostazioni internazionali di riserva per risolvere la seconda domanda:

Se non viene trovata alcuna corrispondenza, l'azione di formattazione cerca la cosiddetta impostazione di configurazione fallback-locale. Un'impostazione di configurazione è un valore impostato da un parametro di contesto nel file web.xml dell'applicazione o da un'azione JSTL o codice Java in uno degli ambiti JSP. Per impostare le impostazioni internazionali di fallback nel web.file XML, includere questi elementi:

<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

Io sicuramente letto questo quando ho google in giro, così come posso dimenticare a questo proposito? La mia mente deve uscire dalla mia testa in quel momento. Comunque, grazie per la tua risposta! –

8

OK, ho trovato il modo per risolvere il mio problema 1. Fondamentalmente quello che devo fare è mettere questo in web.xml:

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

In questo modo, posso salvare il tag di setBundle in ogni pagina jsp.

2

Di seguito è riportato il modello JSP creata usando JSTL, può aiutare qualcuno incorporare JSTL Resource Bundle per l'internazionalizzazione e localizzazione.

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> 


riportano di seguito le home.jsp di file che mostra il header.jsp e footer.jsp incluso insieme al corpo.

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> 


file 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> 
Problemi correlati