2008-12-02 9 views
14

Ich möchte eine js-Datei je nach dem Wert des aktuellen Gebietsschema enthalten. Ich habe versucht, es von JSP zuzugreifen, wie folgt:Wie kann ich von einer JSP auf Locale zugreifen?

<%@ 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> 
<% } %> 

Aber ich bin immer ein java.lang.NullPointerException weil pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)NULL ist.

Weiß jemand wie ich das lösen kann?

Antwort

2

Ich kann eine Konstante org.apache.struts.action.LOCALE in der Struts 1.x Dokumentation nicht finden - sollte es org.apache.struts.Globals.LOCALE_KEY sein? Oder eine der anderen LOCALE_KEY Konstanten?


Edit: org.apache.struts.action.LOCALE ist der Wert des org.apache.struts.Global.LOCALE_KEY - so der Wert selbst, als Schlüssel verwendet, sollte nicht das Problem sein.

Vergewissern Sie sich, dass LOCALE im Request festgelegt ist. Mein Verständnis ist, dass die LOCALE_KEY in PageContext.SESSION_SCOPE gesetzt ist, wenn es eingestellt ist.

0

Ken G. wies auf die Antwort hin.

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

sollte stattdessen

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

Struts setzt locale in der Sitzung verwendet werden. Der richtige Weg, um die Locale zu erhalten ist:

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

Im Moment ich dies mit:

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

kann später Dieser Zugang ist durch ${localeCode}

mit
  1. Scriplet Modus, entmutigt! Siehe Why not use Scriptlets aus Gründen, kein Skriptlet zu verwenden.

    <% 
        Object ob_localeCode = pageContext.getAttribute("localeCode"); 
        if (ob_localeCode != null) { 
        String currentLanguageCode = (String) ob_localeCode; 
        } 
        //more code 
    %> 
    
    1. Scripletless Modus richtigen Weg zu gehen:

    Die localeCode Variable kann in einem scriptlet mit abgefragt werden. Siehe How to avoid Java Code in JSP-Files? Hier auf SO.

Ich verwende im Moment Feder 2.5 Config.

dies also folgende, zurück zu Ihrer ursprünglichen Frage kommen Sie so etwas wie umsetzen können:

<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> 

oder wenn Sie wirklich verwenden möchten einige kurze Code, um Ihre Kollegen zu beeindrucken, die Sie tun können:

<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 für eine scripletless Weg. – BalusC

+0

Vereinbart mit @BalusC - eine der letzten beiden Lösungen sollte der richtige Weg sein. Gehen Sie nicht Scriptlets ... immer ... –

+0

Wissen Sie, warum 'pageContext.response.locale' null zurückgeben würde, wenn der Client nach einer' PUT'-Anfrage an eine benutzerdefinierte Fehlerseite (403) weitergeleitet wird. .. Für alle anderen Fälle funktioniert das ok. – theyuv

1

In Struts2, EL ich mit Erfolg eingesetzt:

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

Eg der Wert der Locale zur Ausgabe:

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

in Struts2 versuchen

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

Die beiden besten Möglichkeiten locale zu bekommen, ist durch die getLocale Aktions Unterstützung durch eine Aktion geerbt verwenden, auf eine JSP: <s:hidden name="locale"/> oder
<s:property value"%{locale}"/>

Wenn locale mit this method geändert wurde.

Es ist nicht das gleiche wie:
${pageContext.response.locale}

1

ich neue Beispiele hinzugefügt, um diese ein wenig mehr zu klären, da dieser Beitrag mir nicht viel helfen.

<%=request.getLocale()%> 

es eine ServletRequest Methode a Gibt die bevorzugten Locale, dass der Client akzeptiert Inhalt, basierend auf den Accept-Language-Header,

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

Returns:

Um locale von jsp zu erhalten das Gebietsschema für das Struts2-Framework, das dem vorherigen Beispiel entsprechen kann oder auch nicht. wenn Sie die param request_locale = de zum Beispiel passieren ...

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

die struts2 # request.locale wird auf Deutsch überschreiben den Wert der Originalsprache Accept-Header

1

mit diesem

Versuchen geändert
<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>