SpringBoot之国际化功能

一、准备国际化.properties文件

  

二、配置国际化文件的真实位置  

  使用:

    在application.properties文件中添加: spring.messages.basename=i18n.login

  原理:

    SpringBoot自动配置好了管理国际化

 1 public class MessageSourceAutoConfiguration {
 2 
 3     private static final Resource[] NO_RESOURCES = {};
 4 
 5     @Bean
 6     @ConfigurationProperties(prefix = "spring.messages")
 7     public MessageSourceProperties messageSourceProperties() {
 8         return new MessageSourceProperties();
 9     }
10 
11     @Bean
12     public MessageSource messageSource(MessageSourceProperties properties) {
13         ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
       // 如果我们在application.properties文件中配置了国际化文件的basename(国际化资源文件的基础名,去掉国家语言代码的)
       // 那么SpringBoot就会从配置的那个路径下读取国际化配置文件
       // 如果我们没有再application.properties文件中配置 默认就是把国际化配置文件放在类路径下,并命名为messages.properties
       // 因为源码中basename的基础值是messages
14 if (StringUtils.hasText(properties.getBasename())) { 15 messageSource.setBasenames(StringUtils 16 .commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename()))); 17 } 18 if (properties.getEncoding() != null) { 19 messageSource.setDefaultEncoding(properties.getEncoding().name()); 20 } 21 messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale()); 22 Duration cacheDuration = properties.getCacheDuration(); 23 if (cacheDuration != null) { 24 messageSource.setCacheMillis(cacheDuration.toMillis()); 25 } 26 messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat()); 27 messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage()); 28 return messageSource; 29 }

30 }

三、去页面中获取国际化的值

  1、如果在标签内部  可以用 #{login.tip} 取值

  2、如果在标签外部  可以用 [[#{login.tip}]] 取值

  到这里  我们就可以通过改变浏览器的中英文来切换页面的中英文模式  原理如下

    在WebMvcAutoConfigruation类中 (自动配置)  有一个LocalResolver()方法  代码如下  这是SpringBoot默认的区域解析器

 1 @Bean
 2         @ConditionalOnMissingBean
 3         @ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
 4         public LocaleResolver localeResolver() {
 5             if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
 6                 return new FixedLocaleResolver(this.mvcProperties.getLocale());
 7             }
         // 根据请求头带来的信息 进行区域化解析
8 AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver(); 9 localeResolver.setDefaultLocale(this.mvcProperties.getLocale()); 10 return localeResolver; 11 }

四、点击链接切换国际化

  1)、添加国际化切换按钮

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

  2)、自己写区域化解析器

 1 @Configuration
 2 public class MyLocaleResolver implements LocaleResolver {
 3     
 4     @Override
 5     public Locale resolveLocale(HttpServletRequest httpServletRequest) {
 6         String language = httpServletRequest.getParameter("l");
 7 
 8         Locale locale = Locale.getDefault();
 9 
10         if (!StringUtils.isEmpty(language)) {
11             String[] info = language.split("_");
12             locale = new Locale(info[0], info[1]);
13         }
14 
15         return locale;
16     }
17 
18     @Override
19     public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
20 
21     }
22 }

    3)、让自己写的区域化解析器生效

 1 //    自定义国际化组件生效
 2 
 3     /**
 4      * 页面国际化
 5      * 1、配置i18n文件
 6      * 2、如果需要项目中进行按钮自动切换,我们需要定义一个组件LocalResolver
 7      * 3、将自己写的组件,配置到spring容器中 @Bean
 8      */
 9     @Bean
10     public LocaleResolver localeResolver() {
11         return new MyLocaleResolver();
12     }

 

posted @ 2020-05-30 22:33  遨游java  阅读(697)  评论(0编辑  收藏  举报