摘要:
對于許多軟件開發者來說,一提到國際化(亦稱為 i18n)支持就會感到害怕。 要使編寫的代碼能夠面向外國使用者,確實需要費一翻思量,因為在現有軟件的代碼中添加國際化支持可不是一件輕而易舉的事。
對于許多軟件開發者來說,一提到國際化(亦稱為 i18n)支持就會感到害怕。 要使編寫的代碼能夠面向外國使用者,確實需要費一翻思量,因為在現有軟件的代碼中添加國際化支持可不是一件輕而易舉的事。 假如您感覺到軟件需要支持不同語言和語言環境,哪怕這種可能性很小,從一開始就做國際化項目的預備,比起項目開始后再試圖添加國際化支持也要明智得多。
有人問“國際化”是什么意思? 國際化遠不止于將用戶界面消息翻譯成不同的語言。 它還涉及到處理不同的字符編碼、日期/時間/貨幣的顯示形式、以及跨多區域時存在的一些其他差異。
介紹 i18nlog
本文的目的并不在于討論那些關于國際化的瑣碎的方面,而是通過研究一個稱為 "I18N Messages and Logging" (簡稱 i18nlog) 的開源項目,來介紹引入國際化功能時需要執行的一些必要的任務
i18nlog 答應您在 java 應用程序內集成國際化的消息,這是通過向以下內容提供 API 來完成的:
+標注 Java 類以識別國際化消息
+從所有支持的語言環境資源包中獲取國際化消息
+創建特定于語言環境的異常,并在其中使用國際化的消息
+使用任何日志框架創建國際化消息日志
+自動生成特定于語言環境的資源包
+自動生成幫助及參考文檔
定義國際化消息
國際化軟件時一項最為乏味的工作莫過于維護資源綁定包了。 資源綁定包是包含 "name=value" 這種信息對的屬性文件 (.
i18nlog 提供了一些用于定義資源綁定消息及其要害字字符串的標注--用于將資源注入到 i18nlog 的自定義 Ant 任務中,您可以自動生成資源綁定包,而不必為確保屬性文件與訪問屬性文件的 Java 代碼之間的一致性作過多的工作。
@I18NMessage 標注被放在常量上,這些常量就是資源綁定包的要害字字符串使用的常量。 使用這些常量可以迫使執行編譯時檢查;例如代碼中引入的拼寫錯誤(如常量名稱的拼寫錯誤)和使用過時消息或已刪除消息,這些錯誤在編譯時就可以被探測到。 以下是使用此標注的示例:
java 代碼
1. @I18NMessage( "Hello, {0}. You last visited on {1,date}" )
2. public static final String MSG_WELCOME = "example.welcome-msg";
上面的示例定義了一條國際化消息。 常量的值定義了資源綁定包的要害字字符串(key string)。 標注的值是一條實際翻譯好的消息。 您可以將這些標注過的常量放到應用程序的任何類或接口中。 可以將它們放在單獨的類或接口中(將所有消息定義集中到一個地點),也可以放在使用到它們的類中。
@I18NResourceBundle 標注用于定義存放消息的資源綁定包文件(.properties 文件)。 它可以標注整個類或接口,也可以標注特定的部分。 假如您標注了一個類或接口,則該類或接口中的所有 @I18NMessage 標注都將被存儲在該標注定義的資源綁定包中(默認情況下)。 假如只將標注放在特定的常量上,那么它就只是那個常量的綁定包。 以下是使用此標注的示例:
java 代碼
1. @I18NResourceBundle( baseName = "messages",
2. defaultLocale = "en" )
以上代碼的意思是,所有被 @I18NMessage 標注的相關消息都將放置在名為 messages_en.properties 綁定包文件中。 下面是一個更復雜的示例(包含一系列國際化消息的接口):
java 代碼
1. @I18NResourceBundle( baseName = "messages",
2. defaultLocale = "en" )
3. public interface Messages {
4. @I18NMessage( "Hello, {0}. You last visited on {1,date}" )
5. String MSG_WELCOME = "welcome-msg";
6.
7. @I18NMessage( "An error occurred, please try again" )
8. String MSG_ERR = "error-occurred";
9.
10. @I18NMessage( "The value is {0}" )
11. String MSG_VALUE = "value";
12. }
檢索國際化消息
定義了國際化常量后,就可以使用 i18nlog 的核心類提供的 API:mazz.i18n.Msg。 該 API 用于裝載存放于資源綁定屬性文件中的消息。 它還用于將值作為變量參數進行傳遞,從而替換消息中的占位符(例如, {0}, {1,date})。 另外,此 API 將您從直接使用 JDK 類進行編碼的工作中解放出來,也許您需要閱讀一下 Javadoc 的 java.text.MessageFormat 部分,以獲得對 i18nlog 工作原理的初步熟悉,尤其是它如何使用本地化的數據替換占位符。
下面是 Msg 類的使用實例:
java 代碼
1. // 使用靜態工廠方法創建一個 Msg 對象
2. // 假設默認綁定包的名字是 "messages"
3. System.out.println( Msg.createMsg( Messages.MSG_WELCOME,
4. name,
5. date ) );
和
java 代碼
1. // 使用構造函數創建一個 Msg 對象
2. Msg msg = new Msg( new Msg.BundleBaseName("messages") );
3. try {
4. String hello = msg.getMsg(Messages.MSG_WELCOME, name, date );
5. ... do something ...
6. }
7. catch (Exception e) {
8. throw new RuntimeException( msg.getMsg( Messages.MSG_ERR ) );
9. }