2008-12-02 45 views
14

Quiero incluir un archivo js según el valor de la Configuración regional actual. He tratado de acceder a él desde JSP de la siguiente manera:¿Cómo accedo a Locale desde un JSP?

<%@ page import="java.util.Locale" %> 
<% if(((Locale) pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)).getLanguage().equals("de")) { %> 
    <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script> 
<% } else { %> 
    <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script> 
<% } %> 

Sin embargo, estoy consiguiendo un java.lang.NullPointerException porque es pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)NULL.

¿Alguien sabe cómo puedo solucionar esto?

Respuesta

2

No encuentro una constante org.apache.struts.action.LOCALE en la documentación de Struts 1.x - ¿Debería ser org.apache.struts.Globals.LOCALE_KEY? ¿O una de las otras constantes LOCALE_KEY?


Editar: org.apache.struts.action.LOCALE es el valor del org.apache.struts.Global.LOCALE_KEY - por lo que el valor en sí, que se utiliza como una clave, no debe ser el problema.

Compruebe que se está configurando LOCALE en el Request. Según entiendo, el LOCALE_KEY se establece en PageContext.SESSION_SCOPE si está configurado.

0

Ken G. señaló la respuesta.

pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.SESSION_SCOPE) 

debe usarse en lugar

pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE) 
0
<%@page import="java.util.Locale"%> 
<%@page import="org.apache.struts.Globals"%> 


<%Locale locale = (Locale)session.getAttribute(Globals.LOCALE_KEY); 
if (locale.getLanguage().equals("fr")) {%> 
    <script language="JavaScript" src="lib/js/dateofday.js" type="text/javascript"></script> 
    <script type="text/javascript" src="<%=request.getContextPath() %>/lib/js/jscalendar-1.0/lang/calendar-fr.js"></script> 
<%} else {%> 
    <script language="JavaScript" src="lib/js/dateofday-en.js" type="text/javascript"></script> 
    <script type="text/javascript" src="<%=request.getContextPath() %>/lib/js/jscalendar-1.0/lang/calendar-en.js"></script> 
<%}%> 
3

puntales pone localidad en la sesión. La forma correcta para obtener la configuración regional es:

Locale locale = (locale)request.getSession().getAttribute(Globals.LOCALE_KEY); 
19

Por el momento estoy usando esto:

<c:set var="localeCode" value="${pageContext.response.locale}" /> 

Esta tarde se puede acceder mediante el uso de ${localeCode}

  1. modo Scriplet, ¡desanimado! Ver Why not use Scriptlets por razones para no usar un scriptlet.

La variable localeCode puede ser consultada en el interior de un scriptletcon:

<% 
    Object ob_localeCode = pageContext.getAttribute("localeCode"); 
    if (ob_localeCode != null) { 
    String currentLanguageCode = (String) ob_localeCode; 
    } 
    //more code 
%> 
  1. modo Scripletless forma correcta de ir. Ver How to avoid Java Code in JSP-Files? Aquí en SO.

Estoy utilizando la configuración de primavera 2.5 en este momento.

Así que después de esto, volviendo a su pregunta original se puede implementar algo como:

<c:set var="localeCode" value="${pageContext.response.locale}" /> 
<c:choose> 
    <c:when test="$localecode == 'de' }"> 
    <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script> 
    </c:when> 
    <c:otherwise> 
    <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script> 
    </c:otherwise> 
</c:choose> 

o si realmente desea utilizar un código corto para impresionar a sus colegas, que puede hacer:

<c:set var="localeCode" value="${fn:toUpperCase(pageContext.response.locale)}" /> 
<c:set var="availLanguages" value="EN,DE" /> 
<c:if test="${!fn:contains(availLanguages,localeCode)}"> 
    <c:set var="localeCode" value="EN" /> 
</c:if> 

<script src="../themes/administration/js/languages/i18n{$localeCode}.js" type="text/javascript"> </script> 
+2

+1 para una manera scriptletless. – BalusC

+0

De acuerdo con @BalusC: una de las últimas dos soluciones debería ser el camino a seguir. No vaya scriptlets ... alguna vez ... –

+0

¿Sabe por qué 'pageContext.response.locale' devolvería nulo cuando el cliente se reenvía a una página de error personalizada (403) después de una solicitud' PUT' ?. ..Para todos los demás casos, esto funciona bien. – theyuv

1

En Struts2, utilizando EL he utilizado con éxito:

${sessionScope["org.apache.struts2.action.LOCALE"]} 

Ej para dar salida al valor de la configuración regional:

<c:out value='${sessionScope["org.apache.struts2.action.LOCALE"]}'/> 
4

en Struts2 tratar

<s:if test="#request.locale.language=='us'"> 
    <s:select name="gender" list="#{'M':'Male','F':'female'}" ></s:select> 
</s:if> 
0

Los dos mejores maneras de conseguir locale es mediante el uso de la getLocale de apoyo Acción heredada por una acción, en un JSP: <s:hidden name="locale"/> o
<s:property value"%{locale}"/>

Cuando se ha cambiado la configuración regional con this method.

No es lo mismo que:
${pageContext.response.locale}

1

he añadido nuevos ejemplos para aclarar esto un poco más, porque este post no me ayuda mucho.

Para obtener la configuración regional de JSP:

<%=request.getLocale()%> 

Es un ServletRequest Método a Devuelve la configuración regional preferida que el cliente aceptará el contenido en, sobre la base de la cabecera Accept-Language,

Struts2 Locale: <s:property value="#request.locale"/> 

devoluciones la configuración regional para Struts2 Framework, que puede ser o no la misma que en el ejemplo anterior. Si se pasa el parámetro = request_locale de por ejemplo ...

<s:url id="localeDE" namespace="/"> 
    <s:param name="request_locale" >de</s:param> 
</s:url> 
<s:a href="%{localeDE}" >German</s:a> 

la struts2 # request.locale habrá cambiado al alemán anulando el valor de la cabecera original Accept-Language

1

intento con este

<s:if test='locale.toString() == "si"'> 
    <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script> 
</s:if> 
<s:elseif test='locale.toString() == "ta"'> 
    <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script> 
</s:elseif> 
<s:else> 
    ANOTHER SCRIPT 
</s:else> 
Cuestiones relacionadas