**

一、简介

**
i18n是Internationalization这个英文的简写,因为Internationalization去掉头尾的i和n刚好还剩下18个字符,它是国际化的意思 。

Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际化, 核心的思想就是, 对不同的语言提供一个不同的资源文件。

二、功能

系统页面文字、前端交互信息、后台交互信息都能进行多语言的切换。

手动进行系统语言切换。

系统可以根据浏览器的默认语言设置进行语言切换。

三、Java国际化步骤

3.1建立语言的资源文件

Java软件调语言 java设置语言_Java软件调语言


Java软件调语言 java设置语言_Source_02


Java软件调语言 java设置语言_java_03


Java软件调语言 java设置语言_spring_04

如图所示,sysmsg.properties为默认语言模式,当系统没找到相对应的语言文件时,将调用本文件的数据。

sysmsg_en_US.properties为英文资源文件,sysmsg.properties_zh_CN为中文语言文字。

3.2国际化语言配置
3.2.1创建MessageUtils工具类
MessageUtils主要作用是在后台通过key来获取目前系统语言的value值。

public class MessageUtils {

   private final MessageSource messageSource;

   public MessageUtils(MessageSource messageSource) {
       this.messageSource = messageSource;
   }

   public String getMessage(String msgKey, Object[] args) {
       return messageSource.getMessage(msgKey, args, LocaleContextHolder.getLocale());
   }

   public String getMessage(String msgKey) {
       return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
   }
}

3.2.2创建本地语言的配置类LocaleConfig,用于配置i18n的设置
(1)MessageUtils注入容器。

(2)设置i18资源文件读取的路径。(messageSource()方法)

(3)设置默认本地语言解析器。唯有配置了这个才能系统可以根据浏览器的默认语言设置进行语言切换。(localeResolver()方法)

(4)默认拦截器 其中lang表示切换语言的参数名。(localeInterceptor())

@Configuration
public class LocaleConfig {

   @Bean
   public MessageUtils messageUtils() {
       return new MessageUtils(messageSource());
   }

 /**
 *资源文件路径
 **/
   @Bean
   public ResourceBundleMessageSource messageSource() {
       Locale.setDefault(Locale.CHINESE);
       ResourceBundleMessageSource source = new ResourceBundleMessageSource();
       /*ame of the resource bundle*/
       source.setBasenames("i18n/sysmsg","i18n/userGeneral", "i18n/pageGeneral", "i18n/webValidator");
       //默认是false,调试设置为true
       source.setUseCodeAsDefaultMessage(true);
       source.setDefaultEncoding("UTF-8");
       return source;
   }


   /**
     * 默认解析器 其中locale表示默认语言
     */
   @Bean
   public LocaleResolver localeResolver() {
       SessionLocaleResolver localeResolver = new SessionLocaleResolver();
       // localeResolver.setDefaultLocale(Locale.UK);
       return localeResolver;
   }

   /**
     * 默认拦截器 其中lang表示切换语言的参数名
     */
   @Bean
   public WebMvcConfigurer localeInterceptor() {
       return new WebMvcConfigurerAdapter() {
           @Override
           public void addInterceptors(InterceptorRegistry registry) {
               LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
               localeInterceptor.setParamName("lang");
               registry.addInterceptor(localeInterceptor);
           }
       };
   }
}

3.2.3freemarker页面引入 spring.ftl
spring.ftl文件主要作用于在前端页面获取资源文件中的语言文字, spring.ftl文件位置复制到 resources/static 文件夹下 。spring.ftl文件位于:

Java软件调语言 java设置语言_Source_05

页面上引入<#import “spring.ftl” as spring>

页面上取值roperties文件中的变量值的方法为:<@spring.message code=“login.tip” />

四、示例

4.1 前端展示

Java软件调语言 java设置语言_spring boot_06

地址带参数lang=en_US 进行切换

http://127.0.0.1:8090/project/login/login?lang=en_US

Java软件调语言 java设置语言_Source_07


Java软件调语言 java设置语言_Java软件调语言_08

4.2后台交互设置

Java软件调语言 java设置语言_spring boot_09


Java软件调语言 java设置语言_Java软件调语言_10


Java软件调语言 java设置语言_spring_11