I have this configutation that is working fine:
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, jsr250Enabled = true)
public class MvcConfig implements WebMvcConfigurer {
private final MessageSource messageSource;
public MvcConfig(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Override
@Bean
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource);
return bean;
}
}
but when I try to set the locale like this:
@PostMapping("/blogs")
public String handleSubmit(@RequestParam("langCode") String langCode) {
// Handle the selected option here
if (FR_LANG.equalsIgnoreCase(langCode)) {
LocaleContextHolder.setLocale(Locale.FRENCH);
} else if (ES_LANG.equalsIgnoreCase(langCode)) {
LocaleContextHolder.setLocale(new Locale.Builder().setLanguage("es").build());
} else if (PT_LANG.equalsIgnoreCase(langCode)) {
LocaleContextHolder.setLocale(new Locale.Builder().setLanguage("pt").build());
} else {
LocaleContextHolder.setLocale(Locale.ENGLISH);
}
// Redirect to a different page or return the same page
return "redirect:/blogs";
}
the locale is not set
The LocaleContextHolder
will give you the current locale set, but not resolve a new one to use. Try the following:
@PostMapping("/blogs")
public String handleSubmit(@RequestParam("langCode") String langCode,
HttpServletRequest request,
HttpServletResponse response) {
if (langCode!= null && !langCode.isBlank()) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null)
throw new IllegalStateException("No LocaleResolver found");
try {
localeResolver.setLocale(request, response, StringUtils.parseLocale(langCode));
} catch (IllegalArgumentException e) {
logger.debug("Ignoring invalid locale value [{}]: {}", langCode, e.getMessage());
}
}
return "redirect:/blogs";
}
StringUtils#parseLocale
see documentation here will parse langCode according to language and region, thus possible values would be en_US
, es_ES
, de_DE
, ... you get the idea ;) If you set a locale which your application doesn't support it will always fallback to the default, so need to worry about that.