【Java】【SpringBoot】i18n国际化
前提
SpingBoot项目
已添加Web依赖
步骤
- 打开资源管理器(resources)新建
i18n
文件夹。右击,创建资源包。
当然,后续也可以添加语言包
注:名称一定要messages
-
向资源包添加学习区域
-
设置对应配置文件语言信息
中文简体(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
-
获取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()); } }
-
系统配置文件(application.yml)资源路径配置
spring: messages: basename: static/i18n/messages
-
新建国际化配置类
/** * 国际化(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
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。