Springboot thymeleaf 配置i18n国际化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31653405/article/details/82664687

 

1、原理【一下来源网络,目的帮助理解】

       应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。

        一句话:“所谓国际化其实就是字符串的查找和替换过程”。查找就是根据code去资源文件中获取value,替换就是把value中可能包含的占位符替换成实际值,所以国际化的关键在于资源文件的加载和消息的渲染。

参考【 https://blog.csdn.net/roberts939299/article/details/69666291 】----感谢老师!!!

代码结构

3.1、首先配置后台中,i18n基本获取的底层数据结构,分别如下:

/***
   * i18n配置文件
   * @author wangning
   *
   */
  @Configuration
  @ComponentScan
  public class I18nConfig extends AbstractLocaleContextResolver{
  ​
      public static final String LOCALE_SESSION_ATTRIBUTE_NAME = SessionLocaleResolver.class.getName() + ".LOCALE";
      public static final String TIME_ZONE_SESSION_ATTRIBUTE_NAME = SessionLocaleResolver.class.getName() + ".TIME_ZONE";
        
       /** 国际化文件路径 */
      @Value("${spring.messages.basename}")
      public String[] basefilenames;
      
      @Bean(name="localeResolver")
      public LocaleResolver localeResolverBean() {
          SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
          sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH);
          return sessionLocaleResolver;
      }
  ​
      /**
       * 用于解析消息的策略接口,支持这些消息的参数化和国际化。
       */
      @Bean(name="messageSource")
      public ResourceBundleMessageSource resourceBundleMessageSource(){
          ResourceBundleMessageSource source=new ResourceBundleMessageSource();
          if (basefilenames != null) {
              for (int i = 0; i < basefilenames.length; i++) {
                  String basename = basefilenames[i];
                  Assert.hasText(basename, "Basename must not be empty");
                  this.basefilenames[i] = basename.trim();
              }
              source.setBasenames(basefilenames);
          } else {
              this.basefilenames = new String[0];
              source.setBasename(basefilenames[0]);
          }
          source.setDefaultEncoding("UTF-8");
          source.setUseCodeAsDefaultMessage(true);
          return source;
      }
      
      public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
          this.setLocaleContext(request, response, locale != null?new SimpleLocaleContext(locale):null);
      }
  ​
      @Override
      public LocaleContext resolveLocaleContext(HttpServletRequest request) {
          return null;
      }
  ​
      @Override
      public void setLocaleContext(HttpServletRequest request,HttpServletResponse response, LocaleContext localeContext) {
           Locale locale = null;
              TimeZone timeZone = null;
              if(localeContext != null) {
                  locale = localeContext.getLocale();
                  if(localeContext instanceof TimeZoneAwareLocaleContext) {
                      timeZone = ((TimeZoneAwareLocaleContext)localeContext).getTimeZone();
                  }
              }
              WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale);
              WebUtils.setSessionAttribute(request, TIME_ZONE_SESSION_ATTRIBUTE_NAME, timeZone);
      }
      
  }
 @Configuration
  public class MyIntercepter extends WebMvcConfigurerAdapter  {
  ​
      @Bean
      public LocaleChangeInterceptor localeChangeInterceptor() {
          LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
          lci.setParamName("language");
          return lci;
      }
  ​
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(localeChangeInterceptor());
      }
  }

3.2、其次,设置springboot中的properties的配置文件,如下:

  spring.messages.basename=i18n/award/messages,i18n/system/messages

3.3、在项目的rescources中国,创建i18n的文件夹,用来放置项目中,业务中出现的多个i18n国际化文件(便于维护),如下:

【图片经过部分隐藏,望理解!!!】

3.4、以上创建好后,在应使用i18n的页面中,进行如下配置:

以上完成后,重启项目,便可访问;

【注意----自己遇见的坑,不知道其他人是否也有】:

项目中,更新i18n的properties文件时,都要重启一次项目,否则页面不加载i18n的value值。

--------------------------------------------------------------------------------------------------------------

以上是自己整理的,并测试过,可以直接用

----------------------------------------------------------------------------------------------------------------

文章中,有问题,可以在评论区评论,一起探讨编程中奥秘!

----------------------------------------------------------------------------------------------------------------

来都来了,代码看都看了,那就留个言呗,可以互动下!

----------------------------------------------------------------------------------------------------------------

转载声明:本文为博主原创文章,未经博主允许不得转载。

猜你喜欢

转载自blog.csdn.net/qq_31653405/article/details/82664687