Java中如何?國際化
來源:互聯網
上載者:User
假如我們開發了一個在中文環境下啟動並執行頁面,代碼如下:<html><head><title>歡迎</title></head><body> <h1> 歡迎到來! </h1></body></html> 之後又假如,有一天我們公司的業務擴充到了日本,和美國,那麼我們必須要訂製另外的兩張不同的頁面,代碼為: <html><head><title>Welcome</title></head><body> <h1> Welcome Here! </h1></body></html>和<html><head><title>ようこそ</title></head><body> <h1> ようこそ! </h1></body></html> 也許你已經看到了,上述代碼只有文字內容不相同,除此之外完全相同。也許你已經猜到了,現實的代碼絕對不是這樣的。那麼是怎麼處理的呢?
基本概念引用http://en.wikipedia.org/wiki/Internationalization_and_localizationInternationalization and localization are means of adapting products such as publications, hardware or software for non-native environments, especially other nations and cultures. 國際化(internationalization i18n)和本地化(localization l10n)指讓產品(出版物,軟體,硬體等)能夠適應非本地環境,特別是其他的語言和文化。 針對電腦來說就是讓一個既可以在中文環境下運行也可以在英語,甚至是日語的環境下運行。
Java
中如何?國際化(僅限語言層面)Java中國際化通過兩步來完成,第一, 通過將文字內容以特定的方式存放在特定的檔案中,特定的檔案:方便管理,另外可以將檔案明和特定的語言管理起來特定的方式:有些時候有些環境不支援某些語言,例如通常英文環境不支援中文,所以要將中文改變為英文可以識別的形式,在使用的時候在轉變回來。 第二,在運行時根據當前的語言環境決定從哪個檔案中讀取文字內容。 第一步,特定的檔案,特定的格式特殊的檔案明通過語言和國家來定義,例如:中文中國 zh_CN日文日本 ja_JP英語美國 en_US Java中國際化的概念是將不同國家的語言描述的相同的東西放在各自對應的屬性檔案中,如果這個檔案的名字叫做Message,那麼對應語言的檔案分別為:中文中國 Message_zh_CN.properties日文日本 Message_ja_JP.properties英文美國 Message_en_US.properties 特殊的方式使用替換ascii的方式,java中提供了一個native2ascii.exe的工具(在JAVA_HOME/bin目錄下),這個工具專門用來把某種特定的文字內容轉變為特殊的格式。 例如Message_zh_CN.properties中的內容為:Msg1 = 歡迎Msg2 = 歡迎到這裡!經過命令native2ascii Message_zh_CN.properties之後輸出:Msg1 = /u6b22/u8fceMsg2 = /u6b22/u8fce/u5230/u8fd9/u91cc/uff01這裡/u6b22等的數字是對應漢字(或者其他非英語字元)的unicode表示 第二步,通過當前的運行環境確定使用的檔案的名字例如存在上述的三個檔案:中文中國 Message_zh_CN.properties日文日本 Message_ja_JP.properties英文美國 Message_en_US.properties 可以使用java.util.ResouceBundle 類來取得當前的資源檔,代碼為:ResourceBundle rb = ResourceBundle.
getBundle("Message");也可以指語言與國家特徵來獲得想要的檔案的內容,例如:ResourceBundle rb = ResourceBundle.
getBundle("Message", Locale.
JAPAN);
Struts2
中如何?國際化(僅限語言層面)Struts2中使用國際化的幾個方法:1) UI標籤例如:<s:i18n name="struts.action.test.i18n.Shop"> <s:text name="main.title"/></s:i18n>從指定資源檔struts.action.test.i18n.Shop中找到main.title對應的訊息內容。 <!-- Second Example --><s:text name="main.title" />從對應的檔案中找到main.title對應的訊息內容。 <!-- Third Examlpe --><s:text name="i18n.label.greetings"> <s:param >Mr Smith</s:param></s:text>從對應的檔案中找到i18n.label.greetings對應的訊息內容,其中的{0}參數將會被Mr Smith替換。 2) ActionSupport的getText方法例如:<s:text name="%{getText("i18n.label.greetings")}">或者在Action中直接使用。 在沒有指定資源檔的情況下,資源檔的尋找按如下的順序:1)ActionClass.properties2)BaseClass.properties3)Interface.properties4)ModelDriven’s Model5)package.properties6)search up the i18n message key hierarchy itself7)global resource properties 例如有如下結構:com/ acme/ package.properties actions/ package.properties FooAction.java FooAction.properties如果FooAction.properties 檔案不存在,將使用com/acme/action/package.properties,如果 com/acme/action/package.properties檔案不存在,將使用com/acme/ package.properties,如果還不存在,將使用com/ package.properties等等。可以通過getText方法,text標籤或者i18n標籤來訪問資源檔。
可以在struts.properties中通過struts.custom.i18n.resources來指定global的資源綁定。