Spring國際化實現

來源:互聯網
上載者:User

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當然了,這個是預設的名字來的,自己設定成別的也可以,但是就是麻煩,反正我用預設的就感覺不錯。

另外

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.