1、编写国际化配置文件,将需要国际化显示的内容写在配置文件中
1)、在类路径下面,创建一个文件夹:i18n
2)、在文件夹 i18n 中创建一个默认的国际化文件:login.properties(文件名可以任意,但是必须是properties文件),我的内容如下:
#默认的国际化配置文件
login.username=用户名_
login.password=密码
login.remember=记住我
login.reset=重置
login.submit=登录
3)、创建国际化的配置文件,命名方式为:默认配置文件名_语言代码_国家代码.properties,如中文配置文件:login_zh_CH.properties;内容于默认配置文件一直,但是,参数值要是配置的语言,如英文的配置文件名:login_en_US.properties,文件内容为:
#英文的国际化配置文件
login.username=Username
login.password=Password
login.remember=Remember
login.reset=Reset
login.submit=Sign
2、Spring Boot已经自动配置了管理国际化资源文件的组件:MessageSourceAutoConfiguration,源码如下:
public class MessageSourceAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.messages")
public MessageSourceProperties messageSourceProperties() {
return new MessageSourceProperties();
}
@Bean
public MessageSource messageSource() {
// 国际化资源相关属性
MessageSourceProperties properties = this.messageSourceProperties();
//管理国际化资源的组件
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
}
public class MessageSourceProperties {
private String basename = "messages";
//默认国际化资源文件的基础名(就是去掉 语言_国家代码 之后的名称,上面自定义的是login)
//即 如果我们定义为 messages.properties 就可以放在类路径下,就可不做任何配置,
//就会被直接被加载
if (StringUtils.hasText(properties.getBasename())) {
//设置国际化资源文件的基础名(就是去掉 语言_国家代码 之后的名称,自定义的就是login)
messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUt
ils.trimAllWhitespace(properties.getBasename())));
}
通过对源码的粗略分析:如果国际化配置文件的基础名(也就是默认语言配置文件,这里是login.properties)是 message,则可以将国际化配置文件放在类路径下面,不需要做任何配置;如果基础名不是 message,则可以将配置文件放在类路径下的任意位置,但是需要在全局配置文件application.properties 中声明,例如:
spring.messages.basename=i18n.login
3、修改页面内容,使用 #{} 符号来获取国际化配置文件中的国际化值,这里是 springboot 通过浏览器的url 请求头(header)中的 Accept-Language 的值,来决定使用的是哪个国际化配置文件中的值
页面修改如下:
1、给页面中的 标签修改:
2、自定义一个区域解析器
package com.dss.springboot.component;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
/**
* 自定义区域解析器来切换国际化信息
* @author asong
*
*/
public class MyLocaleResolver implements LocaleResolver{
/**
* 解析区域信息
*/
@Override
public Locale resolveLocale(HttpServletRequest request) {
//获取请求头中的 l 参数
String l = request.getParameter("l");
//获取浏览器上发送来的请求头中的区域信息,也就是获取请求头中的 Accept-Language 的值,默认是 zh-CN,zh;q=0.9,表示中文
Locale locale = request.getLocale();
//当传来的 l 有值时,表示用根据传来的参数来切换国际化信息
if(!StringUtils.isEmpty(l)) {
String[] split = l.split("_");
//创建一个区域信息,参数一:语言代码,参数二:国家代码
locale = new Locale(split[0], split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest arg0, HttpServletResponse arg1, Locale arg2) {
}
}
3、将自定义的区域解析器,在配置类中 ,通过 @Bean注解的方法,向spring容器中注入组件
/**
* 需要通过配置类,来往 spring 容器中注入一个 LocaleResolver 组件,在springboot中配置了一个默认的 LocaleResolver 组件,但是如果自定义了一个,就会使用自定义的这个组件
* @return
*/
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}