zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    jquery水印插件:placeholder
    EF POWER TOOLS由数据库逆向CODE FIRST
    .NET重构(类型码的设计、重构方法)
    CodeUI Test:创建第一个CodeUI Test
    Windows 8 Store Apps
    ASP.NET MVC 使用MSBuild部署的几个注意事项
    c#中如何跨线程调用windows窗体控件
    Restful?
    Javascript的一种代码结构方式——插件式
    AOP编程
  • 原文地址:https://www.cnblogs.com/lxy-java/p/12995371.html
Copyright © 2011-2022 走看看