一、目的
針對不同地區,設置不同的語言信息。
SpringBoot國際化配置文件默認放在classpath:message.properties,如果自定義消息配置文件,需要application.properties或application.yml中設置spring.messages.basename的值。
二、步驟
在src/main/resources 下建i18n文件夾
在i18n文件夾中建立messages.properties 找不到語言配置時,使用此文件
hello=你好_默認
在i18n文件夾中建立messages_en_US.properties 英文語言配置
hello=hello_English
在i18n文件夾中建立messages_zh_CN.properties 中文語言配置
hello=你好_中文
MessageConfig.java
對消息的配置
package com.spring.security.config.spring;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.i18n.LocaleContext;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.util.Assert;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AbstractLocaleContextResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@Configuration
public class MessageConfig extends AbstractLocaleContextResolver{
@Value("${spring.messages.basename}")
public String[] basenames;
@Bean(name = "messageSource")
public ResourceBundleMessageSource resourceBundleMessageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
if (basenames != null) {
for (int i = 0; i < basenames.length; i++) {
String basename = basenames[i];
Assert.hasText(basename, "Basename must not be empty");
this.basenames[i] = basename.trim();
}
source.setBasenames(basenames);
} else {
this.basenames = new String[0];
source.setBasename(basenames[0]);
}
source.setDefaultEncoding("UTF-8");
source.setUseCodeAsDefaultMessage(true);
return source;
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return slr;
}
/**
* 國際化,設置url識別參數
*
* @return
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override
public LocaleContext resolveLocaleContext(HttpServletRequest request) {
return null;
}
@Override
public void setLocaleContext(HttpServletRequest request, HttpServletResponse response,
LocaleContext localeContext) {
}
}
SpringUtils.java
Spring工具類,用於獲取ApplicationContext
package com.spring.security.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
/**
* Spring容器
*/
@Service
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext context = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (context == null) {
context = applicationContext;
}
}
/**
* 獲取容器
*
* @return 容器
*/
public static ApplicationContext getContext() {
return context;
}
}
MessageUtils.java
封裝獲取message的工具類
package com.spring.security.common.utils;
import java.util.Locale;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class MessageUtils {
public static String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
String message = reloadableResourceBundleMessageSource.getMessage(code, null, locale);
return message;
}
}

** WebMvcConfig.java**
mvc配置,解決跨域,接口中文亂碼,添加語言攔截器
package com.spring.security.config.spring;
import java.nio.charset.Charset;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private LocaleChangeInterceptor localeChangeInterceptor;
/**
* 解決跨域
*/
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*")
.allowCredentials(true);
}
/**
* 配置消息轉換器
* 解決返回String亂碼
*/
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
}
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(localeChangeInterceptor);
}
}
三、測試
測試接口:
package com.spring.security.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.spring.security.common.utils.I18nUtils;
@RestController
public class TestController {
@GetMapping("/test")
public String doTest() {
return I18nUtils.getMessage("hello");
}
}


