loadbundle - ¿Cómo accedo a Locale desde un JSP?
jsf internationalization (10)
Ken G. señaló la respuesta.
pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.SESSION_SCOPE)
debería ser usado en su lugar
pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)
Quiero incluir un archivo js según el valor de la Configuración regional actual. Intenté acceder a él desde JSP de la siguiente manera:
<%@ 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, java.lang.NullPointerException
una java.lang.NullPointerException
porque pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)
es NULL
.
¿Alguien sabe cómo puedo resolver esto?
No puedo encontrar 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
?
Edit: org.apache.struts.action.LOCALE
es el valor de org.apache.struts.Global.LOCALE_KEY
, por lo que el valor en sí mismo, utilizado como clave, no debería ser el problema.
Verifique que se está configurando un LOCALE
en la Request
. Tengo entendido que LOCALE_KEY
está configurado en PageContext.SESSION_SCOPE
si está configurado.
Struts pone la configuración regional en la sesión. La forma correcta de obtener la configuración regional es:
Locale locale = (locale)request.getSession().getAttribute(Globals.LOCALE_KEY);
En Struts2, utilizando EL I utilicé con éxito:
${sessionScope["org.apache.struts2.action.LOCALE"]}
Por ejemplo, para generar el valor de la Configuración regional:
<c:out value=''${sessionScope["org.apache.struts2.action.LOCALE"]}''/>
en Struts2 try
<s:if test="#request.locale.language==''us''">
<s:select name="gender" list="#{''M'':''Male'',''F'':''female''}" ></s:select>
</s:if>
<%@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>
<%}%>
Las dos mejores formas de obtener locale
es mediante el uso del getLocale
de getLocale
of Action heredado por una acción, en un JSP: <s:hidden name="locale"/>
o
<s:property value"%{locale}"/>
Cuando la configuración regional se ha cambiado con este método .
No es lo mismo que:
${pageContext.response.locale}
Agregué nuevos ejemplos para aclarar esto un poco más porque esta publicación no me ayudó mucho.
Para obtener la configuración regional de jsp:
<%=request.getLocale()%>
es un método ServletRequest a Devuelve la configuración regional preferida en la que el cliente aceptará contenido, según el encabezado Aceptar idioma.
Struts2 Locale: <s:property value="#request.locale"/>
Devuelve la configuración regional para Struts2 Framework, que puede ser o no la misma que en el ejemplo anterior. si pasa el param 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>
struts2 # request.locale cambiará a alemán anulando el valor del encabezado Accept-Language original
Prueba con esto
<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>
Por el momento estoy usando esto:
<c:set var="localeCode" value="${pageContext.response.locale}" />
Posteriormente, se puede acceder utilizando ${localeCode}
- Modo Scriplet , desalentado! Consulte Por qué no usar Scriptlets por razones de no usar un scriptlet.
La variable localeCode
se puede consultar dentro de un scriptlet con:
<%
Object ob_localeCode = pageContext.getAttribute("localeCode");
if (ob_localeCode != null) {
String currentLanguageCode = (String) ob_localeCode;
}
//more code
%>
- Modo Scripletless correcto forma de ir. Consulte Cómo evitar el código de Java en archivos JSP? Aquí en SO.
Estoy usando la configuración Spring 2.5 en este momento.
Luego de esto, volviendo a su pregunta original, 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 quiere usar un código corto para impresionar a sus colegas, puede hacer lo siguiente:
<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>