溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何配置SpringMVC國(guó)際化

發(fā)布時(shí)間:2021-10-13 11:55:22 來(lái)源:億速云 閱讀:164 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“如何配置SpringMVC國(guó)際化”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

如何配置SpringMVC國(guó)際化

1.SpringMVC 國(guó)際化配置

還是先來(lái)說(shuō)說(shuō)用法,再來(lái)說(shuō)源碼,這樣大家不容易犯迷糊。我們先說(shuō)在 SSM 中如何處理國(guó)際化問(wèn)題。

首先國(guó)際化我們可能有兩種需求:

  • 在頁(yè)面渲染時(shí)實(shí)現(xiàn)國(guó)際化(這個(gè)借助于 Spring 標(biāo)簽實(shí)現(xiàn))

  • 在接口中獲取國(guó)際化匹配后的消息

大致上就是上面這兩種場(chǎng)景。接下來(lái)松哥通過(guò)一個(gè)簡(jiǎn)單的用法來(lái)和大家演示下具體玩法。

首先我們?cè)陧?xiàng)目的 resources 目錄下新建語(yǔ)言文件,language_en_US.properties 和  language_zh-CN.properties,如下圖:

如何配置SpringMVC國(guó)際化

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

language_en_US.properties:

login.username=Username login.password=Password

language_zh-CN.properties:

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

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

<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">     <property name="basename" value="language"/>     <property name="defaultEncoding" value="UTF-8"/> </bean>

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

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

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>     <title>Title</title> </head> <body> <spring:message code="login.username"/> <input type="text"> <br> <spring:message code="login.password"/> <input type="text"> <br> </body> </html>

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

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

@Controller public class LoginController {     @Autowired     MessageSource messageSource;     @GetMapping("/login")     public String login() {         String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale());         String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale());         System.out.println("username = " + username);         System.out.println("password = " + password);         return "login";     } }

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

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

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

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

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

如何配置SpringMVC國(guó)際化

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

如何配置SpringMVC國(guó)際化

都沒(méi)問(wèn)題,完美!同時(shí)觀察 IDEA 控制臺(tái),也能正確打印出語(yǔ)言文字。

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

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

先來(lái)看 SessionLocaleResolver。

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

<mvc:interceptors>     <mvc:interceptor>         <mvc:mapping path="/**"/>         <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">             <property name="paramName" value="locale"/>         </bean>     </mvc:interceptor> </mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.SessionLocaleResolver" id="localeResolver"> </bean>

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

配置完成后,我們還是來(lái)訪問(wèn)剛才的 login 控制器,如下:

如何配置SpringMVC國(guó)際化

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

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

@Controller public class LoginController {     @Autowired     MessageSource messageSource;     @GetMapping("/login")     public String login(String locale,HttpSession session) {         if ("zh-CN".equals(locale)) {             session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));         } else if ("en-US".equals(locale)) {             session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));         }         String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale());         String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale());         System.out.println("username = " + username);         System.out.println("password = " + password);         return "login";     } }

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

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

<bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver" id="localeResolver"/>

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

@GetMapping("/login3") public String login3(String locale, HttpServletRequest req, HttpServletResponse resp) {     CookieLocaleResolver resolver = new CookieLocaleResolver();     if ("zh-CN".equals(locale)) {         resolver.setLocale(req, resp, new Locale("zh", "CN"));     } else if ("en-US".equals(locale)) {         resolver.setLocale(req, resp, new Locale("en", "US"));     }     String username = messageSource.getMessage("login.username", null, LocaleContextHolder.getLocale());     String password = messageSource.getMessage("login.password", null, LocaleContextHolder.getLocale());     System.out.println("username = " + username);     System.out.println("password = " + password);     return "login"; }

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

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

2.Spring Boot 國(guó)際化配置

2.1 基本使用

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

所以在 Spring Boot 中做國(guó)際化,這一塊我們可以不用配置,直接就開(kāi)搞。

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

如何配置SpringMVC國(guó)際化

  • 我們的 message 文件是直接創(chuàng)建在 resources 目錄下的,IDEA 在展示的時(shí)候,會(huì)多出一個(gè) Resource  Bundle,這個(gè)大家不用管,千萬(wàn)別手動(dòng)去創(chuàng)建這個(gè)目錄。

  • messages.properties 這個(gè)是默認(rèn)的配置,其他的則是不同語(yǔ)言環(huán)境下的配置,en_US 是英語(yǔ)(美國(guó)),zh_CN 是中文簡(jiǎn)體,zh_TW  是中文繁體(文末附錄里邊有一個(gè)完整的語(yǔ)言簡(jiǎn)稱(chēng)表格)。

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

messages_zh_CN.properties

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

messages_zh_TW.properties

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

messages_en_US.properties

user.name=javaboy

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

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

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

@RestController public class HelloController {     @Autowired     MessageSource messageSource;     @GetMapping("/hello")     public String hello() {         return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());     } }

在 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)前的語(yǔ)言環(huán)境。

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

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

如何配置SpringMVC國(guó)際化

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

如何配置SpringMVC國(guó)際化

是不是很 Easy?

2.2 自定義切換

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

@Configuration public class WebConfig implements WebMvcConfigurer {     @Override     public void addInterceptors(InterceptorRegistry registry) {         LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();         interceptor.setParamName("lang");         registry.addInterceptor(interceptor);     }     @Bean     LocaleResolver localeResolver() {         SessionLocaleResolver localeResolver = new SessionLocaleResolver();         localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);         return localeResolver;     } }

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

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

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

如何配置SpringMVC國(guó)際化

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

CookieLocaleResolver 也是類(lèi)似用法,不再贅述。

2.3 其他自定義

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

如何配置SpringMVC國(guó)際化

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

spring.messages.basename=i18n/messages

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

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

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

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

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

protected Locale getDefaultLocale() {  if (this.defaultLocale != null) {   return this.defaultLocale;  }  if (this.fallbackToSystemLocale) {   return Locale.getDefault();  }  return null; }

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

3.LocaleResolver

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

LocaleResolver

public interface LocaleResolver {  Locale resolveLocale(HttpServletRequest request);  void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);  }

這里兩個(gè)方法:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. resolveLocale:根據(jù)當(dāng)前請(qǐng)求解析器出 Locale 對(duì)象。

  3. 設(shè)置 Locale 對(duì)象。

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

如何配置SpringMVC國(guó)際化

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

  • AcceptHeaderLocaleResolver:根據(jù)請(qǐng)求頭中的 Accept-Language 字段來(lái)確定當(dāng)前的區(qū)域語(yǔ)言等。

  • SessionLocaleResolver:根據(jù)請(qǐng)求參數(shù)來(lái)確定區(qū)域語(yǔ)言等,確定后會(huì)保存在 Session 中,只要 Session 不變,Locale  對(duì)象就一直有效。

  • CookieLocaleResolver:根據(jù)請(qǐng)求參數(shù)來(lái)確定區(qū)域語(yǔ)言等,確定后會(huì)保存在 Cookie 中,只要 Session 不變,Locale  對(duì)象就一直有效。

  • FixedLocaleResolver:配置時(shí)直接提供一個(gè) Locale 對(duì)象,以后不能修改。

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

3.1 AcceptHeaderLocaleResolver

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

@Override public Locale resolveLocale(HttpServletRequest request) {  Locale defaultLocale = getDefaultLocale();  if (defaultLocale != null && request.getHeader("Accept-Language") == null) {   return defaultLocale;  }  Locale requestLocale = request.getLocale();  List<Locale> supportedLocales = getSupportedLocales();  if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {   return requestLocale;  }  Locale supportedLocale = findSupportedLocale(request, supportedLocales);  if (supportedLocale != null) {   return supportedLocale;  }  return (defaultLocale != null ? defaultLocale : requestLocale); }
  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 首先去獲取默認(rèn)的 Locale 對(duì)象。

  3. 如果存在默認(rèn)的 Locale 對(duì)象,并且請(qǐng)求頭中沒(méi)有設(shè)置 Accept-Language 字段,則直接返回默認(rèn)的 Locale。

  4. 從 request 中取出當(dāng)前的 Locale 對(duì)象,然后查詢出支持的 supportedLocales,如果 supportedLocales 或者  supportedLocales 中包含 requestLocale,則直接返回 requestLocale。

  5. 如果前面還是沒(méi)有匹配成功的,則從 request 中取出 locales 集合,然后再去和支持的 locale 進(jìn)行比對(duì),選擇匹配成功的 locale  返回。

  6. 如果前面都沒(méi)能返回,則判斷 defaultLocale 是否為空,如果不為空,就返回 defaultLocale,否則返回  defaultLocale。

再來(lái)看看它的 setLocale 方法,直接拋出異常,意味著通過(guò)請(qǐng)求頭處理 Locale 是不允許修改的。

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

3.2 SessionLocaleResolver

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

public abstract class AbstractLocaleContextResolver extends AbstractLocaleResolver implements LocaleContextResolver {  @Nullable  private TimeZone defaultTimeZone;  public void setDefaultTimeZone(@Nullable TimeZone defaultTimeZone) {   this.defaultTimeZone = defaultTimeZone;  }  @Nullable  public TimeZone getDefaultTimeZone() {   return this.defaultTimeZone;  }  @Override  public Locale resolveLocale(HttpServletRequest request) {   Locale locale = resolveLocaleContext(request).getLocale();   return (locale != null ? locale : request.getLocale());  }  @Override  public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {   setLocaleContext(request, response, (locale != null ? new SimpleLocaleContext(locale) : null));  }  }

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

我們來(lái)看下它的子類(lèi) SessionLocaleResolver:

@Override public Locale resolveLocale(HttpServletRequest request) {  Locale locale = (Locale) WebUtils.getSessionAttribute(request, this.localeAttributeName);  if (locale == null) {   locale = determineDefaultLocale(request);  }  return locale; }

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

再來(lái)看 setLocaleContext 方法,就是將解析出來(lái)的 Locale 保存起來(lái)。

@Override public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response,   @Nullable LocaleContext localeContext) {  Locale locale = null;  TimeZone timeZone = null;  if (localeContext != null) {   locale = localeContext.getLocale();   if (localeContext instanceof TimeZoneAwareLocaleContext) {    timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();   }  }  WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);  WebUtils.setSessionAttribute(request, this.timeZoneAttributeName, timeZone); }

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

3.3 FixedLocaleResolver

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

public FixedLocaleResolver() {  setDefaultLocale(Locale.getDefault()); } public FixedLocaleResolver(Locale locale) {  setDefaultLocale(locale); } public FixedLocaleResolver(Locale locale, TimeZone timeZone) {  setDefaultLocale(locale);  setDefaultTimeZone(timeZone); }

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

再來(lái)看 resolveLocale 方法:

@Override public Locale resolveLocale(HttpServletRequest request) {  Locale locale = getDefaultLocale();  if (locale == null) {   locale = Locale.getDefault();  }  return locale; }

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

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

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

3.4 CookieLocaleResolver

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

4.附錄

搜刮了一個(gè)語(yǔ)言簡(jiǎn)稱(chēng)表,分享給各位小伙伴:

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

“如何配置SpringMVC國(guó)際化”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI