package com.mossle.core.i18n; import java.io.IOException; import java.util.Locale; import javax.annotation.Resource; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.LocaleResolver; public class I18nFilter implements Filter { private static Logger logger = LoggerFactory.getLogger(I18nFilter.class); private LocaleResolver localeResolver; public void init(FilterConfig filterConfig) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; if ("GET".equalsIgnoreCase(req.getMethod())) { String requestedLocale = request.getParameter("locale"); if (requestedLocale != null) { Locale locale; String[] array = requestedLocale.split("_"); if (array.length == 2) { locale = new Locale(array[0], array[1]); } else { locale = new Locale(array[0]); } localeResolver.setLocale(req, res, locale); logger.debug("update locale : {}", locale); } } Locale locale = localeResolver.resolveLocale(req); logger.debug("resolve locale : {}", locale); if (locale == null) { locale = req.getLocale(); logger.debug("req locale : {}", req.getLocale()); } try { LocaleContextHolder.setLocale(locale); req.setAttribute("locale", locale); req.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, localeResolver); filterChain.doFilter(request, response); } finally { LocaleContextHolder.resetLocaleContext(); } } @Resource public void setLocaleResolver(LocaleResolver localeResolver) { this.localeResolver = localeResolver; } }