spring作為一個開源架構,對國際化自然提供了支援。說到國際化,有些人認為用處不大,那是因為僅僅從語言的角度考慮的。確實,如果僅簡體中文就夠了的話,沒必要用國際化,但國際化另一特點特對我們來說非常有用。那就是提示資訊的統一管理。
我們可以將所有提示都統一寫在國際化資源檔裡,而且它還支援動態傳入參數,即可以寫一個提示模板,根據參數動態產生提示。這樣不但可以避免因為代碼檔案編碼的原因造成的亂碼,還能在修改後直接起效而不用重啟項目或重新編譯,改起來也很方便。優點很多,真要說缺點,可能就是效能沒有直接寫在代碼死在代碼裡快吧(笑)。
那麼今天就為大家介紹下Spring國家化支援。
一、基於瀏覽器語言的國際化配置
使用Spring的MVC,並且配置中有配置Resource檔案
Xml代碼
<!-- 資源檔綁定器 --><bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="message-info" /> <property name="useCodeAsDefaultMessage" value="true" /></bean>
其中,message-info是你的properties檔案的通用名。如:我的設定檔叫 message-info.properties,message-info_zh_CN.properties等等。另外,可以通過cacheSeconds指定資源檔緩衝時間(即動態重新整理),通過defaultEncoding指定編碼格式。
只要有了這個配置,然後配置JSP 渲染器為JSTL支援的,那麼在你的JSP檔案中使用fmt標記就可以實現客戶瀏覽器語言國際化了。
如:
<fmt:message key="info.login.title" />
其中的info.login.title和你的資源檔對應。
另外一種方式是使用spring內建的標籤顯示國際化資訊,如:
<spring:message code="main.title" /><br> <input type="button" value="<spring:message code="main.title" />"/><br>
二、基於動態載入的國際化配置
1、基於請求的國際化配置
基於請求的國際化配置是指,在當前請求內,國際化配置生效,否則自動以瀏覽器為主。
配置方式如下:
首先配置攔截器
<!-- 國際化操作 攔截器 必需配置,可以和其它國際化方式通用 --><bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
這個配置呢,是不論請求層級的國際化,還是Cookie層級的國際化,再或者Session層級的國際化,都必需有配置這個攔截器,否則會不能使用。
配好上面的攔截器之後,就將攔截器注入到你的UrlHandlerMapping中,例如;
Xml代碼
<bean id="defaultUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors" ref="localeChangeInterceptor" /> <property name="order"> <value>1</value> </property></bean>
這個時候,但凡有了符合UrlMapping的請求,就會被攔截,並且開始配置國際化參數。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>
預設的參數名為locale主意大小寫。裡面放的就是你的提交參數。如:en_US,zh_CN之類的,這個時候,你在頁面上加一句<a href="?locale=zh_CN">簡體中文</a>
如果你的資源中,飽含建議中文的配置,那麼就會變成你確定的簡體中文拉。
如果產生異常"Cannot change HTTP accept header - use a different locale resolution strategy",根本原因是spring source 做了限制,解決辦法如下:
public class MyLocaleResolver extends AcceptHeaderLocaleResolver {private Locale myLocal;public Locale resolveLocale(HttpServletRequest request) {return myLocal == null ? request.getLocale() : myLocal;}public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {myLocal = locale;}}
然後修改設定檔中的localeResolver配置,class指向這個類就可以了。
2、基於Session的國際化配置
攔截器和基於請求的相同
Session的配置如下:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
在你的處理的Controller中,將提交上來的locale欄位資訊產生真正的Locale對象,然後將對象儲存在Session中,預設儲存的ID是SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME
這樣,當你的Session不到期,那麼語言種類始終保持正確的說,我一直是這樣子用的,我覺得還是Session的好,老外們用了很滿意。
3、基於Cookie的國際化配置
這個我就不說了,反正用的不多,至少我做的項目能不用Cookie就不用Cookie,所以,基於Cookie的國際化配置我就不細說了。配置如下:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
三、注意事項
如果不用預設的瀏覽器語言國際化方式,那麼攔截器一定要配置,如果你有多個UrlMapping,那麼就每個都配上攔截器。
至於配置的LocaleResolver的名字,一定要用上面的配置中的名字localeResolver當然了,這個是預設的名字來的,自己設定成別的也可以,但是就是麻煩,反正我用預設的就感覺不錯。
另外