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