我的配置运行良好:
@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;
}
}
但是当我尝试像这样设置语言环境时:
@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";
}
未设置区域设置
LocaleContextHolder
将为您提供当前的区域设置,但不会解析要使用的新区域设置。尝试以下操作:
@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
将根据语言和区域解析 langCode,因此可能的值将是 en_US
、es_ES
、de_DE
,...您明白了;)如果您设置了应用程序不支持的区域设置不支持它总是会回退到默认值,所以需要担心这一点。