JDK 软件国际化概述
JDK 軟件國際化概述
簡介
修改日期:98 年 10 月 5 日
全球化的互聯網要求全球化的軟件 - 即,軟件可以獨立于用戶的國家或語言進行開發,然后可以進行多個國家和地區的本地化。JDK(全稱 Java Development Kit,即 Java 開發工具包)軟件提供大量開發全球化應用程序的 API(應用程序接口)。這些國際化 API 基于 Unicode 2.0 字符編碼,可以使文本、數字、日期、貨幣和用戶定義的對象適合任意國家的習慣。
本文總結了國際化 API 和 JDK 軟件的功能。有關編碼示例和詳細指導的信息,參見 Java 教程。API 的詳細信息,參見 Java 平臺 API 規范。
有關其它信息,參見 JDK 國際化主頁。
Locale
在 Java 平臺中,locale 僅僅是語言和地區的某種組合的標識符。它不是與 locale 有關的屬性的集合。每個對 locale 敏感的類都保存它自己的與 locale 有關的信息。這樣,用戶和系統對象對自己的與 locale 有關的資源進行保存的方式是沒有差別的。它們都使用標準本地化機制。
Java 程序不指定某一全球化 locale。所有對 locale 敏感的操作都可以明確指定 locale 作為其參數。這大大簡化了多語言程序。雖然不強制指定全球化 locale,但那些不希望明確管理 locale 的程序仍可使用缺省 locale。缺省 locale 也可以用一次選擇去影響全部表示。
Java locale 充當來自另一對象的對某種行為的請求。例如,傳入 Calendar 對象的法語區加拿大 locale 要求 Calendar 正確操作以符合魁北克的習慣。對象應該接受 locale 的要求并作出正確反應。如果對象尚未對某一 locale 進行本地化,它將試圖找到一個與之“最接近”匹配的已本地化的 locale。因此,如果 Calendar 對象尚未針對法語區加拿大進行本地化,但通常已有法語的本地化版本,則它將使用法語本地化。
Locale 類
Locale 對象表示某一特定的地理、政治或文化區域。需要 locale 執行其任務的操作稱為對 locale 敏感的操作,該操作使用 Locale 對象為用戶提供適當信息。例如,顯示數字是一種對 locale 敏感的操作 - 數字應根據用戶的國家、地區或文化的習慣和風俗進行格式化。
對象表示某一特定的地理、政治或文化區域。需要 locale 執行其任務的操作稱為對 locale 敏感的操作,該操作使用 Locale 對象為用戶提供適當信息。例如,顯示數字是一種對 locale 敏感的操作 - 數字應根據用戶的國家、地區或文化的習慣和風俗進行格式化。
支持的 Locale
在 Java 平臺中,不需有一個受支持的 locale 的單個集合,因為每個類都有其自己的本地化。盡管如此,仍有一個 JDK 軟件類支持的本地化集合。Java 平臺的其它實現可以支持不同的 locale。JDK 軟件支持的 Locale 在網頁支持的 Locale 中進行了總結。JDK 軟件的以后版本還會包括其它 locale。
本地化資源
所有對 locale 敏感的類必須能夠訪問為它們支持的
locale 而定制的資源。在本地化過程中,它幫助將這些資源按 locale 分組,
并與程序中與 locale 無關的部分分開。
ResourceBundle 類
類 ResourceBundle 是抽象基本類,表示資源的容器。程序員創建 ResourceBundle 的子類,其中包含特定 locale 的資源。可以將新資源添加到 ResourceBundle 的實例中,或將 ResourceBundle 的新實例添加到系統中,而不影響使用它們的代碼。將資源包裝為類可以使開發人員能夠利用 Java 的類加載機制來查找資源。
資源包包含與 locale 有關的對象。當程序需要與 locale 有關的資源(例如 String 對象)時,該程序可以從當前用戶的 locale 對應的資源包中加載它。用這種方式使程序員編寫的代碼可以在很大程度上擺脫用戶 locale 的限制,而用戶 locale 同資源包中的大部分(若非全部)與 locale 有關的信息是隔離的。
因此,Java 程序員編寫的代碼可以:
方便地進行本地化或被翻譯為不同語言
一次處理多個 locale
易于修改,以便支持更多的 locale
ListResourceBundle 類
ListResourceBundle 是 ResourceBundle 的抽象子類,在一個便利并易于使用的列表中管理某一 locale 的資源。
是 ResourceBundle 的抽象子類,在一個便利并易于使用的列表中管理某一 locale 的資源。
PropertyResourceBundle 類
PropertyResourceBundle 是 ResourceBundle 的具體子類,它用屬性文件中的靜態字符串集來管理某一 locale 的資源。
是 ResourceBundle 的具體子類,它用屬性文件中的靜態字符串集來管理某一 locale 的資源。
日歷和時區支持
JDK 軟件的 1.0 版引入了 java.util.Date 類表示日期和時間。java.util.Date 類允許將日期解釋為年、月、日、小時、分鐘和秒等值,并且對日期字符串進行格式化和解析。但是,這些功能的 API 卻不支持國際化。JDK 軟件的 1.1 版僅保留了該類的“表示”部分。
在 JDK 軟件的 1.1 版,Date 類應僅僅被用作日期或時間的 wrapper。這就是說,Date 對象以毫秒的精度表示時間的某一特定時刻。但是,程序員應使用 Calendar 類在日期和時間域之間進行轉換,并使用 DateFormat 類來對日期字符串進行格式化和解析。JDK 軟件 1.0 版中 Date 類的相應方法已廢棄。
Calendar 類
類 Calendar 是抽象基本類,它可以在時間的某一點(從 1970 年 1 月 1 日 00:00:00 GMT 起表示為毫秒)和表示年、月、星期等的整數集之間進行轉換。GregorianCalendar 是 Calendar 的具體子類,它根據羅馬日歷的規則進行這種轉換。
Calendar 及其子類可用于對時間值的不同處理。可以在 Calendar 對象的域上執行算法,然后確定所得日期。Calendar 對象可以產生對某一種語言和日歷風格實現日期-時間格式化時所需的所有時間域值。
TimeZone 類
抽象類 TimeZone 封裝了 UTC(世界標準時間)的時區偏移量和可能的夏時制的偏移量。類 SimpleTimeZone 是具體子類,它封裝了一些關于夏時制的簡單規則。這些規則不考慮影響夏時制的法則的歷史變化。Calendar 類及其子類使用 TimeZone 和 SimpleTimeZone 類在本地時間和 UTC 之間進行轉換,UTC 是 Date 對象所用的內部表示。大部分程序都無需直接處理 TimeZone 對象。
格式化
許多文化習慣都要求格式化輸出數據。數字、日期、時間和消息在顯示前可能都需要格式化。Java 平臺提供一系列靈活的格式化類,既可處理標準 locale 格式,也可處理程序員自定義的格式。這些格式化類也可以將已格式化字符串解析為組成它們的對象。
Format 類
類 Format 是抽象基本類,負責格式化對 locale 敏感的信息,例如日期、時間、消息和數字。它提供了三個主要子類: DateFormat、NumberFormat 和 MessageFormat。這三個子類也有自己的子類。
DateFormat 類
日期和時間在內部以獨立于 locale 的方式存儲,但為了以對 locale 敏感的方式顯示,必須格式化。例如,同一日期應被格式化為:
November 3, 1997(英語)
3 novembre 1997(法語)
類 DateFormat 是抽象基本類,以獨立于 locale 的方式對日期和時間值進行格式化和解析。它有許多靜態工廠方法來獲得給定 locale 的標準時間格式。
DateFormat 對象使用 Calendar 和 TimeZone 對象來解釋時間值。在缺省情況下,給定 locale 的 DateFormat 對象將使用該 locale 的相應 Calendar 對象和系統缺省的 TimeZone 對象。程序員如果愿意,可以覆蓋這些選項。
SimpleDateFormat 類
類 SimpleDateFormat 是具體類,以對 locale 敏感的方式對日期和時間進行格式化和解析。它允許格式化(毫秒到文本)、解析(文本到毫秒)和標準化。
DateFormatSymbols 類
類 DateFormatSymbols 用來封裝可進行本地化的日期-時間格式數據,例如月名、星期名、一天中的時間和時區數據。DateFormat 和 SimpleDateFormat 類都使用 DateFormatSymbols 類來封裝該信息。
程序員通常不直接使用 DateFormatSymbols。他們用 DateFormat 類的工廠方法實現格式化。
NumberFormat 類
類 NumberFormat 是抽象基本類,用來對數字數據進行格式化和解析。它有許多靜態工廠方法來獲得不同的與 locale 有關的數字格式。
NumberFormat 類有助于程序員對任意 locale 的數字進行格式化和解析。使用該類的代碼可以完全獨立于小數點、千分位符、特殊的十進制數字,甚至與數字格式是否為十進制也完全無關。應用程序也可以以標準十進制數字、貨幣或百分比的形式顯示數字:
1234.5(十進制數字)
$1,234.50(美國貨幣)
Fr1.234,5(法語貨幣)
123450%(百分比)
DecimalFormat 類
數字在內部以獨立于 locale 的方式存儲,但為了以對 locale 敏感的方式顯示,必須格式化。例如,當使用“#,###.00”形式時,同一數字可格式化為:
1.234,56(德語)
1,234.56(英語)
類 DecimalFormat 是 NumberFormat 類的具體子類,可以格式化十進制數字。程序員通常并不直接實例化該類,而是用它提供的工廠方法。
DecimalFormat 類可以根據模式字符串指定如何格式化數字。模式指定屬性,例如數字的精確度,是否顯示前導零以及使用什么貨幣符號。如果程序需要創建自定義格式,則可以更改模式字符串。
DecimalFormatSymbols 類
類 DecimalFormatSymbols 表示 DecimalFormat 用來格式化數字的符號集(例如十進制分隔符、分組分隔符等)。DecimalFormat 從它的 locale 數據中為自己創建 DecimalFormatSymbols 的實例。需要更改這些符號的程序員可以從 DecimalFormat 對象中獲得 DecimalFormatSymbols 對象,然后修改它。
ChoiceFormat 類
類 ChoiceFormat 是 NumberFormat 類的具體子類。ChoiceFormat 類允許程序員對一系列數字應用格式。它通常在 MessageFormat 對象中用于處理多于倆個數字的情況。有關詳細信息,參見下面的“MessageFormat 類”一節。
MessageFormat 類
程序經常需要根據一個字符串、數字和其它數據的序列來構建消息。例如,顯示磁盤驅動器中文件數量的消息文本是不同的:
磁盤 C 包含 100 個文件。
磁盤 D 包含 1 個文件。
磁盤 F 包含 0 個文件。
如果根據字符串和數字順序構建的消息已進行硬編碼,則它不能再翻譯成其它語言。例如,注意參數“3”和“G”在以下譯文中的位置:
The disk G contains 3 files. (英語)
Il y a 3 fichiers sur le disque G.(法語)
類 MessageFormat 提供了一種方法,以獨立于語言的方式產生連續消息。MessageFormat 對象接受一組對象,將其格式化,然后將已格式化的字符插入模式中的相應位置。
ParsePosition 類
Format 類及其子類使用類 ParsePosition,以在解析過程中跟蹤當前位置。Format 類中的 parseObject() 方法需要將 ParsePosition 對象作為參數。
FieldPosition 類
Format 及其子類使用 FieldPosition 類來標識格式化輸出中的域。Format 類中有一種版本的 format() 方法需要將 FieldPosition 對象作為參數。
對 Locale 敏感的字符串操作
程序經常需要操作字符串。在字符串上的普通操作包括搜索和排序。某些任務(例如整理字符串或查找文本中的不同邊界)很難正確完成,而當需要考慮多種語言時就更為困難。JDK 軟件提供了一些類,可以以對 locale 敏感的方式處理許多普通字符串操作。
Collator 類
Collator 類執行對 locale 敏感的字符串的排序操作。程序員使用該類構建自然語言文本的搜索和按字母順序排序例程。Collator 是抽象基本類。它的子類實現特定排序原則。JDK 軟件當前提供的一個子類 RuleBasedCollator 適用于多種語言。可以創建其它子類來處理更特定的需求。
類執行對 locale 敏感的字符串的排序操作。程序員使用該類構建自然語言文本的搜索和按字母順序排序例程。Collator 是抽象基本類。它的子類實現特定排序原則。JDK 軟件當前提供的一個子類 RuleBasedCollator 適用于多種語言。可以創建其它子類來處理更特定的需求。
RuleBasedCollator 類
RuleBasedCollator 類是 Collator 類的具體子類,提供一個簡單的,數據驅動的表排序類。程序員可以使用 RuleBasedCollator 創建自定義的基于表的排序類。例如,程序員可以構建一個排序類,使它忽略(或考慮)大寫字母、重音和 Unicode 組合字符。
類是 Collator 類的具體子類,提供一個簡單的,數據驅動的表排序類。程序員可以使用 RuleBasedCollator 創建自定義的基于表的排序類。例如,程序員可以構建一個排序類,使它忽略(或考慮)大寫字母、重音和 Unicode 組合字符。
CollationElementIterator 類
CollationElementIterator 類可作為迭代器,在國際化字符串的每個字符之間移動。程序員使用迭代器返回已定位字符的優先順序。字符或關鍵字的優先順序定義如何在給定 Collator 對象中排序字符。RuleBasedCollator 類的 compare() 方法使用 CollationElementIterator 類。
類可作為迭代器,在國際化字符串的每個字符之間移動。程序員使用迭代器返回已定位字符的優先順序。字符或關鍵字的優先順序定義如何在給定 Collator 對象中排序字符。RuleBasedCollator 類的 compare() 方法使用 CollationElementIterator 類。
CollationKey 類
CollationKey 對象表示一個遵循特定 Collator 對象規則的字符串。對兩個 CollationKey 對象的比較返回它們所代表的字符串的相對順序。用 CollationKey 對象來比較字符串通常比使用 Collator.compare() 方法快。因此,當必須對字符串進行多次比較時(例如排序一列字符串時),使用 CollationKey 對象更為有效。
對象表示一個遵循特定 Collator 對象規則的字符串。對兩個 CollationKey 對象的比較返回它們所代表的字符串的相對順序。用 CollationKey 對象來比較字符串通常比使用 Collator.compare() 方法快。因此,當必須對字符串進行多次比較時(例如排序一列字符串時),使用 CollationKey 對象更為有效。
BreakIterator 類
BreakIterator 類間接實現在文本字符串中查找以下類型邊界的位置的方法:
類間接實現在文本字符串中查找以下類型邊界的位置的方法:可能的換行符
句
單詞
字符
各種語言中,行、句、單詞和字符如何結束的習慣不同。因為 BreakIterator 類對 locale 敏感,所以程序可以使用它執行文本操作。例如,考慮一個字處理程序,它可以高亮顯示字符、剪切單詞、將光標移動到下一句或在行末折詞。這種字處理程序使用分隔迭代器來確定文本中的邏輯邊界,使它可以以對 locale 敏感的方式執行文本操作。
StringCharacterIterator 類
StringCharacterIterator 類可以在 Unicode 字符串中雙向移動。該類使用光標在一段文本內移動,可以返回各個字符或其索引值。StringCharacterIterator 類實現 CharacterIterator 接口的字符迭代器功能。
類可以在 Unicode 字符串中雙向移動。該類使用光標在一段文本內移動,可以返回各個字符或其索引值。StringCharacterIterator 類實現 CharacterIterator 接口的字符迭代器功能。
CharacterIterator 接口
CharacterIterator 接口定義在 Unicode 字符中雙向移動的協議。如果某些類要在一段文本內移動,并返回各個 Unicode 字符或其索引值,則應實現此接口。用于搜索的 CharacterIterator 執行字符搜索時有用。
接口定義在 Unicode 字符中雙向移動的協議。如果某些類要在一段文本內移動,并返回各個 Unicode 字符或其索引值,則應實現此接口。用于搜索的 CharacterIterator 執行字符搜索時有用。
字符集轉換
Java 平臺使用 Unicode 作為其本地字符編碼;但是許多 Java 程序仍需處理以其它編碼方式存在的文本數據。因此,Java 提供了一組類,它可以在許多標準字符編碼和 Unicode 之間來回轉換。需要處理非 Unicode 文本數據的 Java 程序通常將數據轉換為 Unicode,以 Unicode 方式處理數據,然后再將結果轉換回外部字符編碼。InputStreamReader 和 OutputStreamWriter 類提供的方法可以在其它字符編碼和 Unicode 之間進行轉換。
支持的編碼
InputStreamReader、OutputStreamWriter 和 String 類可以在 Unicode 和網頁支持的編碼中列出的以下字符編碼之間進行轉換。
AWT 屬性
為了更好地進行程序 GUI 的國際化,JDK 軟件為 Component 類提供這兩個屬性: Name 和 Locale。
Name 屬性
Name 屬性是 String 對象,它是 Component 對象的非本地化標識符。Component 類及其子類的新構造函數允許設置 Name 屬性。如果不使用這些構造函數,則缺省 Name 將被分派給 Component 對象。可以使用 Component.getName() 方法檢查 Component 對象的 Name 屬性。
Name 屬性在編寫 Action 處理例程時特別有用,在該類例程中無法提前知道對目標的引用。這種 Action 處理程序通常由 GUI 構造器生成。以前,這些例程試圖通過查看目標 Component 的標簽字符串來標識它。標簽字符串被本地化后,這種方法即失敗。象 JDK 軟件的 1.1 版一樣,程序員應代替使用 Component.getName() 方法。
Locale 屬性
Component 類現在包含 Locale 屬性。該屬性由方法 getLocale() 和 setLocale()methods 訪問。如果 Component 對象的 Locale 未明確設置,其值缺省為 Component 對象的父類的 Locale。如果層次中沒有帶明確 Locale 的 Component,缺省為 Locale.getDefault() 的值。
Component 的 Locale 屬性允許 GUI(或 GUI 的一部分)保持它自己的缺省 locale。這會是很有用的,例如,瀏覽器的其它部分使用 American locale 而 applet 仍可使用 Japanese locale。
流 I/O
JDK 軟件在 java.io 包中提供改善字符日期處理的功能: 新的 Reader 和 Writer 類,以及 PrintStream 類的增強功能。
Reader 和 Writer 類
Reader 和 類集合可以在字符流上執行 I/O 操作。這些集合將 InputStream 和 OutputStream 類層次并行起來,但在字符流上操作,而不是在字節流上操作。字符流使編寫不依賴于特定字符編碼的程序更容易,因此更易于國際化。Reader 和 Writer 類也可以在 Unicode 和其它字符編碼之間進行轉換。有關 Reader 和 Writer 類層次的詳細信息,參見文檔。
和 類集合可以在字符流上執行 I/O 操作。這些集合將 InputStream 和 OutputStream 類層次并行起來,但在字符流上操作,而不是在字節流上操作。字符流使編寫不依賴于特定字符編碼的程序更容易,因此更易于國際化。Reader 和 Writer 類也可以在 Unicode 和其它字符編碼之間進行轉換。有關 Reader 和 Writer 類層次的詳細信息,參見文檔。
PrintStream 類
PrintStream 已增強為使用系統缺省字符編碼和行終止符產生輸出。這種變化允許諸如 System.out.println() 的方法對非 ASCII 數據執行更為合理的操作。
已增強為使用系統缺省字符編碼和行終止符產生輸出。這種變化允許諸如 System.out.println() 的方法對非 ASCII 數據執行更為合理的操作。
字符分類
Java 平臺以 Unicode(一種國際字符集標準)方式存儲字符數據。Unicode 標準使用 16 位編碼支持世界各地的所有主要字符集,也包括通用技術符號。大部分 Java 代碼是用 ASCII(7 位標準)或 ISO-Latin-1(8 位標準)編寫的,但在處理前都轉換為 Unicode。因此,Java 字符集總是由 Unicode 表示。
JDK 軟件的 1.0 版引入了 Character 類作為字符基本類型的對象 wrapper。Character 類也包含一些諸如 isLowerCase() 和 isDigit() 的靜態方法,以便確定字符的屬性。這套方法已在 JDK 軟件的 1.1 版中作了擴展,能夠允許訪問所有 Unicode 2.0 定義的字符屬性。
輸入法
因為中文、日語和韓國語的字符集很大,所以對它們作鍵盤映射是不可行的。為在應用程序中輸入文本,用戶經常使用稱為輸入法的前端工具。輸入法允許用戶預先制作亞洲字符集,然后送入應用程序中。
術語“輸入法”指的不是 Java 編程語言中的類方法。主機平臺(例如 Solaris 或 Windows)提供對輸入法的支持。JDK 軟件的當前版本 (1.2.0) 不包含輸入法的引擎。
在與 JDK 軟件的 1.1 版兼容的版本中,用戶可以使用輸入法在 TextField 和 TextArea AWT 組件中輸入文本。
Swing 中的 on-the-spot 輸入支持
JDK 軟件的 1.2 版通過輸入法框架支持 on-the-spot(內聯)編輯。 on-the-spot 編輯是輸入法的一種功能,它允許用戶直接將文本輸入到文本域中。當用戶用 on-the-spot 編輯輸入文本時,輸入法將文本直接插入文本組件中。應用程序開發人員不必協調輸入法和文本組件之間的動作。當文本組件被啟用來進行 on-the-spot 編輯時,JDK 軟件處理所需的協調工作。但是,當必須提交所有文本時(例如保存或打印文檔時),開發人員應調用 InputContext.endCompostion。InputContext 類是輸入法框架中的一部分。
輸入法框架
輸入法框架是 JDK 軟件的 1.2 版所提供的一組 API。輸入法框架啟用文本編輯組件來與輸入法交互。開發文本編輯組件的程序員應使用輸入法框架。應用程序開發人員通常不使用輸入法框架。但是,當必須提交所有文本時(例如保存或打印文檔時),應用程序開發人員應調用 InputContext.endCompostion。
輸入法框架網頁中包含與規范和 API 文檔的鏈接。
總結
以上是生活随笔為你收集整理的JDK 软件国际化概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT战略职业规划
- 下一篇: 软件测试项目交付,成功交付离岸项目的三个