第一步:创建资源文件并配置资源文件地址
spring.messages.basename=i18n/messages
第二步:参考 org.springframework.web.servlet.i18n.LocaleChangeInterceptor 实现自己的拦截器
自己实现的拦截器可以添加自己的处理逻辑,比如我添加了从 request 的 header 参数中读取 Accept-Language 信息的功能
public class MyLocaleChangeInterceptor extends HandlerInterceptorAdapter {
private Logger logger= LoggerFactory.getLogger(MyLocaleChangeInterceptor.class);
private String paramName = "lang";
private boolean ignoreInvalidLocale = false;
private boolean getLanguageFromRequestHeader = false;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String newLocale = request.getParameter(this.getParamName());
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (StringUtils.hasText(newLocale)) {
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
try {
localeResolver.setLocale(request, response, this.parseLocaleValue(newLocale));
} catch (IllegalArgumentException e) {
if (!this.isIgnoreInvalidLocale()) {
throw e;
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + e.getMessage());
}
}
} else if (this.getLanguageFromRequestHeader) {
String acceptLanguage = request.getHeader("Accept-Language");
if (null != localeResolver && StringUtils.hasText(acceptLanguage)) {
try {
int index = acceptLanguage.indexOf(",");
String language_country = acceptLanguage.substring(0, index);
String [] array = language_country.split("-");
localeResolver.setLocale(request, response, this.parseLocaleValue(array[0] + "_" + array[1]));
} catch (Exception e) {
if (!this.isIgnoreInvalidLocale()) {
throw e;
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("doAcceptLanguage [" + acceptLanguage + "]: " + e.getMessage());
}
}
}
}
return true;
}
@Nullable
protected Locale parseLocaleValue(String localeValue) {
return StringUtils.parseLocale(localeValue);
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
public boolean isIgnoreInvalidLocale() {
return ignoreInvalidLocale;
}
public void setIgnoreInvalidLocale(boolean ignoreInvalidLocale) {
this.ignoreInvalidLocale = ignoreInvalidLocale;
}
public boolean isGetLanguageFromRequestHeader() {
return getLanguageFromRequestHeader;
}
public void setGetLanguageFromRequestHeader(boolean getLanguageFromRequestHeader) {
this.getLanguageFromRequestHeader = getLanguageFromRequestHeader;
}
}
第三步:创建一个配置类,用来设置默认信息
@Configuration
public class LocaleConfig {
@Value("${spring.messages.default_language}")
private String default_language = "zh";
@Value("${spring.messages.default_country}")
private String default_country = "CN";
@Value("${spring.messages.default_paramName}")
private String default_paramName = "lang";
@Value("${spring.messages.getLanguageFromRequestHeader}")
private boolean getLanguageFromRequestHeader = true;
/**
* 默认解析器 其中locale表示默认语言
* @return
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
Locale defaultLocale = new Locale(default_language, default_country);
Locale.setDefaultLocale(defaultLocale );
localeResolver.setDefaultLocale(defaultLocale );
return localeResolver;
}
/**
* 默认拦截器 其中default_paramName表示切换语言的参数名
*/
@Bean
public WebMvcConfigurer localeInterceptor() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
MyLocaleChangeInterceptor localeInterceptor = new MyLocaleChangeInterceptor();
localeInterceptor.setParamName(default_paramName);
localeInterceptor.setGetLanguageFromRequestHeader(getLanguageFromRequestHeader);
registry.addInterceptor(localeInterceptor);
}
};
}
}
第四步,封装一个message 工具类
@Component
public class MessageUtils {
@Autowired
private MessageSource messageSource;
/**
* 获取单个国际化翻译值
*/
public String getValue(String msgKey) {
try {
return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
} catch (Exception e) {
e.printStackTrace();
return msgKey;
}
}
}