I want to set the JSTL locale which is used by <fmt:formatNumber>
and friends. I know this is possible with <fmt:setLocale>
, but I need to do it dynamically (depending on user data retrieved from my DB) and would prefer Java code - a filter class, to be precise.
I thought setting the session attribute javax.servlet.jsp.jstl.fmt.locale
to my desired Locale
instance would do the trick, but it is ignored: The JSTL tags keep using the browser locale.
I verified there are no page context or request attributes of the same name.
So what am I doing wrong? Or do I really need to do it from a JSP?
Reading the JSTL code, I found references to a LocalizationContext
and think I need to set one. I couldn't quite figure out exactly how it fits into the picture or how to set one, though.
you need the 2nd:
3 ways to set JSTL locale: /as well as default application resource bundle, time zone, and data source/
Set by a JSTL action – this allows specification of scope by the scope attribute.
<fmt:setLocale value="en_US" scope="session"/>
Set Programmatically – allows specification of scope via the 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 – specifies value used if setting not found in any of the standard scopes.
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en_US</param-value>
</context-param>
jstl-quick-reference (PDF)
You can just use EL in <fmt:setLocale>
. It doesn't need to be a hardcoded value or something.
Here's an example:
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
If the language was supplied as request parameter with name language
, then it will be set. Else if the language was already previously set in the session by attribute name language
, then stick to it instead. Else use the user supplied locale in the request header.
If you do a session.setAttribute("language", language)
in your filter code, then it will be used -if no request parameter is been set.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With