Как получить доступ к языку из JSP?
Я хочу включить файл js в зависимости от значения текущего Locale. Я попытался получить к нему доступ из 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>
<% } %>
Однако я получаю java.lang.NullPointerException
, потому что pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)
есть NULL
.
Кто-нибудь знает, как я могу это решить?
Ответы
Ответ 1
В данный момент я использую это:
<c:set var="localeCode" value="${pageContext.response.locale}" />
Это может быть позже доступ с помощью ${localeCode}
Переменная localeCode
может быть запрошена внутри scriptlet с помощью:
<%
Object ob_localeCode = pageContext.getAttribute("localeCode");
if (ob_localeCode != null) {
String currentLanguageCode = (String) ob_localeCode;
}
//more code
%>
- Режим без скриптов правильный путь. См. Как избежать кода Java в JSP файлах? Здесь на SO.
Я использую spring 2.5 config на данный момент.
Итак, следуя этому, вернувшись к исходному вопросу, вы можете реализовать что-то вроде:
<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>
или если вы действительно хотите использовать короткий код, чтобы произвести впечатление на своих коллег, вы можете сделать:
<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
в Struts2 попробуйте
<s:if test="#request.locale.language=='us'">
<s:select name="gender" list="#{'M':'Male','F':'female'}" ></s:select>
</s:if>
Ответ 3
Struts помещает locale в сеанс. Правильный способ получить локаль:
Locale locale = (locale)request.getSession().getAttribute(Globals.LOCALE_KEY);
Ответ 4
Я не могу найти константу org.apache.struts.action.LOCALE
в документации Struts 1.x - должно быть org.apache.struts.Globals.LOCALE_KEY
? Или одна из других констант LOCALE_KEY
?
Изменить: org.apache.struts.action.LOCALE
- это значение org.apache.struts.Global.LOCALE_KEY
- поэтому само значение, используемое как ключ, не должно быть проблемой.
Убедитесь, что в Request
задан параметр LOCALE
. Я понимаю, что LOCALE_KEY
установлен в PageContext.SESSION_SCOPE
, если он установлен.
Ответ 5
В Struts2, используя EL, я успешно использовал:
${sessionScope["org.apache.struts2.action.LOCALE"]}
например. для вывода значения Locale:
<c:out value='${sessionScope["org.apache.struts2.action.LOCALE"]}'/>
Ответ 6
Я добавил новые примеры, чтобы прояснить это немного больше, потому что этот пост мне не очень помог.
Чтобы получить локаль от jsp:
<%=request.getLocale()%>
это метод ServletRequest a Возвращает предпочтительный язык, в котором клиент принимает контент на основе заголовка Accept-Language,
Struts2 Locale: <s:property value="#request.locale"/>
Возвращает языковой стандарт для Struts2 Framework, который может быть или не быть таким же, как в предыдущем примере. если вы передаете param request_locale = de, например...
<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 будет изменен на немецкий, переопределяя значение исходного заголовка Accept-Language
Ответ 7
Попробуйте с этим
<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>
Ответ 8
Кен Г. указал на ответ.
pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.SESSION_SCOPE)
следует использовать вместо
pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)
Ответ 9
<%@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>
<%}%>
Ответ 10
Два лучших способа получить locale
- использование getLocale
поддержки Action, унаследованной действием, на JSP:
<s:hidden name="locale"/>
или
<s:property value"%{locale}"/>
Если локаль была изменена с помощью этого метода.
Это не то же самое:
${pageContext.response.locale}