精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring國際化的應用及原理詳解

開發 前端
Spring 還提供了一個ReloadableResourceBundleMessageSource 類。該變體支持相同的捆綁文件格式,但比基于 JDK 的標準 ResourceBundleMessageSource 實現更靈活。

環境:Spring5.3.23

1. 簡介

Spring國際化(Spring Internationalization,簡稱i18n)是Spring框架提供的一種機制,用于支持多語言的應用程序。它使得開發者能夠輕松地在應用程序中實現不同語言的支持,從而滿足全球化的需求。通過Spring國際化,開發者可以將應用程序的文本、標簽、消息等資源抽取出來,并使用合適的語言文件進行翻譯,使得應用程序能夠根據用戶的語言偏好自動切換語言。這種機制不僅簡化了多語言支持的實現,還使得應用程序更加易于維護和擴展。在Spring國際化的實現中,主要涉及到了MessageSource、LocaleResolver等核心組件,它們共同協作,實現了語言切換的功能。通過使用Spring國際化的API,開發者可以方便地定義語言區域、加載資源文件、處理消息等操作,從而快速構建多語言的應用程序。

2. API介紹

ApplicationContext 接口擴展了一個名為 MessageSource 的接口,因此提供了國際化("i18n")功能。Spring 還提供了 HierarchicalMessageSource 接口,該接口可以分層解析消息。這些接口共同構成了 Spring 實現消息解析的基礎。這些接口定義的方法包括:

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

用于從 MessageSource 獲取消息的基本方法。如果在指定的本地沒有找到消息,則使用默認消息。通過標準庫提供的 MessageFormat 功能,傳入的任何參數都會成為替換值。

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

與前一種方法基本相同,但有一點不同:不能指定默認信息。如果找不到信息,就會拋出 NoSuchMessageException 異常。

  • String getMessage(MessageSourceResolvable resolvable, Locale locale)

前面方法中使用的所有屬性也都封裝在一個名為 MessageSourceResolvable 的類中,你可以使用該方法。

3. 國際化初始化

Spring容器ApplicationContext初始化過程中,會從容器中查找MessageSource類型的Bean。并且該Bean的名稱必須是 messageSource。如果找到了這樣一個 Bean,對前面方法的所有調用都會委托給消息源。如果沒有找到消息源,ApplicationContext 會嘗試查找包含同名Bean的父類。如果找到了,它就會使用該 bean 作為消息源。如果 ApplicationContext 無法找到任何消息源,則會實例化一個空的 DelegatingMessageSource,以便能夠接受對上述方法的調用。

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。文件內容如下:

message_zh_CN.properties

#姓名必須填寫
user.name.empty=\u59D3\u540D\u5FC5\u987B\u586B\u5199

message_en_US.properties

user.name.empty=name is required

調用

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

基于SpringBoot環境

spring:
  messages:
    basename: message

注意:你需要提供一個默認的message.properties文件

@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中初始化的。

在接口調用時,我們只需要指定Access-Language header

圖片圖片

5. 其它配置

Spring為我們提供了一個便捷的類,可以更方便的訪問消息源,項目中只需要注冊如下bean:

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

訪問

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

帶占位符的消息訪問

在消息文件中定義如下:

#年齡的取值范圍從{0}~{1}
user.age.range=\u5E74\u9F84\u7684\u53D6\u503C\u8303\u56F4\u4ECE{0}~{1}

訪問

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

注:Spring 還提供了一個ReloadableResourceBundleMessageSource 類。該變體支持相同的捆綁文件格式,但比基于 JDK 的標準 ResourceBundleMessageSource 實現更靈活。特別是,它允許從任何 Spring 資源位置(而不僅僅是從類路徑)讀取文件,并支持捆綁屬性文件的熱重載(同時在兩者之間有效地緩存它們)。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2011-08-29 09:48:30

springMVC

2010-01-04 13:09:51

Silverlight

2022-07-27 10:39:14

Spring代碼IDEA

2011-08-11 13:26:30

iPhoneNSLocalized

2011-08-18 15:24:40

iPhone國際化

2011-05-17 09:39:38

JavaSE

2011-07-08 11:13:42

Cocoa Touch XCode

2010-03-02 16:44:59

CentOS Mono

2024-05-17 08:25:06

數據驅動React語言包

2023-01-31 10:29:26

JavaScript國際化國際化庫

2024-01-17 10:16:22

前端國際化消息鍵

2010-07-28 14:52:29

Flex國際化

2011-08-19 13:13:14

struts2Java

2009-06-25 16:04:30

2009-06-03 08:30:30

禚佳春法航華為

2009-01-19 09:06:31

gettextPHP國際化編程

2017-01-09 16:24:07

滴滴Android 端 App

2009-02-04 15:04:13

2024-09-04 10:27:53

2009-12-29 15:05:29

WPF支持國際化
點贊
收藏

51CTO技術棧公眾號

国产在线拍揄自揄拍视频| 国产精品美女毛片真酒店| 欧美色片在线观看| 国产欧美日韩中文久久| 成人免费观看a| 免费毛片在线播放免费| 欧美aaaaa级| 欧美在线小视频| 欧美少妇在线观看| 天堂中文在线视频| 欧美中文日韩| 久久精品国产69国产精品亚洲| 中文字幕人妻熟女在线| 主播大秀视频在线观看一区二区| 亚洲激情五月婷婷| 牛人盗摄一区二区三区视频| 国产乱淫a∨片免费观看| 亚洲电影av| 日韩在线欧美在线| 亚洲精品乱码久久久久久不卡| av亚洲一区| 黄色精品在线看| 国产成年人在线观看| 亚州视频一区二区三区| 国产在线看一区| 日本欧美黄网站| 久久亚洲国产成人精品性色| 日韩毛片视频| 亚洲欧洲黄色网| 精品少妇人妻av一区二区三区| 国产资源一区| 欧美三级xxx| 国产天堂视频在线观看| 一本一道波多野毛片中文在线| 成人网在线播放| 国产在线不卡精品| 精品人妻一区二区三区潮喷在线 | 中文字幕在线观看播放| 国产欧美在线观看一区| 国内视频一区二区| 性一交一乱一精一晶| 老司机午夜精品| 国产精品电影观看| 免费污污视频在线观看| 在线成人h网| 欧美激情网友自拍| 欧美日韩成人免费观看| 91精品91| 久久视频在线视频| 女人18毛片毛片毛片毛片区二| 精品高清久久| 亚洲午夜久久久久久久| 99久久人妻无码精品系列| 狼人天天伊人久久| 日韩av网址在线观看| 国产人成视频在线观看| 久久精品福利| 日韩av中文在线| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 欧美日本一区二区高清播放视频| 中文字幕少妇一区二区三区| 伊人网在线视频观看| 秋霞综合在线视频| 亚洲级视频在线观看免费1级| 涩视频在线观看| av综合网站| 欧美精品一区二区三区四区 | 国产又粗又猛又爽又黄的网站| 最新av网站在线观看| 欧美激情一区二区在线| 日韩av一区二区三区在线| 牛牛澡牛牛爽一区二区| 久久综合色婷婷| 日韩福利二区| 欧美日本高清| 亚洲男同1069视频| 成人在线视频一区二区三区| 国产传媒在线观看| 色综合色狠狠综合色| 毛葺葺老太做受视频| 久久久久久一区二区三区四区别墅| 台湾成人免费视频| 国产精品热久久久久夜色精品三区| 亚洲欧洲精品一区| 国产最新在线| 亚洲成a人片综合在线| 人妻av中文系列| 在线亚洲人成| 欧美人与禽zozo性伦| 国产伦理在线观看| 欧美挤奶吃奶水xxxxx| 国产一区二区三区久久精品| 欧美做爰爽爽爽爽爽爽| 99国产精品久久久久久久成人热| 国产91久久婷婷一区二区| 亚洲一区中文字幕永久在线| 国产一区美女在线| 久久久com| 日本综合在线| 黄色成人在线免费| 99国产精品久久久久久| 卡通动漫国产精品| 日韩视频精品在线| 日本五十路女优| 麻豆一区二区三区| 极品日韩久久| 免费观看久久久久| 精品福利在线视频| 欧美污在线观看| 伊人成综合网yiren22| 久久久精品免费| 久久久久久久久久久影院| 久久国产精品色婷婷| 激情久久av| 在线中文字幕第一页| 一本高清dvd不卡在线观看| 爽爽爽在线观看| 久久99蜜桃| 久久99国产综合精品女同| 中文字幕永久在线| bt欧美亚洲午夜电影天堂| 在线视频福利一区| 亚洲成人看片| 亚洲精品a区| 欧美日韩综合视频网址| 欧美激情第一区| 国产精品中文字幕亚洲欧美| 午夜精品蜜臀一区二区三区免费| 一级全黄裸体免费视频| 久久久一区二区三区捆绑**| www.18av.com| 91亚洲精品在看在线观看高清| 亚洲人成伊人成综合网久久久| 精品少妇爆乳无码av无码专区| 精品制服美女久久| 午夜欧美性电影| 樱桃视频成人在线观看| 亚洲国产97在线精品一区| 午夜免费激情视频| 美女mm1313爽爽久久久蜜臀| 四虎影院一区二区三区| 樱桃视频成人在线观看| 亚洲美女av在线| 国产综合精品视频| 99国产精品久久| 91丨porny丨探花| 91蝌蚪精品视频| 欧美大片免费看| 亚洲av综合色区无码一二三区| 亚洲伦理在线精品| 午夜免费视频网站| 91成人精品| 3d精品h动漫啪啪一区二区| 麻豆传媒在线完整视频| 欧美日韩精品一区视频| 亚洲aaa视频| 国内外成人在线| 男女激烈动态图| 日韩精品视频一区二区三区| 欧美国产日韩xxxxx| 男人天堂一区二区| 亚洲成人动漫av| jizz日本免费| 久久亚洲一区| 亚洲欧洲一区二区福利| 精品69视频一区二区三区| 日韩在线免费观看视频| 99热这里只有精品9| 一区二区理论电影在线观看| 在线播放av网址| 国产欧美日韩一级| 欧美一级爱爱| 韩国精品视频在线观看 | 99国产高清| h片视频在线观看| 日韩精品极品毛片系列视频| 永久免费无码av网站在线观看| 国产视频视频一区| 热久久久久久久久| 国产精品大片免费观看| 国产一区国产精品| 人人鲁人人莫人人爱精品| 日韩中文在线不卡| 理论片中文字幕| 91九色最新地址| 欧美精品久久久久久久久46p| 国产91精品一区二区麻豆亚洲| 少妇无码av无码专区在线观看| 国产成人三级| 91精品在线看| 九色porny丨国产首页在线| 亚洲欧美在线播放| 91在线公开视频| 午夜欧美2019年伦理| 亚洲最大成人综合网| 国产传媒久久文化传媒| 成人免费观看视频在线观看| 成人写真视频| 国产视频精品网| 激情欧美一区二区三区黑长吊| 欧美激情视频在线免费观看 欧美视频免费一 | 国产传媒视频在线| 国产aⅴ综合色| 国产精品无码一本二本三本色| 亚洲成人最新网站| 久久精品国产一区二区三区日韩| 免费日韩成人| 91精品国产自产91精品| 黄在线免费观看| 亚洲精品久久久久久久久| 亚洲视频久久久| 欧美日韩在线一区| 欧美成人手机视频| 欧美激情在线一区二区三区| 800av在线播放| 国产一区二区三区四区五区美女| 岳毛多又紧做起爽| 欧美三级黄美女| 最新国产精品久久| 精品国产精品| 国产尤物99| 日韩中文一区二区| 国产精品一区二区在线| 日韩影院在线| 午夜精品久久久久久久男人的天堂| 男人天堂久久久| 中文日韩电影网站| 日中文字幕在线| 亚洲精品一区二区三区99| 99久久久国产精品无码网爆| 欧洲一区在线电影| 一级成人黄色片| 天天色天天爱天天射综合| 久久99久久98精品免观看软件| 亚洲欧洲在线观看av| 国产成人免费观看网站| 91美女在线视频| 玖玖爱在线精品视频| 国产91在线观看丝袜| 欧美xxxxxbbbbb| 极品少妇xxxx偷拍精品少妇| 中文字幕第88页| 日本成人在线不卡视频| 国产男女激情视频| 免费视频一区| 99视频精品全部免费在线| 男女激情免费视频| 欧美一区亚洲| 穿情趣内衣被c到高潮视频| 91亚洲一区| 在线观看欧美激情| 91精品国产自产在线观看永久∴ | 日韩av男人的天堂| 小草在线视频免费播放| 欧美性做爰毛片| 范冰冰一级做a爰片久久毛片| 2019av中文字幕| 妞干网免费在线视频| 2019中文字幕在线观看| 蜜桃av在线播放| 人体精品一二三区| 欧美成人a交片免费看| 国产99久久久欧美黑人| 日韩大尺度黄色| 国产精品第一视频| 欧美日韩伦理一区二区| 96国产粉嫩美女| 澳门成人av| 欧美极品色图| 日韩不卡一区| 成人手机在线播放| 亚洲高清电影| 国产无套内射久久久国产| 日本vs亚洲vs韩国一区三区二区| 一区二区免费av| 成人一区二区在线观看| www.色天使| 国产精品免费视频一区| 欧美三级免费看| 西瓜成人精品人成网站| 91成人性视频| 色天使综合视频| 91亚洲午夜在线| 日本三级久久| 亚洲蜜桃av| 国产一区观看| 国产欧美高清在线| 国产原创一区二区| 黄色网址在线视频| 国产精品午夜免费| 伊人国产在线观看| 欧美性一二三区| 国产成人毛毛毛片| 精品中文字幕久久久久久| 男人影院在线观看| 97久久精品视频| 国产精品久久久久77777丨| 91原创国产| 少妇精品久久久一区二区| 日本久久高清视频| 国产一区二区你懂的| 成年人三级黄色片| 不卡视频在线看| www.99re6| 色综合久久九月婷婷色综合| 国产探花精品一区二区| 亚洲欧美国产精品专区久久 | 国产精品天干天干在线综合| 久久久久国产精品夜夜夜夜夜| 日本福利一区二区| 东京干手机福利视频| 色噜噜狠狠狠综合曰曰曰88av | 91精品久久久久久久蜜月| 国产二区视频在线| 国产一区二区在线免费观看| 手机免费看av| 亚洲国产精品一区二区久久| 中文人妻av久久人妻18| 精品国产乱码久久久久久久| 麻豆传媒视频在线观看| 日韩av电影在线免费播放| 一区二区三区国产好| 中文字幕成人一区| 久久r这里只有精品| 亚洲国产精品人人做人人爽| 免费污污视频在线观看| 亚洲第一男人av| 在线观看a级片| 国产欧美久久一区二区| 国产亚洲一区二区三区啪| 亚洲理论电影在线观看| 国产毛片精品一区| 影音先锋制服丝袜| 疯狂蹂躏欧美一区二区精品| 免费a视频在线观看| 九九久久综合网站| 在线日韩三级| 亚洲一区二区在线观| 天堂久久一区二区三区| 人妻丰满熟妇av无码久久洗澡| 亚洲卡通欧美制服中文| 一级做a爱片久久毛片| 国产一区二区激情| 色成人免费网站| 日韩国产精品一区二区| 欧美中文日韩| 人妻体内射精一区二区| 欧美午夜影院在线视频| 香蕉av在线播放| 欧美性视频精品| 精品一区在线| 国产第一页视频| 国产日韩精品一区二区三区在线| 国产又粗又猛又黄视频| 亚洲人成电影在线播放| 欧美xnxx| 中文字幕一区二区三区在线乱码 | 欧美日韩一区二区区| 亚洲欧美成人一区二区三区| 国产aⅴ一区二区三区| 欧美人在线观看| 国产成人精品亚洲线观看| 免费无码毛片一区二三区| 久久在线免费观看| 波多野结衣在线观看视频| 在线成人中文字幕| 日韩福利影视| 国产91在线亚洲| www.亚洲精品| 无码人妻精品一区二区三区不卡 | 久久性天堂网| 欧美色图17p| 91精品国产一区二区| segui88久久综合| 欧美在线播放一区二区| 美腿丝袜在线亚洲一区| 极品颜值美女露脸啪啪| 日韩经典中文字幕| 精品久久毛片| 男女激情免费视频| 久久久99免费| 国产精品久久久久久免费免熟| 欧美激情亚洲国产| 国产一区二区亚洲| 欧美性猛交xxxx乱大交91| 亚洲国产毛片aaaaa无费看| 你懂的免费在线观看视频网站| 国产男人精品视频| 国产精品豆花视频| a天堂中文字幕| 91精品免费观看| 人在线成免费视频| 在线免费观看一区二区三区| 成人精品免费视频| 中文字幕永久在线| 久久久久久亚洲精品| 欧美三级三级| 久久无码专区国产精品s| 91久久精品网| 不卡av免费观看|