您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“如何配置SpringMVC國(guó)際化”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
還是先來(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,如下圖:
內(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)境:
然后測(cè)試英文環(huán)境:
都沒(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 控制器,如下:
此時(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ò)多介紹了。
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è)試文件,如下:
我們的 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é)果如下:
小伙伴們看到,我在請(qǐng)求頭中設(shè)置了 Accept-Language 為 zh-CN,所以拿到的就是簡(jiǎn)體中文;如果我設(shè)置了 zh-TW,就會(huì)拿到繁體中文:
是不是很 Easy?
有的小伙伴覺(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)方式如下:
我們通過(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)似用法,不再贅述。
默認(rèn)情況下,我們的配置文件放在 resources 目錄下,如果大家想自定義,也是可以的,例如定義在 resources/i18n 目錄下:
但是這種定義方式系統(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 文件。
國(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è)方法:
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
resolveLocale:根據(jù)當(dāng)前請(qǐng)求解析器出 Locale 對(duì)象。
設(shè)置 Locale 對(duì)象。
我們來(lái)看看 LocaleResolver 的繼承關(guān)系:
雖然中間有幾個(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)行分析。
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); }
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
首先去獲取默認(rèn)的 Locale 對(duì)象。
如果存在默認(rèn)的 Locale 對(duì)象,并且請(qǐng)求頭中沒(méi)有設(shè)置 Accept-Language 字段,則直接返回默認(rèn)的 Locale。
從 request 中取出當(dāng)前的 Locale 對(duì)象,然后查詢出支持的 supportedLocales,如果 supportedLocales 或者 supportedLocales 中包含 requestLocale,則直接返回 requestLocale。
如果前面還是沒(méi)有匹配成功的,則從 request 中取出 locales 集合,然后再去和支持的 locale 進(jìn)行比對(duì),選擇匹配成功的 locale 返回。
如果前面都沒(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"); }
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í)和我們前面演示的自己保存代碼基本一致,殊途同歸。
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"); }
CookieLocaleResolver 和 SessionLocaleResolver 比較類(lèi)似,只不過(guò)存儲(chǔ)介質(zhì)變成了 Cookie,其他都差不多,松哥就不再重復(fù)介紹了。
搜刮了一個(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í)用文章!
免責(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)容。