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

SpringBoot项目实现国际化

原理:
核心是通过MessageSource接口,它根据当前用户的区域信息,从配置的资源文件(.properties)中加载对应的文本信息。
三个关键类:
LocaleResolver
Locale
MessageSource

LocaleResolver接口:其实现类有AcceptHeaderLocaleResolver、SessionLocaleResolver、CookieLocaleResolver等

AcceptHeaderLocaleResolver: 默认Resolver, 根据HTTP请求头的Accept-Language头信息来解析Locale。
SessionLocaleResolver:根据用户当前的会话中存储的Locale信息来解析。
Locale: Locale对象代表了某种语言。

SpringBoot中通过LocaleResolver解析
得到的Locale对象将决定应用程序在用户界面中显示哪种语言。

MessageSource: 是Spring Framework提供的国际化消息解析器接口,负责加载不同语言环境下的资源。通常使用ResourceBundleMessageSource
或ReloadableResourceBundleMessageSource来加载.properties文件,ReloadableResourceBundleMessageSource可以读取外部文件,使用file:格式。

实现:

@Configuration
public class HeaderLocaleResolver implements LocaleResolver {private static final String ACCEPT_LANGUAGE = "Accept-Language";@Overridepublic Locale resolveLocale(HttpServletRequest request) {String acceptLanguage = request.getHeader(ACCEPT_LANGUAGE);if (StringUtils.isEmpty(acceptLanguage)) {return new Locale(Locale.ENGLISH.getLanguage(), Locale.ENGLISH.getCountry());}String[] parts = acceptLanguage.split("-|_");if (parts.length == 2) {Locale locale = new Locale(parts[0], parts[1]);return locale;} else if (parts.length == 1) {Locale locale = new Locale(parts[0]);return locale;} else {throw new IllegalArgumentException("Invalid  language tag: " + acceptLanguage);}}@Overridepublic void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {}
}

@Slf4j
@Configuration
public class I18nConfig implements WebMvcConfigurer {@Value("spring.messages.basename.linux")private String baseName4Linux;@Value("spring.messages.basename.win")private String baseName4Win;@Value("spring.messages.encoding")private String encoding;@PostConstructpublic void init() {log.info("I18nConfig initialized");}@Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();//判断系统String baseName = System.getProperty("os.name").toLowerCase().contains("win") ? baseName4Win : baseName4Linux;source.setBasename(baseName);source.setDefaultEncoding(encoding);source.setCacheSeconds(60);return source;}@Bean("localeResolver")@Primarypublic LocalResolver headerLocaleResolver() {return new HeaderLocaleResolver();}/*@Bean("localeResolver")@Primarypublic LocalResolver sessionLocaleResolver() {SessionLocaleResolver slr = new SessionLocaleResolver();slr.setDefaultLocale(Locale.ENGLISH);slr.setDefaultTimeZone(TimeZone.getTimeZone("UTC"));return slr;}*/@Beanpublic LocaleChangeInterceptor localeChangeInterceptor() {LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();interceptor.setParamName("code");return interceptor;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor());}}
//业务代码...@Autowired
private MessageSource messageSource;...String i18nMsg=
messageSource.getMessage("user.select.confirm",null,LocaleContextHolder.getLocale());...

http://www.dtcms.com/a/573746.html

相关文章:

  • Jupyter Notebook 完整安装指南
  • XPath进阶:复杂嵌套结构与条件查询的终极指南
  • Oracle AWR案例分析: 诊断‘enq: TX - row lock contention‘等待事件
  • 【云运维】Zabbix 6.0 基于 LNMP 架构部署指南
  • 企业做网站要注意些什么问题大宗交易平台查询
  • 网站安全的必要性做电影网站违法吗
  • EtherCAT、PROFINET、EtherNet/IP和Modbus TCP主要区别
  • 电脑误格式化误删除如何通过数据恢复软件免费版搭建数据恢复中心
  • 如何平衡 ToB 产品中不同客户的需求
  • 基础数据结构之数组的前缀和技巧:和为K的子数组(LeetCode 560 中等题)
  • 【基础排序】CF - 最优排列Permutator
  • [RE2] Prog对象(字节码) | Inst指令序列 | 字节映射和指令扁平化
  • 灰系网站网站运营设计
  • C++ STL::vector底层剖析
  • 多线程环境下,线程安全单例模式的方案避坑
  • 深度学习-卷积神经网络LeNet
  • Ubuntu误删libaudit.so.1 导致系统无法正常使用、崩溃
  • 【深度学习5】多层感知机
  • 通过fluent HEC 来发送数据到splunk
  • 二叉树深度解析:核心概念与算法实现
  • 考研408--操作系统--day3--调度调度算法
  • 东莞做网站首选企业铭wordpress 4.5.4 漏洞
  • 消防做ccc去那个网站微信网页版客户端下载
  • 项目实战 | 新建校区网络安全项目:从搭建到交付
  • MHAF-YOLO:用于精确目标检测的多分支异构辅助融合YOLO
  • 从零到上线:Spring Boot 3 + Spring Cloud Alibaba + Vue 3 构建高可用 RBAC 微服务系统(超详细实战)
  • 优秀企业网站模板下载企业网络推广方案怎么做
  • Spring国际化语言切换不生效
  • 跨境S2B2C供应链系统推荐:核货宝外贸分销S2B2C平台深度赋能B端、极致服务C端
  • 【OS笔记24】:存储管理3-分页管理-页表与快表