首先配置咱們項目的service-servlet.xml文件添加的內容以下:web
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 國際化信息所在的文件名,根據ResourceBundleMessageSource類加載資源文件.\src\main\resources\messages\messages_en_US.properties --> <property name="basename" value="messages/messages" /> <!-- 若是在國際化資源文件中找不到對應代碼的信息,就用這個代碼做爲名稱 --> <property name="useCodeAsDefaultMessage" value="true" /> </bean> 1. 一.基於瀏覽器請求的國際化實現:
使用Controller測試,spring
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request){ public Result test(HttpServletRequest request,Model model){ //從後臺代碼獲取國際化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回數據"); }
經過設置瀏覽器請求測試:http://localhost:8080/xxx/nation/test瀏覽器
<mvc:interceptors> <!-- 國際化操做攔截器 若是採用基於(請求/Session/Cookie)則必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
使用controller測試cookie
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request, @RequestParam(value="langType", defaultValue="zh") String langType){ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); }else{ request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale()); } //從後臺代碼獲取國際化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回數據"); }
經過設置瀏覽器請求測試:http://localhost:8080/xxx/nation/test?langType=zh 或者 http://localhost:8080/xxx/nation/test?langType=ensession
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
添加cookie設置mvc
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <!-- 設置cookieName名稱,能夠根據名稱經過js來修改設置,也能夠像上面演示的那樣修改設置,默認的名稱爲 類名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE--> <property name="cookieName" value="lang"/> <!-- 設置最大有效時間,若是是-1,則不存儲,瀏覽器關閉後即失效,默認爲Integer.MAX_INT--> <property name="cookieMaxAge" value="100000" /> <!-- 設置cookie可見的地址,默認是「/」即對網站全部地址都是可見的,若是設爲其它地址,則只有該地址或其後的地址纔可見--> <property name="cookiePath" value="/" /> </bean>
使用Controller測試app
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request, HttpServletResponse response,@RequestParam(value="langType", defaultValue="zh") String langType){ if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); (new CookieLocaleResolver()).setLocale (request, response, locale); }else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); (new CookieLocaleResolver()).setLocale (request, response, locale); }else (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale()); //從後臺代碼獲取國際化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回數據"); }
<bean id="localeResolver" class="xx.xxx.xxx.UrlAcceptHeaderLocaleResolver"/>
UrlAcceptHeaderLocaleResolver爲自定義實現,具體代碼以下:測試
public class UrlAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver { private Locale urlLocal; public Locale resolveLocale(HttpServletRequest request) { return urlLocal!=null?urlLocal:request.getLocale(); } public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { urlLocal = locale; } }
@RequestMapping(value="/test",method={RequestMethod.POST,RequestMethod.GET}) @ResponseBody public Result test(HttpServletRequest request){ public Result test(HttpServletRequest request,Model model){ //從後臺代碼獲取國際化信息 RequestContext requestContext = new RequestContext(request); String msg = requestContext.getMessage("msg"); return new Result(true, msg, "返回數據"); }
5.總結下,以上幾種其實都是基於網站
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 國際化信息所在的文件名 --> <property name="basename" value="messages/messages" /> <!-- 若是在國際化資源文件中找不到對應代碼的信息,就用這個代碼做爲名稱 --> <property name="useCodeAsDefaultMessage" value="true" /> </bean>
這裏無非是讀取messages目錄下以messages開頭的幾種配置文件,藉助MessageSource根據local讀取相應的配置文件中的信息ui
Locale locale = new Locale("en", "US"); String message = msr.getMessage("msg", new Object [] {"userDao"}, "Required", locale); System.out.println(message);
因此其實控制local即選擇相應的處理方式,而以上幾種均是經過攔截器注入不一樣的local來實現,這裏咱們能夠本身實現符合本身業務場景的實現方式
做者:勃列日涅夫連接:https://www.jianshu.com/p/680fc53dc3cc來源:簡書簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。