Spring Boot学习笔记(8)——国际化信息

SprintBoot国际化步骤

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 的值,来决定使用的是哪个国际化配置文件中的值
Spring Boot学习笔记(8)——国际化信息_第1张图片
页面修改如下:
Spring Boot学习笔记(8)——国际化信息_第2张图片

自定义区域解析器动态切换国际化语言

1、给页面中的 标签修改:

中文          English

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();
}

你可能感兴趣的:(SpringBoot)