在以前的 SpringMVC中,國際化需要以下3步驟
1)、編寫國際化配置文件;
2)、使用ResourceBundleMessageSource管理國際化資源文件
3)、在頁面使用fmt:message取出國際化內容
SpringBoot中實現國際化的步驟:
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}
效果:根據瀏覽器語言設置的信息切換了國際化;
原理:
國際化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(); }
效果: