Java 的i18n 問題,即Java 的Internationalization 問題, 指的是如何使應用程序能夠同時支持多種語言的問題。對我國這樣的非英語國家而漢字又有多種編碼方式的情況下具有現實意義。本文將對用java 編制i18n 程序的方法作一介紹。
一、實現目標
作為i18n 程序,不單是能夠識別不同編碼這么簡單。它應能解決如下問題:
。茏R別不同的編碼方式,如GB 碼、BIG5 碼等;
。c編碼有關的元素,如狀態行、消息、按鈕的caption 等應在程序之外存儲。使新增一種語言時不用修改程序;
。鶕煌恼Z言習慣動態調整與語言相關的元素,如數字、金額、日期等的顯示。
二、解決方法
1.?不同地區碼的識別
Java 中用Locale 類識別不同的地區碼。創建Locale 類的實例時指定了語言代碼和地區代碼。創建GB 中文和BIG5 中文資源的Locale 類實例的語句分別如下:zhLocale=new Locale("zh","CN");twLocale=new Locale("tw","TW")。此構造函數第一個參數是ISO -639 中定義的語言代碼(http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt);第二個參數為ISO -3166 中定義的國家代碼(http://www.chemie. fu -berlin.de/diverse/doc/ISO ?3166.html)。當用戶選定了適用的語言后,應將此Locale 設為默認值:Locale.setDefault(new Locale("zh","CN")).
2. 與語言相關的資源單獨存放
Java 提供了兩種方法存放與語言相關的資源。一種是用文本文件;另一種是用ListResourceBundle 資源類。下面分別闡述兩者的不同之處。
。谋疚募
使用文本文件存放資源的好處是簡單易用?梢杂萌魏挝谋揪庉嬈骶帉懘宋募,而且當修改資源時無須重新編譯程序。其格式是´ 鍵= 值´ 的列表。例子如下:
#The list in WebTaxResource_zh_CN.properties
button1= 稅金
button2= 稅率
status1= 初始化中
其中以´ #´ 開頭的行為注釋行。對應每一種語言寫一個這樣的資源文件,但所有的資源文件都必須包含相同的鍵。
。狶istResourceBundle 資源類
雖然用文本文件存儲資源非常容易,但它只能存儲字符對象。而對于數字、自定義對象等它就無能為力了。因此Java 提供了ListResourceBundle 類。其缺點是每次對資源的修改都必須重新編譯程序。此類的結構如下:
//file WebTaxResource_zh_CN.java
import java.util. *;
public class WebTaxResource_zh_CN extends
ListResourceBundle {
static final Object[][] contents = {
{"frametitle"," 工資、薪金所得適用"},
{"label_qizhengdian"," 起征點:"},
{"label_shuikuan"," 稅款:"},
{"label_shourue"," 收入額:"},
{"checkbox_qiushouru"," 求收入"},
{"checkbox_qiushuie"," 求稅額"},
{"lable1"," 簡易稅金計算器"},
{"button1"," 工資、薪金個人所得稅計算"},
{"button_caculate"," 計算"},
};
public Object[][] getContents() {
return contents;
}
}
其中兩維的Object 數組存放的是鍵-值對。每對中的第一個元素是鍵。在各個資源類中所有鍵的數量和標識都必須完全一致。
3. 資源的獲取
不同語言的資源存放的文件名都不相同,那如何從正確的文件取得我們需要的資源呢?留意到前面例子中properties 文件名和ListResourceBundle 類名中下劃線后的部分嗎?沒錯,它們就是在創建Locale 實例時指定的語言代碼和地區代碼!剩下的問題就是要解決下劃線前面的基本類名部分了。它是由一個ResourceBundle 類的實例來指定的:
ResourceBundle
bundle=ResourceBundle.getBundle("WebTax ?
Resource",currentLocale);
getBundle 的第一個參數指定了資源文件和資源類的基本類名;第二個參數是你所創建的Locale 的實例,指定了當前程序所有資源默認的語言代碼和地區代碼。
可見,資源文件名或類名是由" 基本類名_ 語言代碼_ 地區代碼" 組成的。Java 將先查找有無此名稱的類,若沒有則查找具有此名稱的properties 文件。
匹配了正確的資源文件名或類名后,要獲取某鍵對應的值就變得相當容易。例如,要創建標識為" 計算器" 的標簽,只要調用以下語句:
label1=new Label(bundle.getString("label_ jisuanqi"), Label.CENTER);
getString 方法的參數是資源文件中的鍵名。除了getString 外,ResourceBundle 類還提供了其他方法獲取不同的對象,如getStringArray、getObject 等(因為在ListResourceBundle 的實例中允許存在非字符對象)。
4. 轉換非Unicode 資源
在Java 內部字符是用Unicode 字符表示的。Unicode 是一種16bit 的編碼,支持大多數地區的語言。具體標準可到http://www.unicode.org/index.html 查詢。因此,無論是用文本文件還是用資源類的方式存儲資源,都應該將非Unicode 字符轉換為Unicode 字符。Java 為我們提供了轉換的工具-Native2ascii。將含有GB 編碼的漢字的WebTaxResource_zh.CN.properties 文件轉換為只含Unicode 字符的例子如下:
native2ascii -encoding GB2321 WebTaxRe
source_zh_CN.properties
.outputWebTaxResource_zh_CN.properties
到此為止,一個支持i18n 的程序就已初步完成了。
三、其他相關問題
正如實現目標中所講到,支持i18n 的程序不但要識別不同的編碼方式,還要根據不同的語言習慣動態調整與語言相關的元素,如數字、金額、日期等的顯示。例如在法文中數值123456.78 表示為123 456,78;而在德文中應表示為123.456,78。除了數值和貨幣之外,不同語言有不同表示的元素還有日期、時間和文本消息。Java 提供了NumberFormat、DateFormat、MessageFormat 類根據不同的Locale 實例動態改變這些元素的顯示模式。下面的例子將根據不同的Locale 實例改變數值123456.78 的顯示方式。
Double amount = new Double (123456.78);
NumberFormat numberFormatter;
String amountOut;
numberFormatter = NumberFormatgetNumber ?
Instance(currentLocale);
amountOut = numberFormatter.format
(amount);
System.out.println(amountOut +" " +
currentLocale.toString());
當然,實現Java 程序的i18n 還有很多問題要考慮,如不同語言的語法問題等。但在Java 中,遇到問題多看看聯機文檔或其他相關的資料,一般都能得到滿意的答案。 (中國計算機報 蘇志成)
文章來源于領測軟件測試網 http://www.kjueaiud.com/
版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
技術支持和業務聯系:info@testage.com.cn 電話:010-51297073
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月