1. 程式人生 > 其它 >簡單的Java程式的國際化

簡單的Java程式的國際化

技術標籤:Java語言基本功java程式語言

簡單的Java程式的國際化

以下參考至李剛. 瘋狂Java講義(第5版) 電子工業出版社

一、Java 國際化的簡單說明

  Java 程式的國際化就是將程式中的標籤、提示等資訊放在資原始檔中,程式需要支援哪些國家、語言環境,就對應提供相應的資源 檔案。資原始檔是 key- value 對,每個資原始檔中的 key 不變的 但 value 則隨不同的國家語言而改變。

二、程式國際化的操作

1.編寫資原始檔

 如編寫程式列印hello為例子,中文語言環境下輸出“你好”,英文環境下輸出"Hey"。即Key=hello,value=“你好"或者"Hey”。
 為上面程式提供如下兩個檔案。第一個檔案:mess_ zh_ CN. properties,該檔案的內容為:

#資原始檔的內容是key-value對
hello=你好!

第二個檔案:mess_ en_ US. properties,該檔案的內容為:

#資原始檔的內容是key-value對
hello=Hey!

檔案說明

資原始檔的命名可以有如下三種形式。

➢ baseName_ language_ country. properties


➢ baseName_ language. properties

➢ baseName. properties

其中 baseName 是資原始檔的基本名,使用者可隨意指定;而 language 和 country 都不可隨意變化,必須是 Java 所支援的語言和國家。(具體支援哪些國家可以百度)

從 Java 9 開始, Java 支援 使用 UTF- 8 字元 集 來 儲存 屬性 檔案,這樣在屬性檔案中就可以直接包含非西歐字元,因此屬性檔案也不再需要使用 native2ascii 工具進行處理。唯一 要注意的是,屬性檔案必須顯式儲存為 UTF- 8 字符集。

可以將檔案放入直接專案的src目錄下或者類包下。

2.程式示例

首先匯入類

匯入三個類

import java.util.ResourceBundle;
import java.util.Locale;
import java.text.MessageFormat;

Java 程式的國際化主要通過這三個類完成。
➢ java.util.ResourceBundle:用於載入國家、語言資源包。
➢ java.util.Locale:用於封裝特定的國家/區域、語言環境。
➢ java.text.MessageFormat:用於格式化帶佔位符的字串。

程式碼


public class InterHello {
	public static void main(String[] args) {
		//取得系統預設的國家/語言環境
		var myLocale=Locale.getDefault(Locale.Category.FORMAT );
        //根據指定的國家/語言環境載入檔案資源
		var bundle=ResourceBundle.getBundle("pakegeA.mess",myLocale);
		//列印從資原始檔中取得的訊息
		System.out.println(bundle.getString("hello"));
	}
}

其中
ResourceBundle.getBundle(“pakegeA.mess”,myLocale)
將會載入baseName為mess的系列資原始檔之一,到底載入其中的哪個資原始檔,則取決於myLocale,對於簡體中文的 Locale,則載入mess_zh_CN.properties檔案。
mess檔案如果在專案src的目錄下則不用***.mess來載入,此處是將資原始檔放入了類的裡(包在src目錄下),包名是PackageA,與InterHello類放在一起。同理如果放入其他目錄也可以用 . 來指明路徑。
如圖
在這裡插入圖片描述

3.使用MessageFormat 處理包含佔位符的字串

佔位符的使用在這裡不詳細介紹。
需要使用 MessageFormat 類,該類包含一個有用的靜態方法。 format( String pattern, Object… values):返回後面的多個引數值填充 前面的 pattern 字串,其中pattern字串不是正則表示式,而是一個帶佔位符的字串。
將mess_ zh_ CN. properties檔案內容修改如下

#資原始檔的內容是key-value對
hello=你好! 今天是{0}. 今天天氣是 {1}.

程式碼修改如下

public class InterHello {

	public static void main(String[] args) {
		//取得系統預設的國家/語言環境
		var myLocale=Locale.getDefault(Locale.Category.FORMAT );
        //根據指定的國家/語言環境載入檔案資源
		var bundle=ResourceBundle.getBundle("pakegeA.mess",myLocale);
		
		var msg=bundle.getString("hello");
		System.out.println(MessageFormat.format(msg,new Date(),"大雪"));
	}

}

中文環境執行結果
在這裡插入圖片描述

4.類檔案代替資原始檔

除使用屬性檔案作為資原始檔外,java也允許使用類檔案代替資原始檔,即將所有的key- value對存入class檔案,而不是屬性檔案。使用類檔案來代替資原始檔必須滿足如下條件。
➢該類的類名必須是baseName_ language_ country,這與屬性檔案的命名相似。
➢ 該類 必須 繼承 ListResourceBundle,並重寫getContents()方法,該方法返回Object陣列,該陣列的每一項都是key- value對。下面的類檔案可以代替上面的屬性檔案。

public class messclass_zh_CN extends ListResourceBundle{
	//定義資源
  private final Object myDate[][]=
  {
		  {"hello","你好! 今天是{0}今天天氣是 {1}"}
  };
  //重寫getContents()方法
  public Object[][] getContents()
  {
	  //該方法返回資源key-value對
	  return myDate;
  }
}

測試時,將main函式中"pakegeA.mess"改為"pakegeA.messclass"即可。當然也可以使類名與之前的屬性檔名相同。
如果系統同時存在資原始檔、類檔案,系統將以類檔案為主,而不會呼叫資原始檔。對於簡體中文的 Locale,ResourceBundle搜尋資原始檔的順序是:
(1) baseName_ zh_ CN. class
(2) baseName_ zh_ CN. properties
(3) baseName_ zh. class
(4) baseName_ zh. properties
(5) baseName. class
(6) baseName. properties
系統按上面的順序搜尋資原始檔,如果前面的檔案不存在,才會使用下一個檔案。如果一直找不到對應的檔案,系統將丟擲異常。