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

效果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM