当前位置: 首页 > article >正文

SpringBoot国际化:创建多语言支持的Web应用

SpringBoot国际化:创建多语言支持的Web应用

介绍

SpringBoot作为一个强大的框架,提供了便捷的国际化支持,使开发者能够轻松创建多语言支持的Web应用。通过使用SpringBoot的MessageSource,开发者可以在应用中实现动态的语言切换。

设置国际化

  1. 添加依赖,springboot相关依赖
  2. 添加配置文件
    i8n配置文件
    US配置文件
  3. yml文件
spring:
  messages:
    basename: i18n/messages
    encoding: UTF-8

注意:basename后面的messages位配置文件后面Resource Bundle后面的名字

  1. 通过拦截器+aop,实现拦截请求做到国际化
  • i18n配置
@Configuration
public class I18nConfig implements WebMvcConfigurer {
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        //设置默认语言,美式英文
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        //参数名与前端方法携带参数名一致
        lci.setParamName("Accept-Language");
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}
  • 拦截器,拦截所有请求
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyRequestInterceptor())
                .addPathPatterns("/**");
    }
}
  • aop

通过aop拦截到想要拦截所有请求的返回值,并根据前端传来的language进行国际化配置。

  1. 获取到语言
  2. 修改返回值,通过code找到对应的name,这个我都存在一个枚举类中
  3. 通过name找到配置文件中对应的配置,并取出,修改返回值
@Aspect
@Component
public class ChangeLanguageAspect {

    private static final Logger logger = LoggerFactory.getLogger(ChangeLanguageAspect.class);

    private static final Map<String, Locale> map = new HashMap(){
        {
            put("zh_CN", Locale.SIMPLIFIED_CHINESE);
            put("en_US", Locale.US);
            put("zh_TW", Locale.TRADITIONAL_CHINESE);
            put("th_TH", new Locale("th", "TH"));
            put("default", Locale.getDefault());
        }
    };

    @Resource
    private MessageSource messageSource;

    @Resource
    private LocaleResolver localeResolver;

    @Pointcut("within(@org.springframework.web.bind.annotation.RestController *) || within(@org.springframework.stereotype.Controller *)")
    public void i18nPointCut() {}

    @AfterReturning(pointcut = "i18nPointCut()", returning = "result")
    public void doAfterReturning(Object result) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        HttpServletResponse response = attributes.getResponse();

        // 获取语言
        String language = MyRequestInterceptor.REQUEST_ID_THREAD_LOCAL.get();
        if (StringUtil.isEmptyWithTrim(language) || !map.containsKey(language)){
            language = "default";
        }
        localeResolver.setLocale(request, response, map.get(language));
        Locale locale = LocaleContextHolder.getLocale();
        System.out.println(locale);

        // 修改返回,获取到返回值code,找到对应的name,从而在配置文件中找到对应的字段
        ServiceResponse<?> serviceResponse = (ServiceResponse<?>) result;
        int code = serviceResponse.getCode();
        GlobalErrorCode globalErrorCode = GlobalErrorCode.fromCode(code);
        String apiServiceError = messageSource.getMessage(globalErrorCode.name(), null, locale);
        logger.info("info,{}",apiServiceError);
        logger.info("result,{}",result);
        ((ServiceResponse<?>) result).setMessage(apiServiceError);
    }
}

http://www.kler.cn/a/375114.html

相关文章:

  • [bug]java导出csv用Microsoft Office Excel打开乱码解决
  • esp8266_TFTST7735语音识别UI界面虚拟小助手
  • 3.4 stm32系列:定时器(PWM、定时中断)
  • 如何实现圆形头像功能
  • UWB无载波通信技术,UWB定位系统源码
  • 基于python+django的外卖点餐系统
  • 【K倍区间】
  • 笔记-配置PyTorch(CUDA 12.2)
  • 常用linux 命令备份
  • 【网络安全 | 漏洞挖掘】逻辑漏洞+无限制爆破实现业务瘫痪
  • 【Linux网络】传输层协议UDP与TCP
  • Python画图3个小案例之“一起看流星雨”、“爱心跳动”、“烟花绚丽”
  • ubuntu上申请Let‘s Encrypt HTTPS 证书
  • 代理模式简单举例
  • Spring Boot框架下校园社团信息管理的优化策略
  • 独立北斗定位智能安全帽、定位安全帽、单北斗执法记录仪
  • 使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南
  • 抽丝剥茧 分布式服务框架设计 实战落地篇
  • Spring AOP(定义、使用场景、用法、3种事务、事务失效场景及解决办法、面试题)
  • Spring beanFactoryPostProcessor
  • Redis 线程控制 问题
  • 在linux中是如何运行一个应用程序的?
  • (七)JavaWeb后端开发1——Maven
  • 大语言模型驱动的跨域属性级情感分析——论文阅读笔记
  • 创造tips的秘籍——PHP回调后门
  • Redis 实战 问题