当前位置:首页 > 科技  > 软件

Spring国际化的应用及原理详解

来源: 责编: 时间:2024-01-04 09:33:17 395观看
导读环境:Spring5.3.231. 简介Spring国际化(Spring Internationalization,简称i18n)是Spring框架提供的一种机制,用于支持多语言的应用程序。它使得开发者能够轻松地在应用程序中实现不同语言的支持,从而满足全球化的需求。通过

环境:Spring5.3.23S4r28资讯网——每日最新资讯28at.com

1. 简介

Spring国际化(Spring Internationalization,简称i18n)是Spring框架提供的一种机制,用于支持多语言的应用程序。它使得开发者能够轻松地在应用程序中实现不同语言的支持,从而满足全球化的需求。通过Spring国际化,开发者可以将应用程序的文本、标签、消息等资源抽取出来,并使用合适的语言文件进行翻译,使得应用程序能够根据用户的语言偏好自动切换语言。这种机制不仅简化了多语言支持的实现,还使得应用程序更加易于维护和扩展。在Spring国际化的实现中,主要涉及到了MessageSource、LocaleResolver等核心组件,它们共同协作,实现了语言切换的功能。通过使用Spring国际化的API,开发者可以方便地定义语言区域、加载资源文件、处理消息等操作,从而快速构建多语言的应用程序。S4r28资讯网——每日最新资讯28at.com

2. API介绍

ApplicationContext 接口扩展了一个名为 MessageSource 的接口,因此提供了国际化("i18n")功能。Spring 还提供了 HierarchicalMessageSource 接口,该接口可以分层解析消息。这些接口共同构成了 Spring 实现消息解析的基础。这些接口定义的方法包括:S4r28资讯网——每日最新资讯28at.com

  • String getMessage(String code, Object[] args, String default, Locale loc)

用于从 MessageSource 获取消息的基本方法。如果在指定的本地没有找到消息,则使用默认消息。通过标准库提供的 MessageFormat 功能,传入的任何参数都会成为替换值。S4r28资讯网——每日最新资讯28at.com

  • String getMessage(String code, Object[] args, Locale loc)

与前一种方法基本相同,但有一点不同:不能指定默认信息。如果找不到信息,就会抛出 NoSuchMessageException 异常。S4r28资讯网——每日最新资讯28at.com

  • String getMessage(MessageSourceResolvable resolvable, Locale locale)

前面方法中使用的所有属性也都封装在一个名为 MessageSourceResolvable 的类中,你可以使用该方法。S4r28资讯网——每日最新资讯28at.com

3. 国际化初始化

Spring容器ApplicationContext初始化过程中,会从容器中查找MessageSource类型的Bean。并且该Bean的名称必须是 messageSource。如果找到了这样一个 Bean,对前面方法的所有调用都会委托给消息源。如果没有找到消息源,ApplicationContext 会尝试查找包含同名Bean的父类。如果找到了,它就会使用该 bean 作为消息源。如果 ApplicationContext 无法找到任何消息源,则会实例化一个空的 DelegatingMessageSource,以便能够接受对上述方法的调用。S4r28资讯网——每日最新资讯28at.com

public abstract class AbstractApplicationContext {  public void refresh() {    // 初始化消息源    initMessageSource();  }  protected void initMessageSource() {    ConfigurableListableBeanFactory beanFactory = getBeanFactory();    // 判断容器中是否有messageSource    if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {      this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);      if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {        HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;        if (hms.getParentMessageSource() == null) {          hms.setParentMessageSource(getInternalParentMessageSource());        }      }    } else {      // Use empty MessageSource to be able to accept getMessage calls.      DelegatingMessageSource dms = new DelegatingMessageSource();      dms.setParentMessageSource(getInternalParentMessageSource());      this.messageSource = dms;      beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);    }  }}

4. 国际化配置

基于Spring环境

@Bean(AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME)public MessageSource messageSource() {  ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource() ;  // 这里设置的是basename,message是文件的前缀(不是包)  messageSource.addBasenames("classpath:com/pack/main/databinder/message") ;  return messageSource ;}

在包com/pack/main/databinder下建2个文件分别:message_zh_CN.properties和message_en_US.properties。文件内容如下:S4r28资讯网——每日最新资讯28at.com

message_zh_CN.propertiesS4r28资讯网——每日最新资讯28at.com

#姓名必须填写user.name.empty=/u59D3/u540D/u5FC5/u987B/u586B/u5199

message_en_US.propertiesS4r28资讯网——每日最新资讯28at.com

user.name.empty=name is required

调用S4r28资讯网——每日最新资讯28at.com

try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class)) {  // Locale.CHINA或者Locale.US  System.out.println(context.getMessage("user.name.empty", null, Locale.CHINA)) ;}

基于SpringBoot环境S4r28资讯网——每日最新资讯28at.com

spring:  messages:    basename: message

注意:你需要提供一个默认的message.properties文件S4r28资讯网——每日最新资讯28at.com

@RestController@RequestMapping("/i18n")public class I18NController {  @Resource  private ApplicationContext context ;    @GetMapping("/index")  public String index() {    return context.getMessage("user.name.empty", null, "默认消息", LocaleContextHolder.getLocale()) ;  }  }

Locale从当前线程上下文中获取。该Locale是在DispatcherServlet中初始化的。S4r28资讯网——每日最新资讯28at.com

在接口调用时,我们只需要指定Access-Language headerS4r28资讯网——每日最新资讯28at.com

图片图片S4r28资讯网——每日最新资讯28at.com

5. 其它配置

Spring为我们提供了一个便捷的类,可以更方便的访问消息源,项目中只需要注册如下bean:S4r28资讯网——每日最新资讯28at.com

@Beanpublic MessageSourceAccessor messageSourceAccessor(MessageSource messageSource) {  MessageSourceAccessor accessor = new MessageSourceAccessor(messageSource) ;  return accessor ;}

访问S4r28资讯网——每日最新资讯28at.com

@Resourceprivate MessageSourceAccessor accessor ;@GetMapping("/index")public String index() {  return accessor.getMessage("user.name.empty") ;}

带占位符的消息访问

在消息文件中定义如下:S4r28资讯网——每日最新资讯28at.com

#年龄的取值范围从{0}~{1}user.age.range=/u5E74/u9F84/u7684/u53D6/u503C/u8303/u56F4/u4ECE{0}~{1}

访问S4r28资讯网——每日最新资讯28at.com

@GetMapping("/index")public String index() {  return accessor.getMessage("user.age.range", new Object[] {1, 100}) ;}

注:Spring 还提供了一个ReloadableResourceBundleMessageSource 类。该变体支持相同的捆绑文件格式,但比基于 JDK 的标准 ResourceBundleMessageSource 实现更灵活。特别是,它允许从任何 Spring 资源位置(而不仅仅是从类路径)读取文件,并支持捆绑属性文件的热重载(同时在两者之间有效地缓存它们)。S4r28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-57390-0.htmlSpring国际化的应用及原理详解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 为什么只有Unicode是不够的,UTF-8如何解决编码问题?

下一篇: 代码出错了,IDE竟然不报错?太诡异了....

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top