-
SpringBootWeb开发-页面国际化
国际化原理:
页面之所以可以实现国际化效果,这要归结于名为Locale对象(区域信息对象),在SpringBoot的WebMvcAutoConfiguration中,有一个叫LocaleResolver的组件,这个组件就是用来获取区域信息对象的,也就是说SpringBoot的WebMvc自动配置中为我们配置了区域信息解析器,也就是下面的这段代码,从这段代码可以看到,如果我们的区域信息是固定的,那么就用固定配置的区域信息,否则呢就通过AcceptHeaderLocaleResolver 类中的resolveLocale这个方法中的request.getHeader这个请求头中获取区域信息。这个也是默认的区域信息解析器,如果要实现点击链接切换国际化语言,那就不能用这个默认的区域信息解析器了,就要自己写一个LocaleResolver。
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.编写国际化配置文件,也就是在resources文件夹下新建一个名为i18n的文件夹用来存放国际化配置文件,一个是login_en_US.properties,一个是login_zh_CN.properties,分别是英文和中文
(1)login_en_US.properties配置文件内容为,那些等号后面的英文就是login页面的英文
1 login.btn=Sign In 2 login.password=Password 3 login.remember=Remember Me 4 login.tip=Please sign in 5 login.username=UserName
(2)login_zh_CN.properties配置文件内容为
1 login.btn=登录 2 login.password=密码 3 login.remember=记住我 4 login.tip=请登录 5 login.username=用户名
(3)springboot中有一个MessageSourceAutoConfiguration自动配置类会为我们自动配置写好的国际化配置文件,在这个配置类里边有一个MessageSource组件,这个组件就是管理国际化配置的组件,全称为ResourceBundleMessageSource,这个组件会调用一个叫setBasenames的方法,这个方法是设置国际化资源文件基础名的(我们国际化配置文件的全名为login_zh_CN,去掉国家语言代码_zh_CN的名字就是基础名)
(4)在全局配置文件中配置我们的国家化配置文件,也就是在application.properties文件中添加spring.messages.basename=i18n.login这行代码即可,login是国际化配置文件的基础名,配置完后就相当于把我们的国际化配置文件让spring里的ResourceBundleMessageSource管了起来
2.在login.html页面通过#{}获取国际化配置文件的值,然后运行项目测试效果(这里如果有出现乱码的话就在file->setting->file encoding里将Default encoding for properties files修改为utf-8,并勾选旁边的转为ascll码选项,记得修改浏览器语言设置),至此基础的国际化功能成功(即根据浏览器设置页面显示中文还是英文)
二:实现点击链接切换国际化
1.将前端login.html页面的链接按钮上配置一个超链接和参数,便于后端处理
2.编写自己的区域信息解析器
(1)新建一个名字为MyLocaleResolver的类文件,实现区域信息解析器功能,目录结构如下
(2)编写代码
1 package com.xiaoma.springbootweb.component; 2 3 import org.springframework.util.StringUtils; 4 import org.springframework.web.servlet.LocaleResolver; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.util.Locale; 9 10 //如果实现自己的区域信息解析器,就要实现LocaleResolver中的resolveLocale方法 11 public class MyLocaleResolver implements LocaleResolver { 12 13 @Override 14 public Locale resolveLocale(HttpServletRequest request) { 15 //定义一个string类型变量,通过HttpServletRequest中的getParameter方法获取前端页面配置的参数 16 String l = request.getParameter("l"); 17 //声明一个locale对象,如果没有用这个区域信息解析器的话就用WebMvcAutoConfiguration中为我们自动配置的区域信息解析器 18 Locale locale=Locale.getDefault(); 19 if(!StringUtils.isEmpty(l)){ 20 //因为参数信息为zh_CN和en_US,中间用的是“_"线分开的,第一个是语言信息,第二个是国家代码,将参数分割存到String数组里 21 String[] split = l.split("_"); 22 locale=new Locale(split[0],split[1]); 23 } 24 return locale; 25 } 26 27 @Override 28 public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { 29 30 } 31 }
(3)为了让我们写好的区域信息解析器生效,要将这个组件添加到容器中,在MyMvcConfig这个配置类里添加。
1 @Bean 2 public LocaleResolver localeResolver(){ 3 return new MyLocaleResolver(); 4 }
(4)运行程序测试效果
原文:https://www.cnblogs.com/XiaoMaGuai/p/15600433.html