1.添加国际化解析器和拦截器
- 国际化解析器:SessionLocaleResolver是国际化解析器的一种,比其他解析器灵活,用户可以选择国际化区域,将国际化信息设置在session中。可以在在该解析器中设定默认的语言。
- 国际化拦截器:LocaleChangeInterceptor,设置拦截的参数(该参数可以在前台赋值,mvc将其保存到session中),该参数的值将作为国际化区域(语言)。
- 注册国际化拦截器
package com.zyf.springMVC.international;
import java.util.Locale;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
/**
* 添加国际化解析器和拦截器
*/
@Configuration
public class InternationalConfig implements WebMvcConfigurer {
// 国际化解析器,bean的名称必须用"localeResolver"
@Bean("localeResolver")
public LocaleResolver initLocaleResolver() {
// 可以将国际化信息设置在session中;比其他解析器灵活,用户可以选择国际化区域。
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);// 配置国际化区域为简体中文
// slr.setDefaultLocale(Locale.US);// 配置国际化区域为美国英文
return slr;
}
// 国际化拦截器
private LocaleChangeInterceptor localeChangeInterceptor;
@Bean
public LocaleChangeInterceptor initLocaleChangeInterceptor() {
if (null != localeChangeInterceptor) {
return localeChangeInterceptor;
}
localeChangeInterceptor = new LocaleChangeInterceptor();
// 设置拦截的参数,该参数的值将作为国际化区域(语言)
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
// 注册国际化拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(initLocaleChangeInterceptor());
}
}
2.国际化的springboot配置
- spring.messages.basename:配置国际化文件的路径和文件名前缀。如下面的配置说明时间文件放在src\main\resources\i18n内,且文件名前缀是international,前缀后加语言类型,如下面的文件名截图。springboot默认支持,如果不配置该选项,则文件放在src\main\resources内,且文件前缀是messages。
# 文件编码
spring.messages.encoding=UTF-8
# 国际化文件基础名称(resources目录下)
spring.messages.basename=i18n/international
# 国际化消息缓存有效时间(单位秒),超时将重新载入
spring.messages.cache-duration=3600
3.控制器
package com.zyf.springMVC.international;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/international")
public class InternationalController {
@Autowired
private MessageSource messageSource;
@RequestMapping("/ic1")
public ModelAndView ic1(ModelAndView mav,HttpServletRequest request) {
Locale locale = LocaleContextHolder.getLocale();
System.out.println("国际化区域=" + locale);
String msg = messageSource.getMessage("msg", null, locale);
System.out.println("消息=" + msg);
mav.addObject("msg", msg);
mav.addObject("language", locale);
mav.setViewName("international/ic1");
return mav;
}
}
4.视图
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>mic1</title>
</head>
<body>
<span>当前语言:</span><span th:text="${language}"></span></br>
<!-- language参数对应值将后台拦截,并存放到session中 -->
<a href="./ic1?language=zh_CN">简体中文</a> <a href="./ic1?language=en_US">ENGLISH</a></br>
<span>消息:</span><span th:text="${msg}"></span></br>
</body>
</html>
5.测试
http://localhost:8080/international/ic1
点击ENGLISH
注意到请求URL中,带有参数。该参数将会保存到session中。我们再次用http://localhost:8080/international/ic1访问,不包含语言参数。结果如下:
点击简体中文,可以将设定为中文,同样语言参数会被保存的session中,继续使用,直到改变语言。这都归功于国际化拦截器对参数language的拦截。
github:https://github.com/zhangyangfei/SpringBootLearn.git中的springMVC工程。