springboot国际化

实现效果:默认使用浏览器的语言,如果请求url包含参数l=zh_CN,则使用自己配置的Locale。

springboot也是 使用ResourceBundleMessageSource管理国际化资源文件

步骤:

1、编写国际化配置文件,抽取页面需要显示的国际化消息

2、SpringBoot自动配置好了管理国际化资源文件的组件

@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {
    /**
    * Comma‐separated list of basenames (essentially a fully‐qualified classpath
    * location), each following the ResourceBundle convention with relaxed support for
    * slash based locations. If it doesn't contain a package qualifier (such as
    * "org.mypackage"), it will be resolved from the classpath root.
    */
    private String basename = "messages";
    //我们的配置文件可以直接放在类路径下叫messages.properties;
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        if (StringUtils.hasText(this.basename)) {
            //设置国际化资源文件的基础名(去掉语言国家代码的)
            messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
            StringUtils.trimAllWhitespace(this.basename)));
        } 
        if (this.encoding != null) {
            messageSource.setDefaultEncoding(this.encoding.name());
        } 
        messageSource.setFallbackToSystemLocale(this.fallbackToSystemLocale);
        messageSource.setCacheSeconds(this.cacheSeconds);
        messageSource.setAlwaysUseMessageFormat(this.alwaysUseMessageFormat);
        return messageSource;
    }


3、页面获取国际化的值

<label th:text="#{login.username}">Username</label>
<input type="text" class="form‐control" placeholder="Username" th:placeholder="#
{login.username}" required="" autofocus="">

效果:根据浏览器语言设置的信息切换了国际化(根据浏览器设置的语言, 服务端根据请求头acquire-language判断)

原理:默认的就是根据请求头带来的区域信息获取Locale进行国际化
国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
    if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
        return new FixedLocaleResolver(this.mvcProperties.getLocale());
    } 
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
    return localeResolver;
}

4、点击链接切换国际化

/**
* 可以在连接上携带区域信息
*/
public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String l = request.getParameter("l");
        Locale locale = Locale.getDefault();
        if(!StringUtils.isEmpty(l)){
            String[] split = l.split("_");
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }
    
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }
}

//配置类中配置
@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

---

原文地址:https://www.cnblogs.com/xy-ouyang/p/14025794.html