springboot实现国际化

引言

今天在开发过程中,遇到国外客户,要求项目一些返回msg中,不能再有中文,于是便有了国际化需求。

How to do
1.在项目resources下创建i18n文件夹以及messages.properties文件

messages.properties 国际化主文件

复制代码
phoneErr.msg=The phone number err

messages_en.properties 英文配置文件

复制代码
phoneErr.msg=The phone number err

messages_zh.properties 中文配置文件

复制代码
phoneErr.msg=手机号错误

这三个文件缺一不可

2.在项目中创建MyLocaleResolver.java

java 复制代码
@Configuration
public class MyLocaleResolver {

    @Bean
    public LocaleResolver localeResolver() {
        log.info("LocaleResolver loading...");
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); // 设置默认语言
//        slr.setDefaultLocale(Locale.US); // 设置默认语言
        return slr;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

}

3.切换中英文,采用自定义spring拦截器方式

java 复制代码
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }

    class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            String header = request.getHeader("Accept-Language");
            if (StrUtil.isBlank(header)) {
                return true;
            } else if ("zh".equals(header)) {
                LocaleContextHolder.setLocale(Locale.SIMPLIFIED_CHINESE);
            } else if ("en".equals(header)) {
                LocaleContextHolder.setLocale(Locale.US);
            }
            return true;
        }
    }
}

前端可在接口请求头中添加 Accept-Language=en/zh 用于区别中英

4.应用

复制代码
    @Autowired
    private MessageSource messageSource;
    
    @RequestMapping("/test")
    public String getMessage() {
//        根据code从环境中自动获取对应国际化内容
        return messageSource.getMessage("phoneErr.msg", null, LocaleContextHolder.getLocale());
    }

5.测试

相关推荐
devlei3 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
pshdhx_albert4 小时前
AI agent实现打字机效果
java·http·ai编程
沉鱼.444 小时前
第十二届题目
java·前端·算法
努力的小郑5 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
赫瑞5 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
Victor3565 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3566 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁6 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp6 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥6 小时前
多进程和多线程的特点和区别
java·开发语言·jvm