摘要:概述為我們提供國際化支持,通過設(shè)置系統(tǒng)的環(huán)境,根據(jù)運(yùn)行環(huán)境使用不同的語言顯示。提供接口的作用是解析客戶端使用的地區(qū),目的是為了根據(jù)這些信息實(shí)現(xiàn)視圖多語言即國際化。接口繼承接口,增加時(shí)區(qū)支持。
概述
Spring MVC為我們提供國際化支持,通過設(shè)置系統(tǒng)的環(huán)境,根據(jù)運(yùn)行環(huán)境使用不同的語言顯示。
Spring提供LocaleResolver接口的作用是解析客戶端使用的地區(qū)(Locale),目的是為了根據(jù)這些信息實(shí)現(xiàn)視圖多語言即國際化。
LocaleContextResolver接口繼承LocaleResolver接口,增加時(shí)區(qū)(TimeZone)支持。
解析器(默認(rèn)AcceptHeaderLocaleResolver)AcceptHeaderLocaleResolver解析器implements LocaleResolver接口,重寫resolverLocale(HttpServletRequest request)方法,通過檢查客戶端發(fā)送請求中的Accept-Language頭來確定客戶端Locale(地區(qū)信息)。
此解析器不支持程序設(shè)置Locale,只能通過改變客戶端Accept-Language頭信息來改變設(shè)置,核心源碼如下:
/** * 從當(dāng)前的request中解析Locale */ @Override public Locale resolveLocale(HttpServletRequest request) { // 獲取默認(rèn)設(shè)置,可在配置AcceptHeaderLocaleResolver Bean中設(shè)置defaultLocale屬性 Locale defaultLocale = getDefaultLocale(); // 設(shè)置了默認(rèn)值并且請求中沒有Accept-Language頭信息時(shí),使用默認(rèn)設(shè)置 if (defaultLocale != null && request.getHeader("Accept-Language") == null) { return defaultLocale; } // 從當(dāng)前請求中獲取Locale Locale requestLocale = request.getLocale(); // 從配置中獲取支持的Locale集合,可在AcceptHeaderLocaleResolver Bean中設(shè)置supportedLocales屬性 List實(shí)戰(zhàn)supportedLocales = getSupportedLocales(); // 未設(shè)置supportedLocales或者supportedLocales中包括請求Locale,則使用請求Locale if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) { return requestLocale; } // 找到設(shè)置的Locale集合中是否有請求的Locale Locale supportedLocale = findSupportedLocale(request, supportedLocales); if (supportedLocale != null) { return supportedLocale; } return (defaultLocale != null ? defaultLocale : requestLocale); } /** * 不支持程序設(shè)置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"); }
項(xiàng)目結(jié)構(gòu)
配置文件
在Spring MVC配置文件中配置資源加載以及AcceptHeaderLocaleResolver Bean,配置如下:
屬性文件
在類路徑下創(chuàng)建配置文件,本項(xiàng)目放置路徑為:resources/i18n/messages_*.proerties,詳見項(xiàng)目結(jié)構(gòu),配置文件中配置信息如下:
messages_en.properties
message.locale=en
messages_en _US.properties
message.locale=en_US
messages_zh _CN.properties
message.locale=zh_CN
控制器
編寫Controller控制器,以便測試,代碼如下:
@GetMapping(value = "/acceptHeaderLocaleResolver" , produces = "text/html;charset=UTF-8") @ResponseBody public String test(HttpServletRequest request) { String clientLocale = ""; Enumerationenus = request.getLocales(); while (enus.hasMoreElements()){ Locale locale = enus.nextElement(); clientLocale += locale + ","; } RequestContext requestContext = new RequestContext(request); String value = requestContext.getMessage("message.locale"); return "客戶端支持的Locale有:"+clientLocale+" 當(dāng)前使用的Locale是:" + requestContext.getLocale() + " 使用的資源Locale文件是:" + value ; }
測試
以chrome為例,首先確認(rèn)chrome的語言設(shè)置,如下:
有上圖可見,測試的第一語言為中文(簡體),我們在地址欄訪問我們的Controller,返回信息如下:
由于客戶端設(shè)置的為zh-CN,Spring MVC國際化使用的屬性文件是messages_zh _CN.properties,我們通過修改客戶端屬性進(jìn)行測試,調(diào)整chrome語言,即把英語設(shè)置到第一位,再次訪問Controller,返回信息如下:
此時(shí)的系統(tǒng)使用語言已經(jīng)切換為message_en.properties。
總結(jié)各瀏覽器默認(rèn)的語言各不相同,可通過設(shè)置進(jìn)行修改調(diào)整;
客戶端請求頭Accept-Languages的第一個(gè)(權(quán)重最大)為Spring MVC使用的Locale;
權(quán)重最大的Locale名必須與屬性文件一致,否則找不到,如Accept-Languages的第一個(gè)為en,則資源文件名必須設(shè)置為messages_en.properties,如果第一個(gè)是zh-CN,則資源名稱為messages_zh _CN.properties;
使用messageSource Bean時(shí),如果資源文件放在類路徑下,basename的值必須以classpath:開頭。
最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時(shí)也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/69326.html
摘要:概述我們繼續(xù)分析學(xué)習(xí),本節(jié)我們分析使用的是。與類似,運(yùn)用用戶會(huì)話實(shí)現(xiàn)功能。最后創(chuàng)建了群方便大家交流,可掃描加入,同時(shí)也可加我,共同學(xué)習(xí)共同進(jìn)步,謝謝 概述 我們繼續(xù)分析學(xué)習(xí)Spring MVC LocaleResolver,本節(jié)我們分析使用的是SessionLocaleResolver。SessionLocaleResolver與CookieLocaleResolver類似,運(yùn)用用戶會(huì)...
摘要:需求根據(jù)客戶端環(huán)境,界面顯示不同的國旗圖案。選擇的技術(shù)方案可利用提供的國際化和主題定制來解決。注意此時(shí)返回的中沒有國際化及主題相關(guān)的信息。修改請求參數(shù)的值為荷蘭,即后再發(fā)起請求,結(jié)果如下與預(yù)期一致,測試通過。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver兩個(gè)策略解析器,在實(shí)際項(xiàng)目中很少使用,尤其是ThemeResolver,花精力去分析...
摘要:概述上一篇就默認(rèn)的進(jìn)行了分析,詳細(xì)請參考,本節(jié)我們繼續(xù)分析學(xué)習(xí),主要分析解析器類繼承關(guān)系如下圖由上面類圖可知,繼承并實(shí)現(xiàn)接口,主要是操作的工具類,繼承接口,增加了信息操作。即通過實(shí)現(xiàn)的選擇。 概述 上一篇就Spring MVC默認(rèn)的LocaleResovler(AcceptHeaderLocaleResolver)進(jìn)行了分析,詳細(xì)請參考https://segmentfault.com/...
摘要:此解析器不能動(dòng)態(tài)設(shè)置主題。實(shí)戰(zhàn)目標(biāo)練習(xí)使用解析器,最終效果如下項(xiàng)目結(jié)構(gòu)在下創(chuàng)建了主題文件夾及主題文件,下創(chuàng)建了靜態(tài)資源文件。是默認(rèn)的解析器,再此配置是為了自定義屬性值,即屬性文件名稱。其實(shí)此解析器與的實(shí)現(xiàn)原理基本相同。 概述 主題就是系統(tǒng)的整體樣式或風(fēng)格,可通過Spring MVC框架提供的主題(theme)設(shè)置應(yīng)用的整體樣式風(fēng)格,提高用戶體驗(yàn)。Spring MVC的主題就是一些靜態(tài)資...
摘要:類繼承關(guān)系如下該類實(shí)現(xiàn)接口,實(shí)現(xiàn)解析設(shè)置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認(rèn)的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。 概述 上節(jié)介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個(gè)解析器實(shí)現(xiàn)的功能是一樣的,只是使用的主題載體有區(qū)別而已,Sessi...
閱讀 3247·2021-11-19 09:40
閱讀 3709·2021-11-16 11:52
閱讀 3042·2021-11-11 16:55
閱讀 3247·2019-08-30 15:55
閱讀 1249·2019-08-30 13:08
閱讀 1725·2019-08-29 17:03
閱讀 3087·2019-08-29 16:19
閱讀 2639·2019-08-29 13:43