spring mvc 國際化的幾種方案
spring mvc 國際化的幾種方案
首先配置我們專案的service-servlet.xml檔案新增的內容如下:
<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測試,
@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, "返回資料"); }
通過設定瀏覽器請求測試:ofollow,noindex">http://localhost:8080/xxx/nation/test
- 注意: 上述基於瀏覽器設定,根據瀏覽器的本地來確定message
-
基於session的國際化
在專案中的原始檔夾resources/messages中新增messages.properties、messages_zh_CN.properties、messages_en_US.properties三個檔案,其中messages.properties、messages_zh_CN.properties裡面新增msg="\u662F\u4E0D\u662F"為中文,messages_en_US.properties裡面的為msg="ok"。
在專案的service-servlet.xml檔案新增的內容如下,(之前ResourceBundleMessageSource的配置任然保留)
<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測試
@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=en
-
基於cookie,與session類似
移除session國際化的設定
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
新增cookie設定
<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測試
@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, "返回資料"); }
-
基於url國際化方式
配置如下,移除上述localeResolver的bean改為下面的:
<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; } }
-
之後就可以在請求的URL後附上 locale=zh_CN 或 locale=en_US 如http://xxxxxxxx?locale=zh_CN 來改變語言了
使用Controller測試,
@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讀取相應的配置檔案中的資訊
Locale locale = new Locale("en", "US"); String message = msr.getMessage("msg", new Object [] {"userDao"}, "Required", locale); System.out.println(message);
所以其實控制local即選擇相應的處理方式,而以上幾種均是通過攔截器注入不同的local來實現,這裡我們可以自己實現符合自己業務場景的實現方式