Spring Boot实现i18n消息国际化

本文介绍了如何在Spring Boot项目中实现i18n消息国际化,包括配置类设置、yaml文件配置、语言资源文件创建、消息国际化工具类的编写以及参数校验的自动国际化转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值