1.导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.新建国际化配置
推荐下载 Resource Bundle Editor
插件
使用插件方便编辑国际化资源信息:如下图
3.application.yml
application:
messages:
basename: i18n/message #具体路径根据自己的文件路径来
4.实现国际化
方案一:使用自带的现成的拦截器LocaleChangeInterceptor
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;
import java.util.Locale;
@Configuration
public class MessageWebMvcConfigurer implements WebMvcConfigurer {
//这个必须要,否则会报错,LocaleChangeInterceptor需要依赖LocaleResolver
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
//语言参数名字可以自定义
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry interceptorRegistry) {
//添加拦截器
interceptorRegistry.addInterceptor(localeChangeInterceptor()).addPathPatterns("/**");
}
}
@RestController
public class I18nController {
@Resource
private MessageSource messageSource;
@GetMapping("/test")
public String print() {
return messageSource.getMessage("print_success", null, LocaleContextHolder.getLocale());
}
}
注意: LocaleResolver 类必须得定义,否则可能会报错:
java.lang.UnsupportedOperationException: Cannot change HTTP accept header – use a different locale resolution strategy at org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver.setLocale(AcceptHeaderLocaleResolver.java:140)
具体原因参考:https://www.ytso.com/252018.html
方案一:自定义拦截器(不推荐)
public class MessageInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String lang = request.getParameter("lang");
if (StrUtil.isNotBlank(lang)) {
String[] s = lang.split("_");
LocaleContextHolder.setLocale(new Locale(s[0], s[1]), true);
}else{
LocaleContextHolder.setLocale(Locale.getDefault());
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
LocaleContextHolder.resetLocaleContext();
}
}
@Configuration
public class MessageWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry interceptorRegistry) {
//添加拦截器
interceptorRegistry.addInterceptor(new MessageInterceptor()).addPathPatterns("/**");
}
}