【Java】【SpringBoot】i18n国际化

前提

SpingBoot项目

已添加Web依赖

步骤

  1. 打开资源管理器(resources)新建i18n文件夹。右击,创建资源包。

当然,后续也可以添加语言包

注:名称一定要messages

  1. 向资源包添加学习区域

  2. 设置对应配置文件语言信息

    中文简体(messages_zh_cn.properties)

    sys.config.newParameters=新增参数
    sys.config.changeParameters=修改参数
    sys.config.newParametersExists=失败,参数键名已存在
    

    中文繁体(message_zh_tw.properties)

    sys.config.newParameters=新增參數
    sys.config.changeParameters=修改參數
    sys.config.newParametersExists=失敗,參數鍵名已存在
    

    英文(message_en_us.properties)

    sys.config.newParameters=New parameters
    sys.config.changeParameters=Modify parameters
    sys.config.newParametersExists=Failed, parameter key name already exists
    
  3. 获取i18n资源文件(这里引用了SpringUtil (Sping工具类))

    import com.example.demo1.utils.spring.SpringUtils;
    import org.springframework.context.MessageSource;
    import org.springframework.context.i18n.LocaleContextHolder;
    
    /**
     * 获取i18n资源文件
     * @Author:lyj
     * @Package:com.example.demo1.utils
     * @Project:demo
     * @name:MessageUtils
     * @Date:2024/10/25 11:42
     * @Filename:MessageUtils
     */
    public class MessageUtils {
        /**
         * 根据消息键和参数, 获取消息委托给Spring message Source
         * @param code 消息键
         * @param args 参数
         * @return 获取国际化翻译值
         */
        public static  String message(String code, Object ... args){
            MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
            return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
        }
    }
    
  4. 系统配置文件(application.yml)资源路径配置

    spring:   
      messages:
        basename: static/i18n/messages
    
  5. 新建国际化配置类

    /**
     * 国际化(i18n)配置类
     * @Author:lyj
     * @Package:com.example.config
     * @Project:demo
     * @name:I18nConfig
     * @Date:2024/10/25 13:54
     * @Filename:I18nConfig
     */
    @Configuration
    @Slf4j
    public class I18nConfig implements WebMvcConfigurer {
    
        @Bean
        public LocaleResolver localeResolver(){
            SessionLocaleResolver slr = new SessionLocaleResolver();
            // 默认语言
            slr.setDefaultLocale(new Locale("zh","cn"));
            return slr;
        }
    
        @Bean
        public LocaleChangeInterceptor localeChangeInterceptor(){
            LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
            // 参数名
            lci.setParamName("lang");
            return lci;
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 创建一个自定义国际化拦截器实例
            registry.addInterceptor(localeChangeInterceptor());
            WebMvcConfigurer.super.addInterceptors(registry);
        }
    }
    

测试

普通的测试方法

    @Autowired
    MessageSource messageSource;

    /**
     *
     * @author lyj
     * @date 2024-10-25
     */
    @Test
    public void test(){
        System.out.println(LocaleContextHolder.getLocale());    // zh_CN
        String message = messageSource.getMessage("message",null,LocaleContextHolder.getLocale());  // "消息"
        String message_en_us = messageSource.getMessage("message",null, Locale.US);     // "message"
        System.out.println(message);
        System.out.println(message_en_us);
    }

使用接口

@RestController
public class I18nController {
    @Autowired
    MessageSource messageSource;
    @GetMapping("/message")
    public  String getMessage(String msg){
        return MessageUtils.message(msg);
    }
}

默认调用中文:

修改头文件(Accept-header,可以获取到不同的值)
![](https://img2024.cnblogs.com/blog/1602649/202410/1602649-20241028094853640-1844430509.png

application.properties页面配置

spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false
posted @ 2024-10-28 09:49  陆陆无为而治者  阅读(96)  评论(0编辑  收藏  举报