Struts2 propose de base l'interceptor i18n. Celui-ci permet de changer la locale utilisée par les tags <s:text> et les fonctions getText(String key) de vos actions. Au lieu d'utiliser la valeur que votre navigateur fournit dans la requête http, si cet interceptor est défini dans la stack, c'est la valeur du paramètre "request_locale" de la requête qui est pris en compte.
L'interceptor fonctionne très bien si seul les tags struts sont utilisés ... mais pour les tags <fmt:message> il en est autrement ! De même, si vous utilisez struts-menu, qui se base également sur la locale de JSTL, l'interceptor n'aura aucun effet sur vos menus.
Voici une classe qui se base sur l'interceptor de struts et qui positionne la locale pour JSTL :
import java.util.Locale; import java.util.Map; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.I18nInterceptor; /** * The Class JstlI18nInterceptor. */ public class JstlI18nInterceptor extends I18nInterceptor { /** The Constant serialVersionUID. */ private static final long serialVersionUID = -6925616454174624288L; /** The Constant FMT_LOCALE_SESSION_KEY. */ private static final String FMT_LOCALE_SESSION_KEY = "javax.servlet.jsp.jstl.fmt.locale.session"; /* (non-Javadoc) * @see com.opensymphony.xwork2.interceptor.I18nInterceptor#saveLocale(com.opensymphony.xwork2.ActionInvocation, java.util.Locale) */ @Override protected void saveLocale(ActionInvocation invocation, Locale locale) { super.saveLocale(invocation, locale); // Set fmt locale Map<String, Object> session = invocation.getInvocationContext() .getSession(); session.put(FMT_LOCALE_SESSION_KEY, locale); } }
Il n'y avait vraiment pas grand chose à modifier ^^, mais cela m'a tout de même demandé un petit peu de temps avant de trouver une solution viable.