SpringBoot如何實現國際化


在以前的 SpringMVC中,國際化需要以下3步驟

1)、編寫國際化配置文件;

2)、使用ResourceBundleMessageSource管理國際化資源文件

3)、在頁面使用fmt:message取出國際化內容

 

SpringBoot中實現國際化的步驟:

1)編寫國際化配置文件,抽取頁面需要顯示的國際化消息

1592523397(1)

 

2)spring boot自動配置好了管理國際化資源文件的組件

我們只需要在配置文件中指定國際化資源文件的位置

spring.messages.basename=i18n.login

//這是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)在頁面獲取國際化的值

通過thymeleaf的 #{message}

clipboard

效果:根據瀏覽器語言設置的信息切換了國際化;

原理:

國際化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;
        }
默認的就是根據請求頭帶來的區域信息獲取Locale進行國際化

 

4)、點擊鏈接切換國際化

前台:thymeleaf語法,localhost:8080/index

<a class="btn btn-sm" th:href="@{/index(l='zh_CN')}" >中文</a>
<a class="btn btn-sm" th:href="@{/index(l='en_US')}">English</a>

自定義 LocaleResolver

/**
 * @author houChen
 * @date 2020/6/19 12:41
 * @Description:   定義自己的國際化信息解析器
 */
public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
       String l= httpServletRequest.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 httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}

 

在配置文件中:向ioc容器中注入LocaleResolver 組件

/**
 * @Description:  將國際化信息解析器注冊到容器
 * @param
 * @author  houChen
 * @date  2020/6/19 13:16
 */
@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

效果:

1592543896(1)

1592543918(1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM