3

I've got i18n configured in my Spring MVC app (localeInterceptor etc).

Two languages supported (en & pl). PL is default one. I18n works of course.

My case is to get current locale and pass it to model. That's easy, but when I pass invalid locale argument (like localhost:8080/?language=asd) I get "asd" instead of "pl" which is default.

It is worth to mention that whole i18n works perfectly, I mean messages_pl.properties are used in this case. I tried following methods with no success:

@RequestMapping(...)
public String home(Locale locale,..)

localeResolver.resolveLocale(request);
RequestContextUtils.getLocale(request);
LocaleContextHolder.getLocale();

every of these gives me a "asd" instead of "pl".

Atm I've got a bit messy workaround:

if (!supportedLocaleService.isLocaleSupported(locale)) {//myservice
    locale = new Locale("pl");
}
Rotek
  • 65
  • 1
  • 10

2 Answers2

1

You could override the LocaleChangeInterceptor

public class SupportedLocaleAwareLocaleChangeInterceptor extends LocaleChangeInterceptor {

    private List<String>supportedLocales = Arrays.asList("pl",....);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws ServletException {

        String newLocale = request.getParameter(this.paramName);
        //if (newLocale != null) {
        if (newLocale != null && supportedLocales.contains(newLocale )) {
            LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
            if (localeResolver == null) {
                throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
            }
            localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
        }
        // Proceed in any case.
        return true;
    } 
}
Ralph
  • 118,862
  • 56
  • 287
  • 383
  • yeah, that seems to be a proper solution. But i thought that spring does it for default because it choose proper properties file (default one) if locale is invalid. – Rotek Mar 30 '16 at 15:55
0

one more way.

public class CustomCookieLocaleResolver extends CookieLocaleResolver {

        private final List<String> permittedLanguages = Arrays.asList("sk", "en");

        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            Locale locale = (Locale) request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME);
            if (locale != null && !permittedLanguages.contains(locale.getLanguage())) {
                locale = determineDefaultLocale(request);
            }
            return locale;
        }

        @Override
        public LocaleContext resolveLocaleContext(HttpServletRequest request) {

            try {
                LocaleContext context = super.resolveLocaleContext(request);
                return context;

            } catch (Exception e) {

            }

            final Locale defaultLocale = determineDefaultLocale(request);
            TimeZone defaultTimeZone2 = determineDefaultTimeZone(request);

            return new TimeZoneAwareLocaleContext() {
                @Override
                @Nullable
                public Locale getLocale() {
                    return defaultLocale;
                }

                @Override
                @Nullable
                public TimeZone getTimeZone() {
                    return defaultTimeZone2;
                }
            };
        }

        @Override
        public void addCookie(HttpServletResponse response, String cookieValue) {
            if (permittedLanguages.contains(cookieValue)) {
                super.addCookie(response, cookieValue);
            }
        }
    }
egemen
  • 779
  • 12
  • 23