1、添加消息国际化配置类如下:
@Configuration
public class I18nConfig implements WebMvcConfigurer {
//i18n,默认设为中文
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return slr;
}
//i18n,用url拼接?language=en_US切换语言
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("language");
return lci;
}
//i18n,把上面那个加进Interceptors里
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
2、在application.yml文件中添加配置如下:
spring:
# i18n configuration(添加语言国际化支持)
messages:
basename: i18n/messages
3、在resources下新建i18n文件夹,并添加对应各国语言的配置文件
没找到对应语言的配置文件,默认会使用messages.properties文件
4、在消息返回之前需要获取当前环境下对应的语言,然后去对应的配置文件中读取信息
消息国际化工具类:
@Component
public class I18nUtil implements MessageSourceAware {
private static MessageSource messageSource;
@Override
public void setMessageSource(@Nullable MessageSource messageSource) {
I18nUtil.messageSource = messageSource;
}
/**
* @param message 消息所对应的变量名
* @return 返回不包含变量的对应语言的消息
* @author qbanxiaoli
* @description 从配置文件中找到message对应语言的消息
*/
public static String getMessage(String message) {
//获取当前请求的语言类型
Locale locale = LocaleContextHolder.getLocale();
//返回配置文件中找到message对应语言的消息
//如果在指定的locale中没有找到消息,则使用默认的消息。
return messageSource.getMessage(message, null, message, locale);
}
/**
* @param message 消息所对应的变量名
* @return 返回包含变量的对应语言的消息
* @author qbanxiaoli
* @description 从配置文件中找到message对应语言的消息
*/
public static String getMessage(String message, Object[] args) {
//获取当前请求的语言类型
Locale locale = LocaleContextHolder.getLocale();
//返回配置文件中找到message对应语言的消息
//如果在指定的locale中没有找到消息,则使用默认的消息。args中的参数将使用标准类库中的MessageFormat来作消息中替换值。
return messageSource.getMessage(message, args, message, locale);
}
}
数据返回模型类:
@Data
@ApiModel(value = "数据返回模型")
public class ResponseVO<T> {
@ApiModelProperty(value = "结果状态", required = true)
private Boolean result;
@ApiModelProperty(value = "结果码", required = true)
private Integer code;
@ApiModelProperty(value = "结果信息", required = true)
private String message;
@ApiModelProperty(value = "返回数据")
private T data;
// 返回结果不包含数据,返回信息不包含变量
public ResponseVO(ResponseEnum responseEnum) {
this.result = responseEnum.getResult();
this.code = responseEnum.getCode();
this.message = I18nUtil.getMessage(responseEnum.getMessage());
}
// 返回结果包含数据,返回信息不包含变量
public ResponseVO(ResponseEnum responseEnum, T data) {
this.result = responseEnum.getResult();
this.code = responseEnum.getCode();
this.message = I18nUtil.getMessage(responseEnum.getMessage());
this.data = data;
}
// 返回结果不包含数据,返回信息包含变量
public ResponseVO(ResponseEnum responseEnum, Object[] args) {
this.result = responseEnum.getResult();
this.code = responseEnum.getCode();
this.message = I18nUtil.getMessage(responseEnum.getMessage(), args);
}
// 返回结果包含数据,返回信息包含变量
public ResponseVO(ResponseEnum responseEnum, T data, Object[] args) {
this.result = responseEnum.getResult();
this.code = responseEnum.getCode();
this.message = I18nUtil.getMessage(responseEnum.getMessage(), args);
this.data = data;
}
// 自定义返回结果构造器
public ResponseVO(Boolean result, Integer code, String message) {
this.result = result;
this.code = code;
this.message = I18nUtil.getMessage(message);
}
}
数据返回枚举类:
@Getter
@AllArgsConstructor
public enum ResponseEnum {
SUCCESS(true, 200, "SUCCESS"),//成功
SUCCESS_VARIABLE(true, 200, "SUCCESS_VARIABLE"),//传入成功变量信息
PARAMETER_ERROR(false, 400, "PARAMETER_ERROR"),//参数错误
PARAMETER_NOT_NULL(false, 400, "PARAMETER_NOT_NULL"),//{0}不能为空
FAILURE(false, 500, "FAILURE"),//失败
FAILURE_VARIABLE(false, 500, "FAILURE_VARIABLE");//传入失败变量信息
private Boolean result;
private Integer code;
private String message;
}
5、通过message变量,会去对应语言的配置文件中找到对应变量的值
6、如果是使用了如下方式的参数校验,无需再手动使用工具类进行消息国际化
@Data
@ApiModel("用户登录数据请求模型")
public class LoginFormDTO {
@NotBlank(message = "{USERNAME_NOT_NULL}")
@ApiModelProperty(value = "用户名", required = true)
private String username;
@NotBlank
@ApiModelProperty(value = "密码", required = true)
private String password;
}
添加如下配置类,可自动进行消息国际化转换
@Configuration
public class ValidatorConfig implements WebMvcConfigurer {
@Override
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
// 默认为普通失败,参数全部校验完成后才会返回,设置为快速失败后,参数校验失败后立即返回
validator.getValidationPropertyMap().put("hibernate.validator.fail_fast", "true");
validator.setValidationMessageSource(getMessageSource());
return validator;
}
private ResourceBundleMessageSource getMessageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasenames("i18n/messages");
messageSource.setCacheSeconds(10);
return messageSource;
}
}