Springboot支持后端实现国际化
1.修改yml配置文件
#数据源配置
spring:
messages:
basename: i18n/messages #配置国际化资源文件路径
2.创建国际化资源文件
messages.properties不带后缀为默认语言资源
1000=token已过期,请重新登录
2000=登录失败,{0}
1001=请求参数异常 {0}
messages_en_US.properties英文版本
1000= The token has expired. Please log in again
2000= Login failure, {0}
1001= Request Parameter exception {0}
messages_en_US.properties中文版本
1000=token已过期,请重新登录
2000=登录失败,{0}
1001=请求参数异常 {0}
3.实现MessageUtils.java工具类
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Component;
import java.util.Locale;
/**
* 获取i18n资源文件
*/
@Component
public class MessageUtils {
private static MyLocaleResolver myLocaleResolver;
public MessageUtils(MyLocaleResolver resolver) {
MessageUtils.myLocaleResolver = resolver;
}
/**
* 根据消息键和参数 获取消息 委托给spring messageSource
*
* @param code 消息键
* @param args 参数
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args) throws NoSuchMessageException {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setDefaultEncoding("UTF-8");
messageSource.setBasenames("/i18n/messages");
Locale locale = MessageUtils.myLocaleResolver.getLocale();
return messageSource.getMessage(code, args, locale);
}
}
4.新建MyLocaleResolver类用来重写默认国际化设置
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
@Configuration
public class MyLocaleResolver implements LocaleResolver {
@Autowired
private HttpServletRequest request;
public Locale getLocale() {
return resolveLocale(request);
}
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//通过请求头来切换中英文
String language = httpServletRequest.getHeader("lang");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(language) && language.split('_').length == 2) {
String[] s = language.split('_');
locale = new Locale(s[0], s[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
5. java代码中使用MessageUtils实现国际化操作
Response是自己封装的类
@GetMapping(value = "/test")
public Response test() {
String s = "123";
return Response.success(messageUtils.message("1000") +'\n'+ messageUtils.message("2000",s));
}
中文测试
英文