隨筆-314  評論-209  文章-0  trackbacks-0

          3.8.1. 利用MessageSource實現(xiàn)國際化

          ApplicationContext接口擴(kuò)展了MessageSource接口,因而提供了消息處理的功能(i18n或者國際化)。與HierarchicalMessageSource一起使用,它還能夠處理嵌套的消息,這些是Spring提供的處理消息的基本接口。讓我們快速瀏覽一下它所定義的方法:

          • String getMessage(String code, Object[] args, String default, Locale loc):用來從MessageSource獲取消息的基本方法。如果在指定的locale中沒有找到消息,則使用默認(rèn)的消息。args中的參數(shù)將使用標(biāo)準(zhǔn)類庫中的MessageFormat來作消息中替換值。

          • String getMessage(String code, Object[] args, Locale loc):本質(zhì)上和上一個方法相同,其區(qū)別在:沒有指定默認(rèn)值,如果沒找到消息,會拋出一個NoSuchMessageException異常。

          • String getMessage(MessageSourceResolvable resolvable, Locale locale):上面方法中所使用的屬性都封裝到一個MessageSourceResolvable實現(xiàn)中,而本方法可以指定MessageSourceResolvable實現(xiàn)。

          當(dāng)一個ApplicationContext被加載時,它會自動在context中查找已定義為MessageSource類型的bean。此bean的名稱須為messageSource。如果找到,那么所有對上述方法的調(diào)用將被委托給該bean。否則ApplicationContext會在其父類中查找是否含有同名的bean。如果有,就把它作為MessageSource。如果它最終沒有找到任何的消息源,一個空的StaticMessageSource將會被實例化,使它能夠接受上述方法的調(diào)用。

          Spring目前提供了兩個MessageSource的實現(xiàn):ResourceBundleMessageSourceStaticMessageSource。它們都繼承NestingMessageSource以便能夠處理嵌套的消息。StaticMessageSource很少被使用,但能以編程的方式向消息源添加消息。ResourceBundleMessageSource會用得更多一些,為此提供了一下示例:

          <beans>
          <bean id="messageSource"
          class="org.springframework.context.support.ResourceBundleMessageSource">
          <property name="basenames">
          <list>
          <value>format</value>
          <value>exceptions</value>
          <value>windows</value>
          </list>
          </property>
          </bean>
          </beans>

          這段配置假定在你的classpath中有三個資源文件(resource bundle),它們是formatexceptionswindows。通過ResourceBundle,使用JDK中解析消息的標(biāo)準(zhǔn)方式,來處理任何解析消息的請求。出于示例的目的,假定上面的兩個資源文件的內(nèi)容為…

          # in 'format.properties'
          message=Alligators rock!
          # in 'exceptions.properties'
          argument.required=The '{0}' argument is required.

          下面是測試代碼。因為ApplicationContext實現(xiàn)也都實現(xiàn)了MessageSource接口,所以能被轉(zhuǎn)型為MessageSource接口

          public static void main(String[] args) {
          MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
          String message = resources.getMessage("message", null, "Default", null);
          System.out.println(message);
          }

          上述程序的輸出結(jié)果將會是...

          Alligators rock!

          總而言之,我們在'beans.xml'的文件中(在classpath根目錄下)定義了一個messageSource bean,通過它的basenames屬性引用多個資源文件;而basenames屬性值由list元素所指定的三個值傳入,它們以文件的形式存在并被放置在classpath的根目錄下(分別為format.propertiesexceptions.propertieswindows.properties)。

          再分析個例子,這次我們將著眼于傳遞參數(shù)給查找的消息,這些參數(shù)將被轉(zhuǎn)換為字符串并插入到已查找到的消息中的占位符(譯注:資源文件中花括號里的數(shù)字即為占位符)。

          <beans>
          <!-- this MessageSource is being used in a web application -->
          <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
          <property name="baseName" value="WEB-INF/test-messages"/>
          </bean>
          <!-- let's inject the above MessageSource into this POJO -->
          <bean id="example" class="com.foo.Example">
          <property name="messages" ref="messageSource"/>
          </bean>
          </beans>
          public class Example {
          private MessageSource messages;
          public void setMessages(MessageSource messages) {
          this.messages = messages;
          }
          public void execute() {
          String message = this.messages.getMessage("argument.required",
          new Object [] {"userDao"}, "Required", null);
          System.out.println(message);
          }
          }

          調(diào)用execute()方法的輸出結(jié)果是...

          The 'userDao' argument is required.

          對于國際化(i18n),Spring中不同的MessageResource實現(xiàn)與JDK標(biāo)準(zhǔn)ResourceBundle中的locale解析規(guī)則一樣。比如在上面例子中定義的messageSource bean,如果你想解析British (en-GB) locale的消息,那么需要創(chuàng)建format_en_GB.propertiesexceptions_en_GB.propertieswindows_en_GB.properties三個資源文件。

          Locale解析通常由應(yīng)用程序根據(jù)運行環(huán)境來指定。出于示例的目的,我們對將要處理的(British)消息手工指定locale參數(shù)值。

          # in 'exceptions_en_GB.properties'
          argument.required=Ebagum lad, the '{0}' argument is required, I say, required.
          public static void main(final String[] args) {
          MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
          String message = resources.getMessage("argument.required",
          new Object [] {"userDao"}, "Required", Locale.UK);
          System.out.println(message);
          }

          上述程序運行時的輸出結(jié)果是...

          Ebagum lad, the 'userDao' argument is required, I say, required.

          MessageSourceAware接口還能用于獲取任何已定義的MessageSource引用。任何實現(xiàn)了MessageSourceAware接口的bean將在創(chuàng)建和配置的時候與MessageSource一同被注入。

          posted on 2008-11-22 16:51 xzc 閱讀(4099) 評論(3)  編輯  收藏 所屬分類: Java

          評論:
          # re: 利用MessageSource實現(xiàn)國際化[I18N] 2008-11-22 16:53 | xzc
          String message = resources.getMessage("argument.required",
          new Object [] {"userDao"}, "Required", Locale.getDefault());
            回復(fù)  更多評論
            
          # re: 利用MessageSource實現(xiàn)國際化[I18N] 2008-11-22 16:55 | xzc
          <beans>
          <!-- this MessageSource is being used in a web application -->
          <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
          <property name="baseName" value="WEB-INF/test-messages"/>
          </bean>
          <!-- let's inject the above MessageSource into this POJO -->
          <bean id="example" class="com.foo.Example">
          <property name="messages" ref="messageSource"/>
          </bean>
          </beans>  回復(fù)  更多評論
            
          # re: 利用MessageSource實現(xiàn)國際化[I18N] 2008-11-22 16:58 | xzc
          messageSource[Spring]主要用于消息、日志[Locale.getDefault()]
          jstl I18N 主要用于jsp頁面。[ ]  回復(fù)  更多評論
            
          主站蜘蛛池模板: 长治县| 大埔县| 儋州市| 徐汇区| 沂水县| 政和县| 闻喜县| 资源县| 绥中县| 兴仁县| 新巴尔虎右旗| 疏勒县| 固安县| 松溪县| 宁海县| 金门县| 沅陵县| 湘潭县| 苍溪县| 佛坪县| 毕节市| 博罗县| 泗阳县| 平陆县| 嵩明县| 勃利县| 沙田区| 贺州市| 朝阳县| 永善县| 二连浩特市| 延津县| 杭州市| 洱源县| 朝阳县| 垦利县| 从化市| 手游| 囊谦县| 榆树市| 湖口县|