Jak ustawić JSTL locale z kodu Java?

Chcę ustawić ustawienia regionalne JSTL, które są używane przez <fmt:formatNumber> i znajomych. Wiem, że jest to możliwe z <fmt:setLocale>, ale muszę to zrobić dynamicznie (w zależności od danych użytkownika pobranych z mojego DB) i wolałbym kod Javy-a dokładniej klasę filtrów.

Myślałem, że ustawienie atrybutu Sesji javax.servlet.jsp.jstl.fmt.locale na żądaną instancję Locale wystarczy, ale jest ignorowane: znaczniki JSTL używają ustawień regionalnych przeglądarki.

Zweryfikowałem, że nie ma kontekstu strony ani atrybutów żądania to samo imię.

Więc co robię źle? Czy naprawdę muszę to zrobić z JSP?

Czytając kod JSTL, znalazłem odniesienia do LocalizationContext i myślę, że muszę ustawić jeden. Nie mogłem jednak dokładnie zrozumieć, jak pasuje do obrazu lub jak go ustawić.

Author: Jens Bannmann, 2011-05-25

5 answers

Potrzebujesz drugiego:

3 sposoby ustawiania JSTL locale: /jak również domyślny pakiet zasobów aplikacji, Strefa czasowa i źródło danych/

  1. Ustawiane przez działanie JSTL-pozwala to na określenie zakresu przez atrybut scope.

    <fmt:setLocale value="en_US" scope="session"/>
    
  2. Set programowo-umożliwia określenie zakresu poprzez Config API.

    import javax.servlet.jsp.jstl.core.Config;
    (...)
    Config.set( session, Config.FMT_LOCALE, new java.util.Locale("en", "US") )
    // or Locale.forLanguageTag("en-US") (java 1.7 and later)
    
  3. Set by Context Initialization Parameters-określa wartość używaną, jeśli ustawienie nie zostało znalezione w żadnym z standardowe lunety.

    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>en_US</param-value>
    </context-param>
    

Jstl-quick-reference (PDF)

 26
Author: monsterclub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 23:06:06

Możesz po prostu użyć EL w <fmt:setLocale>. To nie musi być zakodowana wartość czy coś.

Oto przykład:

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />

Jeśli język został dostarczony jako parametr żądania o nazwie language, to zostanie on ustawiony. W przeciwnym razie, jeśli język był już wcześniej ustawiony w sesji Przez nazwę atrybutu language, to trzymaj się go. W przeciwnym razie użyj ustawień regionalnych podanych przez użytkownika w nagłówku żądania.

Jeśli wykonasz session.setAttribute("language", language) w kodzie filtra, to zostanie on użyty -jeśli żaden parametr request nie jest ustawione.

Zobacz też:

 12
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:13

Z tego co wiem, javax.servlet.jsp.jstl.fmt.locale ' jest nadpisywane przez ustawienia regionalne przeglądarki. JSTL używa ustawień regionalnych przeglądarki, a jeśli tego nie znaleziono, używa ustawień regionalnych awaryjnych. Możesz więc ustawić atrybut żądania, aby określić ustawienia regionalne. Dodaj tę linię do kontrolera

request.setAttribute("javax.servlet.jsp.jstl.fmt.fallbackLocale.request", "en-us");

Użycie tej opcji ustawi ustawienia regionalne, których JSTL będzie używać. Zwróć uwagę na .request w nazwie atrybutu, jeśli ustawisz ten atrybut na inny zakres, będziesz musiał użyć innego sufiksu. Dla HttpSession przyrostek to .session , dla ServletContext przyrostkiem jest .zastosowanie

 3
Author: Ankit Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 09:57:24

Jeśli jesteś zależny od danych z DB, być może istnieje lepszy sposób na wstawienie tej logiki do 'router' lub 'controller' (zależy od tego, którego frameworka używasz). Wystarczy rozszerzyć adres url z parametrem ?lang='en'

Hope this helps

 0
Author: Igor Konoplyanko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 15:14:02

Jest inny sposób. W servlecie możesz ustawić ustawienia regionalne, tworząc atrybut sesji, tak:

request.getSession().setAttribute("javax.servlet.jsp.jstl.fmt.locale.session", "ko-KR");
 0
Author: Matthew Oakley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 12:44:28