springboot i18n 国际化

介绍

客户端经过Accept-Language控制国际化显示。spring

messageSource

  • getMessage(String code, Object[] args, String defaultMessage, Locale locale)
  • getMessage(String code, Object[] args, Locale locale)
  • getMessage(MessageSourceResolvable resolvable, Locale locale)

使用

一、springboot自带国际化,不须要单独引入依赖。springboot

二、在resource下新建 i18n/messages.propertiesspa

image.png

三、在启动配置文件增长如下内容code

  • properties配置
# locale 国际化
spring.messages.basename=i18n/messages
spring.messages.encoding=UTF-8
spring.messages.cache-duration=-1
  • yml配置
# locale 国际化
spring:
    messages:
       basename: i18n/messages
       encoding: UTF-8
       cache-duration: -1

四、在使用的类中引入 MessageResourceblog

@ControllerAdvice
public class GlobalExceptionHandler {
    @Autowired
    private MessageSource messageSource;
    
    private String getLocaleMessage(HttpServletRequest request, String code, Object[] msgArg) {
        Locale locale = RequestContextUtils.getLocale(request);
        if(locale == null){
            locale = Locale.US;
        }
        return messageSource.getMessage(code, msgArg, locale);
    }
}

五、在静态类中使用get

public static BaseResponse success(HttpServletRequest request, String requestId, Object object){
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    
    messageSource.setCacheSeconds(-1);
    messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
    messageSource.setBasenames("/i18n/messages");
    
    Locale locale = RequestContextUtils.getLocale(request);
    String code = ErrorCode.SUCCESS;
    String message = messageSource.getMessage(code, null, locale);
    BaseResponse res = new BaseResponse();
    res.setRequestId(requestId);
    res.setCode(code);
    res.setMessage(message);
    res.setData(object);
    return res;
}
public static String message(String code, Object... args){
    MessageSource messageSource = SpringUtils.getBean(MessageSource.class); 
    return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}