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ć.
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/
-
Ustawiane przez działanie JSTL-pozwala to na określenie zakresu przez atrybut scope.
<fmt:setLocale value="en_US" scope="session"/>
-
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)
-
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>
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ż:
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
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
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");
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