日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
這篇文章讓你搞懂SpringMVC國際化!

松哥之前寫過 Spring Boot 國際化的問題,不過那一次沒講源碼,這次咱們整點(diǎn)源碼來深入理解下這個(gè)問題。

創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)托克遜,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

國際化,也叫 i18n,為啥叫這個(gè)名字呢?因?yàn)閲H化英文是 internationalization ,在 i 和 n 之間有 18 個(gè)字母,所以叫 i18n。我們的應(yīng)用如果做了國際化就可以在不同的語言環(huán)境下,方便的進(jìn)行切換,最常見的就是中文和英文之間的切換,國際化這個(gè)功能也是相當(dāng)?shù)某R姟?/p>

1.SpringMVC 國際化配置

還是先來說說用法,再來說源碼,這樣大家不容易犯迷糊。我們先說在 SSM 中如何處理國際化問題。

首先國際化我們可能有兩種需求:

  • 在頁面渲染時(shí)實(shí)現(xiàn)國際化(這個(gè)借助于 Spring 標(biāo)簽實(shí)現(xiàn))
  • 在接口中獲取國際化匹配后的消息

大致上就是上面這兩種場景。接下來松哥通過一個(gè)簡單的用法來和大家演示下具體玩法。

首先我們在項(xiàng)目的 resources 目錄下新建語言文件,language_en_US.properties 和 language_zh-CN.properties,如下圖:

內(nèi)容分別如下:

language_en_US.properties:

 
 
 
 
  1. login.username=Username 
  2. login.password=Password 

language_zh-CN.properties:

 
 
 
 
  1. login.username=用戶名 
  2. login.password=用戶密碼 

這兩個(gè)分別對應(yīng)英中文環(huán)境。配置文件寫好之后,還需要在 SpringMVC 容器中提供一個(gè) ResourceBundleMessageSource 實(shí)例去加載這兩個(gè)實(shí)例,如下:

 
 
 
 
  1.  
  2.      
  3.      
  4.  

這里配置了文件名 language 和默認(rèn)的編碼格式。

接下來我們新建一個(gè) login.jsp 文件,如下:

 
 
 
 
  1. <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
  3.  
  4.  
  5.     Title 
  6.  
  7.  
  8.   
     
  9.   
     
  10.  
  11.  

 

在這個(gè)文件中,我們通過 spring:message 標(biāo)簽來引用變量,該標(biāo)簽會根據(jù)當(dāng)前的實(shí)際情況,選擇合適的語言文件。

接下來我們?yōu)?login.jsp 提供一個(gè)控制器:

 
 
 
 
  1. @Controller 
  2. public class LoginController { 
  3.     @Autowired 
  4.     MessageSource messageSource; 
  5.     @GetMapping("/login") 
  6.     public String login() { 
  7.         String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale()); 
  8.         String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale()); 
  9.         System.out.println("username = " + username); 
  10.         System.out.println("password = " + password); 
  11.         return "login"; 
  12.     } 

控制器中直接返回 login 視圖即可。

另外我這還注入了 MessageSource 對象,主要是為了向大家展示如何在處理器中獲取國際化后的語言文字。

配置完成后,啟動(dòng)項(xiàng)目進(jìn)行測試。

默認(rèn)情況下,系統(tǒng)是根據(jù)請求頭的中 Accept-Language 字段來判斷當(dāng)前的語言環(huán)境的,該這個(gè)字段由瀏覽器自動(dòng)發(fā)送,我們這里為了測試方便,可以使用 POSTMAN 進(jìn)行測試,然后手動(dòng)設(shè)置 Accept_Language 字段。

首先測試中文環(huán)境:

然后測試英文環(huán)境:

都沒問題,完美!同時(shí)觀察 IDEA 控制臺,也能正確打印出語言文字。

上面這個(gè)是基于 AcceptHeaderLocaleResolver 來解析出當(dāng)前的區(qū)域和語言的。

有的時(shí)候,我們希望語言環(huán)境直接通過請求參數(shù)來傳遞,而不是通過請求頭來傳遞,這個(gè)需求我們通過 SessionLocaleResolver 或者 CookieLocaleResolver 都可以實(shí)現(xiàn)。

先來看 SessionLocaleResolver。

首先在 SpringMVC 配置文件中提供 SessionLocaleResolver 的實(shí)例,同時(shí)配置一個(gè)攔截器,如下:

 
 
 
 
  1.  
  2.      
  3.          
  4.          
  5.              
  6.          
  7.      
  8.  
  9.  
  10.  

SessionLocaleResolver 是負(fù)責(zé)區(qū)域解析的,這個(gè)沒啥好說的。攔截器 LocaleChangeInterceptor 則主要是負(fù)責(zé)參數(shù)解析的,我們在配置攔截器的時(shí)候,設(shè)置了參數(shù)名為 locale(默認(rèn)即此),也就是說我們將來可以通過 locale 參數(shù)來傳遞當(dāng)前的環(huán)境信息。

配置完成后,我們還是來訪問剛才的 login 控制器,如下:

此時(shí)我們可以直接通過 locale 參數(shù)來控制當(dāng)前的語言環(huán)境,這個(gè) locale 參數(shù)就是在前面所配置的 LocaleChangeInterceptor 攔截器中被自動(dòng)解析的。

如果你不想配置 LocaleChangeInterceptor 攔截器也是可以的,直接自己手動(dòng)解析 locale 參數(shù)然后設(shè)置 locale 也行,像下面這樣:

 
 
 
 
  1. @Controller 
  2. public class LoginController { 
  3.     @Autowired 
  4.     MessageSource messageSource; 
  5.     @GetMapping("/login") 
  6.     public String login(String locale,HttpSession session) { 
  7.         if ("zh-CN".equals(locale)) { 
  8.             session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN")); 
  9.         } else if ("en-US".equals(locale)) { 
  10.             session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US")); 
  11.         } 
  12.         String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale()); 
  13.         String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale()); 
  14.         System.out.println("username = " + username); 
  15.         System.out.println("password = " + password); 
  16.         return "login"; 
  17.     } 

SessionLocaleResolver 所實(shí)現(xiàn)的功能也可以通過 CookieLocaleResolver 來實(shí)現(xiàn),不同的是前者將解析出來的區(qū)域信息保存在 session 中,而后者則保存在 Cookie 中。保存在 session 中,只要 session 沒有發(fā)生變化,后續(xù)就不用再次傳遞區(qū)域語言參數(shù)了,保存在 Cookie 中,只要 Cookie 沒變,后續(xù)也不用再次傳遞區(qū)域語言參數(shù)了。

使用 CookieLocaleResolver 的方式很簡單,直接在 SpringMVC 中提供 CookieLocaleResolver 的實(shí)例即可,如下:

 
 
 
 
  1.  

注意這里也需要使用到 LocaleChangeInterceptor 攔截器,如果不使用該攔截器,則需要自己手動(dòng)解析并配置語言環(huán)境,手動(dòng)解析并配置的方式如下:

 
 
 
 
  1. @GetMapping("/login3") 
  2. public String login3(String locale, HttpServletRequest req, HttpServletResponse resp) { 
  3.     CookieLocaleResolver resolver = new CookieLocaleResolver(); 
  4.     if ("zh-CN".equals(locale)) { 
  5.         resolver.setLocale(req, resp, new Locale("zh", "CN")); 
  6.     } else if ("en-US".equals(locale)) { 
  7.         resolver.setLocale(req, resp, new Locale("en", "US")); 
  8.     } 
  9.     String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale()); 
  10.     String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale()); 
  11.     System.out.println("username = " + username); 
  12.     System.out.println("password = " + password); 
  13.     return "login"; 

配置完成后,啟動(dòng)項(xiàng)目進(jìn)行測試,這次測試的方式跟 SessionLocaleResolver 的測試方式一致,松哥就不再多說了。

除了前面介紹的這幾種 LocaleResolver 之外,還有一個(gè) FixedLocaleResolver,因?yàn)楸容^少見,松哥這里就不做過多介紹了。

2.Spring Boot 國際化配置

2.1 基本使用

Spring Boot 和 Spring 一脈相承,對于國際化的支持,默認(rèn)是通過 AcceptHeaderLocaleResolver 解析器來完成的,這個(gè)解析器,默認(rèn)是通過請求頭的 Accept-Language 字段來判斷當(dāng)前請求所屬的環(huán)境的,進(jìn)而給出合適的響應(yīng)。

所以在 Spring Boot 中做國際化,這一塊我們可以不用配置,直接就開搞。

首先創(chuàng)建一個(gè)普通的 Spring Boot 項(xiàng)目,添加 web 依賴即可。項(xiàng)目創(chuàng)建成功后,默認(rèn)的國際化配置文件放在 resources 目錄下,所以我們直接在該目錄下創(chuàng)建四個(gè)測試文件,如下:

  • 我們的 message 文件是直接創(chuàng)建在 resources 目錄下的,IDEA 在展示的時(shí)候,會多出一個(gè) Resource Bundle,這個(gè)大家不用管,千萬別手動(dòng)去創(chuàng)建這個(gè)目錄。
  • messages.properties 這個(gè)是默認(rèn)的配置,其他的則是不同語言環(huán)境下的配置,en_US 是英語(美國),zh_CN 是中文簡體,zh_TW 是中文繁體(文末附錄里邊有一個(gè)完整的語言簡稱表格)。

四個(gè)文件創(chuàng)建好之后,第一個(gè)默認(rèn)的我們可以先空著,另外三個(gè)分別填入以下內(nèi)容:

messages_zh_CN.properties

 
 
 
 
  1. user.name=江南一點(diǎn)雨 

messages_zh_TW.properties

 
 
 
 
  1. user.name=江南壹點(diǎn)雨 

messages_en_US.properties

 
 
 
 
  1. user.name=javaboy 

配置完成后,我們就可以直接開始使用了。在需要使用值的地方,直接注入 MessageSource 實(shí)例即可。

在 Spring 中需要配置的 MessageSource 現(xiàn)在不用配置了,Spring Boot 會通過 org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration 自動(dòng)幫我們配置一個(gè) MessageSource 實(shí)例。

創(chuàng)建一個(gè) HelloController ,內(nèi)容如下:

 
 
 
 
  1. @RestController 
  2. public class HelloController { 
  3.     @Autowired 
  4.     MessageSource messageSource; 
  5.     @GetMapping("/hello") 
  6.     public String hello() { 
  7.         return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale()); 
  8.     } 

在 HelloController 中我們可以直接注入 MessageSource 實(shí)例,然后調(diào)用該實(shí)例中的 getMessage 方法去獲取變量的值,第一個(gè)參數(shù)是要獲取變量的 key,第二個(gè)參數(shù)是如果 value 中有占位符,可以從這里傳遞參數(shù)進(jìn)去,第三個(gè)參數(shù)傳遞一個(gè) Locale 實(shí)例即可,這相當(dāng)于當(dāng)前的語言環(huán)境。

接下來我們就可以直接去調(diào)用這個(gè)接口了。

默認(rèn)情況下,在接口調(diào)用時(shí),通過請求頭的 Accept-Language 來配置當(dāng)前的環(huán)境,我這里通過 POSTMAN 來進(jìn)行測試,結(jié)果如下:

小伙伴們看到,我在請求頭中設(shè)置了 Accept-Language 為 zh-CN,所以拿到的就是簡體中文;如果我設(shè)置了 zh-TW,就會拿到繁體中文:

是不是很 Easy?

2.2 自定義切換

有的小伙伴覺得切換參數(shù)放在請求頭里邊好像不太方便,那么也可以自定義解析方式。例如參數(shù)可以當(dāng)成普通參數(shù)放在地址欄上,通過如下配置可以實(shí)現(xiàn)我們的需求。

 
 
 
 
  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.     @Override 
  4.     public void addInterceptors(InterceptorRegistry registry) { 
  5.         LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); 
  6.         interceptor.setParamName("lang"); 
  7.         registry.addInterceptor(interceptor); 
  8.     } 
  9.     @Bean 
  10.     LocaleResolver localeResolver() { 
  11.         SessionLocaleResolver localeResolver = new SessionLocaleResolver(); 
  12.         localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); 
  13.         return localeResolver; 
  14.     } 

在這段配置中,我們首先提供了一個(gè) SessionLocaleResolver 實(shí)例,這個(gè)實(shí)例會替換掉默認(rèn)的 AcceptHeaderLocaleResolver,不同于 AcceptHeaderLocaleResolver 通過請求頭來判斷當(dāng)前的環(huán)境信息,SessionLocaleResolver 將客戶端的 Locale 保存到 HttpSession 對象中,并且可以進(jìn)行修改(這意味著當(dāng)前環(huán)境信息,前端給瀏覽器發(fā)送一次即可記住,只要 session 有效,瀏覽器就不必再次告訴服務(wù)端當(dāng)前的環(huán)境信息)。

另外我們還配置了一個(gè)攔截器,這個(gè)攔截器會攔截請求中 key 為 lang 的參數(shù)(不配置的話是 locale),這個(gè)參數(shù)則指定了當(dāng)前的環(huán)境信息。

好了,配置完成后,啟動(dòng)項(xiàng)目,訪問方式如下:

我們通過在請求中添加 lang 來指定當(dāng)前環(huán)境信息。這個(gè)指定只需要一次即可,也就是說,在 session 不變的情況下,下次請求可以不必帶上 lang 參數(shù),服務(wù)端已經(jīng)知道當(dāng)前的環(huán)境信息了。

CookieLocaleResolver 也是類似用法,不再贅述。

2.3 其他自定義

默認(rèn)情況下,我們的配置文件放在 resources 目錄下,如果大家想自定義,也是可以的,例如定義在 resources/i18n 目錄下:

但是這種定義方式系統(tǒng)就不知道去哪里加載配置文件了,此時(shí)還需要 application.properties 中進(jìn)行額外配置(注意這是一個(gè)相對路徑):

 
 
 
 
  1. spring.messages.basename=i18n/messages 

另外還有一些編碼格式的配置等,內(nèi)容如下:

 
 
 
 
  1. spring.messages.cache-duration=3600 
  2. spring.messages.encoding=UTF-8 
  3. spring.messages.fallback-to-system-locale=true 

spring.messages.cache-duration 表示 messages 文件的緩存失效時(shí)間,如果不配置則緩存一直有效。

spring.messages.fallback-to-system-locale 屬性則略顯神奇,網(wǎng)上竟然看不到一個(gè)明確的答案,后來翻了一會源碼才看出端倪。

這個(gè)屬性的作用在 org.springframework.context.support.AbstractResourceBasedMessageSource#getDefaultLocale 方法中生效:

 
 
 
 
  1. protected Locale getDefaultLocale() { 
  2.  if (this.defaultLocale != null) { 
  3.   return this.defaultLocale; 
  4.  } 
  5.  if (this.fallbackToSystemLocale) { 
  6.   return Locale.getDefault(); 
  7.  } 
  8.  return null; 

從這段代碼可以看出,在找不到當(dāng)前系統(tǒng)對應(yīng)的資源文件時(shí),如果該屬性為 true,則會默認(rèn)查找當(dāng)前系統(tǒng)對應(yīng)的資源文件,否則就返回 null,返回 null 之后,最終又會調(diào)用到系統(tǒng)默認(rèn)的 messages.properties 文件。

3.LocaleResolver

國際化這塊主要涉及到的組件是 LocaleResolver,這是一個(gè)開放的接口,官方默認(rèn)提供了四個(gè)實(shí)現(xiàn)。當(dāng)前該使用什么環(huán)境,主要是通過 LocaleResolver 來進(jìn)行解析的。

LocaleResolver

 
 
 
 
  1. public interface LocaleResolver { 
  2.  Locale resolveLocale(HttpServletRequest request); 
  3.  void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale); 
  4.  

這里兩個(gè)方法:

  1. resolveLocale:根據(jù)當(dāng)前請求解析器出 Locale 對象。
  2. 設(shè)置 Locale 對象。

我們來看看 LocaleResolver 的繼承關(guān)系:

雖然中間有幾個(gè)抽象類,不過最終負(fù)責(zé)實(shí)現(xiàn)的其實(shí)就四個(gè):

  • AcceptHeaderLocaleResolver:根據(jù)請求頭中的 Accept-Language 字段來確定當(dāng)前的區(qū)域語言等。
  • SessionLocaleResolver:根據(jù)請求參數(shù)來確定區(qū)域語言等,確定后會保存在 Session 中,只要 Session 不變,Locale 對象就一直有效。
  • CookieLocaleResolver:根據(jù)請求參數(shù)來確定區(qū)域語言等,確定后會保存在 Cookie 中,只要 Session 不變,Locale 對象就一直有效。
  • FixedLocaleResolver:配置時(shí)直接提供一個(gè) Locale 對象,以后不能修改。

接下來我們就對這幾個(gè)類逐一進(jìn)行分析。

3.1 AcceptHeaderLocaleResolver

AcceptHeaderLocaleResolver 直接實(shí)現(xiàn)了 LocaleResolver 接口,我們來看它的 resolveLocale 方法:

 
 
 
 
  1. @Override 
  2. public Locale resolveLocale(HttpServletRequest request) { 
  3.  Locale defaultLocale = getDefaultLocale(); 
  4.  if (defaultLocale != null && request.getHeader("Accept-Language") == null) { 
  5.   return defaultLocale; 
  6.  } 
  7.  Locale requestLocale = request.getLocale(); 
  8.  List supportedLocales = getSupportedLocales(); 
  9.  if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) { 
  10.   return requestLocale; 
  11.  } 
  12.  Locale supportedLocale = findSupportedLocale(request, supportedLocales); 
  13.  if (supportedLocale != null) { 
  14.   return supportedLocale; 
  15.  } 
  16.  return (defaultLocale != null ? defaultLocale : requestLocale); 
  1. 首先去獲取默認(rèn)的 Locale 對象。
  2. 如果存在默認(rèn)的 Locale 對象,并且請求頭中沒有設(shè)置 Accept-Language 字段,則直接返回默認(rèn)的 Locale。
  3. 從 request 中取出當(dāng)前的 Locale 對象,然后查詢出支持的 supportedLocales,如果 supportedLocales 或者 supportedLocales 中包含 requestLocale,則直接返回 requestLocale。
  4. 如果前面還是沒有匹配成功的,則從 request 中取出 locales 集合,然后再去和支持的 locale 進(jìn)行比對,選擇匹配成功的 locale 返回。
  5. 如果前面都沒能返回,則判斷 defaultLocale 是否為空,如果不為空,就返回 defaultLocale,否則返回 defaultLocale。

再來看看它的 setLocale 方法,直接拋出異常,意味著通過請求頭處理 Locale 是不允許修改的。

 
 
 
 
  1. @Override 
  2. public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) { 
  3.  throw new UnsupportedOperationException( 
  4.    "Cannot change HTTP accept header - use a different locale resolution strategy"); 

3.2 SessionLocaleResolver

SessionLocaleResolver 的實(shí)現(xiàn)多了一個(gè)抽象類 AbstractLocaleContextResolver,AbstractLocaleContextResolver 中增加了對 TimeZone 的支持,我們先來看下 AbstractLocaleContextResolver:

 
 
 
 
  1. public abstract class AbstractLocaleContextResolver extends AbstractLocaleResolver implements LocaleContextResolver { 
  2.  @Nullable 
  3.  private TimeZone defaultTimeZone; 
  4.  public void setDefaultTimeZone(@Nullable TimeZone defaultTimeZone) { 
  5.   this.defaultTimeZone = defaultTimeZone; 
  6.  } 
  7.  @Nullable 
  8.  public TimeZone getDefaultTimeZone() { 
  9.   return this.defaultTimeZone; 
  10.  } 
  11.  @Override 
  12.  public Locale resolveLocale(HttpServletRequest request) { 
  13.   Locale locale = resolveLocaleContext(request).getLocale(); 
  14.   return (locale != null ? locale : request.getLocale()); 
  15.  } 
  16.  @Override 
  17.  public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) { 
  18.   setLocaleContext(request, response, (locale != null ? new SimpleLocaleContext(locale) : null)); 
  19.  } 
  20.  

可以看到,多了一個(gè) TimeZone 屬性。從請求中解析出 Locale 還是調(diào)用了 resolveLocaleContext 方法,該方法在子類中被實(shí)現(xiàn),另外調(diào)用 setLocaleContext 方法設(shè)置 Locale,該方法的實(shí)現(xiàn)也在子類中。

我們來看下它的子類 SessionLocaleResolver:

 
 
 
 
  1. @Override 
  2. public Locale resolveLocale(HttpServletRequest request) { 
  3.  Locale locale = (Locale) WebUtils.getSessionAttribute(request, this.localeAttributeName); 
  4.  if (locale == null) { 
  5.   locale = determineDefaultLocale(request); 
  6.  } 
  7.  return locale; 

直接從 Session 中獲取 Locale,默認(rèn)的屬性名是 SessionLocaleResolver.class.getName() + ".LOCALE",如果 session 中不存在 Locale 信息,則調(diào)用 determineDefaultLocale 方法去加載 Locale,該方法會首先找到 defaultLocale,如果 defaultLocale 不為 null 就直接返回,否則就從 request 中獲取 Locale 返回。

再來看 setLocaleContext 方法,就是將解析出來的 Locale 保存起來。

 
 
 
 
  1. @Override 
  2. public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, 
  3.   @Nullable LocaleContext localeContext) { 
  4.  Locale locale = null; 
  5.  TimeZone timeZone = null; 
  6.  if (localeContext != null) { 
  7.   locale = localeContext.getLocale(); 
  8.   if (localeContext instanceof TimeZoneAwareLocaleContext) { 
  9.    timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone(); 
  10.   } 
  11.  } 
  12.  WebUtils.setSessionAttribute(request, this.localeAttributeName, locale); 
  13.  WebUtils.setSessionAttribute(request, this.timeZoneAttributeName, timeZone); 

保存到 Session 中即可。大家可以看到,這種保存方式其實(shí)和我們前面演示的自己保存代碼基本一致,殊途同歸。

3.3 FixedLocaleResolver

FixedLocaleResolver 有三個(gè)構(gòu)造方法,無論調(diào)用哪一個(gè),都會配置默認(rèn)的 Locale:

 
 
 
 
  1. public FixedLocaleResolver() { 
  2.  setDefaultLocale(Locale.getDefault()); 
  3. public FixedLocaleResolver(Locale locale) { 
  4.  setDefaultLocale(locale); 
  5. public FixedLocaleResolver(Locale locale, TimeZone timeZone) { 
  6.  setDefaultLocale(locale); 
  7.  setDefaultTimeZone(timeZone); 

要么自己傳 Locale 進(jìn)來,要么調(diào)用 Locale.getDefault() 方法獲取默認(rèn)的 Locale。

再來看 resolveLocale 方法:

 
 
 
 
  1. @Override 
  2. public Locale resolveLocale(HttpServletRequest request) { 
  3.  Locale locale = getDefaultLocale(); 
  4.  if (locale == null) { 
  5.   locale = Locale.getDefault(); 
  6.  } 
  7.  return locale; 

這個(gè)應(yīng)該就不用解釋了吧。

需要注意的是它的 setLocaleContext 方法,直接拋異常出來,也就意味著 Locale 在后期不能被修改。

 
 
 
 
  1. @Override 
  2. public void setLocaleContext( HttpServletRequest request, @Nullable HttpServletResponse response, 
  3.   @Nullable LocaleContext localeContext) { 
  4.  throw new UnsupportedOperationException("Cannot change fixed locale - use a different locale resolution strategy"); 

3.4 CookieLocaleResolver

CookieLocaleResolver 和 SessionLocaleResolver 比較類似,只不過存儲介質(zhì)變成了 Cookie,其他都差不多,松哥就不再重復(fù)介紹了。

4.附錄

搜刮了一個(gè)語言簡稱表,分享給各位小伙伴:

語言 簡稱
簡體中文(中國)zh_CN
繁體中文(中國臺灣)zh_TW
繁體中文(中國香港)zh_HK
英語(中國香港)en_HK
英語(美國)en_US
英語(英國)en_GB
英語(全球)en_WW
英語(加拿大)en_CA
英語(澳大利亞)en_AU
英語(愛爾蘭)en_IE
英語(芬蘭)en_FI
芬蘭語(芬蘭)fi_FI
英語(丹麥)en_DK
丹麥語(丹麥)da_DK
英語(以色列)en_IL
希伯來語(以色列)he_IL
英語(南非)en_ZA
英語(印度)en_IN
英語(挪威)en_NO
英語(新加坡)en_SG
英語(新西蘭)en_NZ
英語(印度尼西亞)en_ID
英語(菲律賓)en_PH
英語(泰國)en_TH
英語(馬來西亞)en_MY
英語(阿拉伯)en_XA
韓文(韓國)ko_KR
日語(日本)ja_JP
荷蘭語(荷蘭)nl_NL
荷蘭語(比利時(shí))nl_BE
葡萄牙語(葡萄牙)pt_PT
葡萄牙語(巴西)pt_BR
法語(法國)fr_FR
法語(盧森堡)fr_LU
法語(瑞士)fr_CH
法語(比利時(shí))fr_BE
法語(加拿大)fr_CA
西班牙語(拉丁美洲)es_LA
西班牙語(西班牙)es_ES
西班牙語(阿根廷)es_AR
西班牙語(美國)es_US
西班牙語(墨西哥)es_MX
西班牙語(哥倫比亞)es_CO
西班牙語(波多黎各)es_PR
德語(德國)de_DE
德語(奧地利)de_AT
德語(瑞士)de_CH
俄語(俄羅斯)ru_RU
意大利語(意大利)it_IT
希臘語(希臘)el_GR
挪威語(挪威)no_NO
匈牙利語(匈牙利)hu_HU
土耳其語(土耳其)tr_TR
捷克語(捷克共和國)cs_CZ
斯洛文尼亞語sl_SL
波蘭語(波蘭)pl_PL
瑞典語(瑞典)sv_SE
西班牙語(智利)es_CL

5.小結(jié)

好啦,今天主要和小伙伴們聊了下 SpringMVC 中的國際化問題,以及 LocaleResolver 相關(guān)的源碼,相信大家對 SpringMVC 的理解應(yīng)該又更近一步了吧。

本文轉(zhuǎn)載自微信公眾號「江南一點(diǎn)雨 」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系江南一點(diǎn)雨公眾號。


文章題目:這篇文章讓你搞懂SpringMVC國際化!
文章分享:http://www.5511xx.com/article/dhoigph.html