springboot国际化多配置文件实现方法

本文详细展示了如何在SpringBoot应用中管理多语言文件(如.properties),配置类扫描并加载资源,利用工具方法获取用户指定语言的消息,以及创建基于异常枚举的错误码和国际化消息。

1.创建中英文文件

创建三个/两个文件(第一个可以不提供)

1.xxx模块_message.properties
2.xxx模块_message_en_US.properties
3.xxx模块_message_zh_CN.properties

USER_OR_PASSWORD_ERROR=用户名或密码错误

2.创建配置类扫描多文件

@Configuration
public class LocalMessageConfig {

    @Bean(name = "messageSource")
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        String[] strings = scanModelsForI18nFolders();
        messageSource.setBasenames(strings);
        messageSource.setDefaultEncoding("UTF-8");
        logger.info("加载messageSource:{}", StringUtils.join(Arrays.stream(strings).map(String::toString).collect(Collectors.toList()), ","));
        return messageSource;
    }

    public String[] scanModelsForI18nFolders() {
        try {
            // 通配规则 直接获取 Resources中的内容
            String resourcePattern = "classpath*:i18n/*_message.properties";
            ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = resourcePatternResolver.getResources(resourcePattern);
            String[] paths = new String[resources.length];

            for (int i = 0; i < resources.length; i++) {
                Resource resource = resources[i];
                String[] urlStrArr = resource.getURL().toString().split("/");
                int index = urlStrArr.length - 1;
                String moduleName = urlStrArr[index];
                // 通配符加+ 模块名 + /国际化数据目录
                paths[i] = "classpath:i18n/" + moduleName.substring(0, moduleName.length() - 11);

            }
            return paths;

        } catch (Exception e) {

        }
        return null;
    }
}

3.创建工具类,解析语种请求

public class LocaleMessageUtils {

    public static String getMessage(String code) {
        MessageSource messageSource = SpringContextUtil.getBean("messageSource");
        Locale locale = LocaleContextHolder.getLocale();
        return messageSource.getMessage(code, null, locale);
    }
}

4.创建异常枚举枚举

public enum BaseExceptionEnum {

    USERNAME_OR_PASSWORD_ERROR(4001, "USER_OR_PASSWORD_ERROR");

    BaseExceptionEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }


    private Integer code;

    private String message;

    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        // 根据编码翻译
        return LocaleMessageUtils.getMessage(message);
    }
}

5.测试

中文测试

在postman中添加语种请求头

中文请求头

测试结果

中文请求头测试结果

英文测试

在postman中添加语种请求头

英文请求头

测试结果

英文请求头测试结果

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值