springBoot + Thymeleaf:设置区域设置

问题描述 投票:0回答:1

我的配置运行良好:

@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";
    }

未设置区域设置

java spring spring-mvc thymeleaf spring-thymeleaf
1个回答
0
投票

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
,...您明白了;)如果您设置了应用程序不支持的区域设置不支持它总是会回退到默认值,所以需要担心这一点。

© www.soinside.com 2019 - 2024. All rights reserved.