Spring Boot 国际化及点击链接跳转国家语言

一、国际化

  在SpringBoot中已经自动帮我们配置管理国际化资源的组件,所以我们只需要编写代码就可。

  

@Bean
    @ConfigurationProperties(prefix = "spring.messages")
    public MessageSourceProperties messageSourceProperties() {
        return new MessageSourceProperties();
    }

    @Bean
    public MessageSource messageSource(MessageSourceProperties properties) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(properties.getBasename())) {
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
                    StringUtils.trimAllWhitespace(properties.getBasename())));  //获取基础名(login_zh_CN中的login部分)
        }
        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }
        messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
        Duration cacheDuration = properties.getCacheDuration();
        if (cacheDuration != null) {
            messageSource.setCacheMillis(cacheDuration.toMillis());
        }
        messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
        messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
        return messageSource;
    }

 

 

  1.编写代码。

    在类路径下创建一个i18n的文件夹,存放国际化配置(login.properties、login_zh_CN.properties、login_en_US.properties)分别填写对应的值即可。

 

    2.在页面中获取国际化信息

    在thymeleaf中获取值信息。通过#{键}获取国际化中的值。

   3.在application.properties中配置如下代码。

#指定i18n从哪里配置
spring.messages.basename=i18n.login  //位置

 

  

  效果:会根据浏览器系统语言自动显示对应文字

二、点击超链接切换国家语言

  原理:

    @Bean
        @ConditionalOnMissingBean   //前提是容器中不存在这个组件,
                所以使用自己的对象就要配置@Bean让这个条件不成立(实现
LocaleResolver 即可


      @ConditionalOnProperty(prefix
= "spring.mvc", name = "locale") public LocaleResolver localeResolver()
      //如果在application.properties中有配置国际化就用配置文件的,没有配置就用AcceptHeaderLocaleResolver 默认request中获取
    {
            if (this.mvcProperties
                    .getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
                return new FixedLocaleResolver(this.mvcProperties.getLocale());
            }
            AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
            localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
            return localeResolver;
        }
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = getDefaultLocale();  
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
}
Locale requestLocale = request.getLocale();  //通过request对象获取请求头的国际化信息
List<Locale> supportedLocales = getSupportedLocales();
if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
return requestLocale;
}
Locale supportedLocale = findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
}
return (defaultLocale != null ? defaultLocale : requestLocale);
}
 

 

 

  1.实现点击链接切换国家语言(链接上加入区域信息“language='zh_CN'))

      通过原理知道可以通过request请求头中获取区域信息,所有我们在链接上加入区域信息“language='zh_CN')”,然后通过实现LocaleResolver重resolveLocale即可,并且将自己的实现类放在容器中,容器会自动加载这个组件。

 

  2.编写代码

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {

        String language = request.getParameter("language");
        //获取系统的语言
        Locale locale = Locale.getDefault();
        if (!StringUtils.isEmpty(language)){
            //有值
            String[] s = language.split("_");
            locale=new Locale(s[0],s[1]);

        }
        return locale;
    }

效果:

 

posted @ 2019-02-23 11:31  林财钦  阅读(1231)  评论(0编辑  收藏  举报