Java中如何實現國際化

假如我們開發了一個在中文環境下運行的頁面,代碼如下:
<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>
 
也許你已經看到了,上述代碼只有文字內容不相同,除此之外完全相同。也許你已經猜到了,現實的代碼絕對不是這樣的。那麼是怎麼處理的呢?
 
 
基本概念
引用
Internationalization 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/u8fce
Msg2 = /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.properties
2)BaseClass.properties
3)Interface.properties
4)ModelDriven’s Model
5)package.properties
6)search up the i18n message key hierarchy itself
7)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的資源綁定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章