解析文字訊息


ApplicationContext繼承了org.springframework.context.MessageResource介面,您可以使用getMessage()的各個簽署方法來取得訊息資源,從而實現國際化訊息的目的。

您可以簡單的透過MessageResource的一個實作org.springframework.context.support.ResourceBundleMessageSource來取得國際化訊息,首先在Bean定義檔中撰寫:
  • beans-config.xml
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>messages</value>
</property>
</bean>
</beans>

basename屬性用來設定訊息資源的前置檔案名稱,在這邊設定是messages,則訊息資源檔的名稱可以是 messages_en_US.properties、messages_zh_TW.properties、 messages_*.properties等等名稱,在這邊提供兩個:messages_en_US.properties、 messages_zh_TW.properties,首先messages_en_US.properties內容如下:
  • messages_en_US.properties
userLogin=User {0} login at {1}

messages_zh_TW.properties內容如下:
  • messages_zh_TW.properties
userLogin=使用者 {0} 於 {1} 登入

其中{0}與{1}是可以在程式執行過程中設定的佔位字元,ResourceBundleMessageSource實際上會使用JDK的 ResourceBundle來讀取這些文件,而中文在編碼過程中會發生問題,為了要能正確的顯示中文,我們必須對 message_zh_TW.properties進行編碼轉換,使用JDK工具中的native2ascii即可:
native2ascii messages_zh_TW.properties messages_zh_TW.txt

之後將messages_zh_TW.txt覆蓋(替換)掉messages_zh_TW.properties就可以了。

接下來撰寫一個簡單的測試程式:
  • SpringDemo.java
package onlyfun.caterpillar; 

import java.util.Calendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans-config.xml");

Object[] arguments =
new Object[] {"良葛格", Calendar.getInstance().getTime()};

System.out.println(
context.getMessage("userLogin", arguments, Locale.US));
System.out.println(
context.getMessage("userLogin", arguments, Locale.TAIWAN));
}
}

透過設定參數並指定Locale,使用getMessage()設定對應的訊息,這個測試程式結果會顯示以下的內容:
User 良葛格 login at 10/28/05 8:24 PM
使用者 良葛格 於 2005/10/28 下午 8:24 登入