00 10Java高級之國際化程序實現

1 國際化程序實現原理

所謂的國際化程序指的是同一個程序代碼可以根據不同的國家實現不同的語言描述,但是程序處理的核心業務是相同的。

現在假設有一款世界都認可的企業管理平臺,那麼這個企業的老闆決定將這個產品推廣到全世界各個大型的上市公司,這些公司可能來自於:中國、美國、德國,那麼在這樣的情況下,首先要考慮的問題是什麼?

通過分析可以發現,如果要想實現國際化的程序開發,那麼要解決的問題就在於以下兩點:
(1)如何可以定義保存文字的文件信息;
(2)如果可以根據不同的區域語言編碼讀取指定的資源信息。

2 Locale類

通過分可以發現,如果要想實現國際化,那麼首先需要解決的就是不同國家用戶的區域和語言編碼問題,而在java.util包裏面提供有一個專門描述區域和語言編碼的類:Locale類。
(1)構造方法:public Locale​(String language)
(2)構造方法:public Locale​(String language, String country)
此時需要的是國家和語言的代碼,而中文的代碼:zh_CN、美國英語的代碼:en_US,對於這些區域和語言的編碼最簡單的獲得方式就是可以通過IE瀏覽器獲得。
範例:實例化Locale類對象


	public static void main(String[] args) {
		Locale loc = new Locale("zh", "CN");
		System.out.println(loc);
	}

如果要想自動獲得當前的運行環境,那麼現在就可以利用Locale類本身默認的方式進行實例化。
(1)讀取本地默認環境:public static Locale getDefault()

public static void main(String[] args) {
		Locale loc = Locale.getDefault();
		System.out.println(loc);
	}

在實際開發過程之中,很多人可能並不關心國家和語言的編碼,所以爲了簡化開發,Locale類也將世界上一些比較著名的國家的編碼設置爲常量。

使用常量的優勢在於可以避免一些區域編碼信息的繁瑣。

3 ResourceBundle讀取資源文件

現在已經準備好了資源文件,那麼隨後就需要進行資源文件的讀取操作了,而讀取資源文件主要依靠的是java.util.ResourceBundle類完成,此類定義如下:

public abstract class ResourceBundle extends Object

ReosurceBundle是一個抽象類,如果要想進行此對象的實例化可以直接利用該類中提供的一個static方法完成。
(1)獲取ResourceBundle類對象:public static final ResourceBundle getBundle​(String baseName)
|——baseName:描述的是資源文件的名稱,但是沒有後綴
(2)根據Key讀取資源內容:public final String getString​(String key)
範例:使用ResourceBundle類讀取內容

package cn.victor.demo;

import java.util.Locale;
import java.util.ResourceBundle;

public class DateDemo {

	public static void main(String[] args) {
		ResourceBundle rb = ResourceBundle.getBundle("Messages");
		String val = rb.getString("info");
		System.out.println(val);
	}
}


如果資源沒有放在包裏面,則直接編寫資源名稱即可。

資源找不到出現的異常
Exception in thread "main" java.util.MissingResourceException: 
Can't find bundle for base name Messsages, locale zh_CN

在進行資源數據讀取的時候,數據key一定要存在,如果不存在則會出現如下異常信息:

Exception in thread "main" java.util.MissingResourceException: 
Can't find resource for bundle java.util.PropertyResourceBundle, key infos

4 實現國際化程序開發

現在國際化程序的前期準備已經全部完成了,也就是說依靠資源文件、Locale、ResourceBundle類就可以實現國際化處理操作,那麼下面來進行國際化的程序實現(核心關鍵:讀取資源信息)。
(1)在CLASSPATH中建立:包名鏈.properties配置文件名(中文資源);
(2)在CLASSPATH中建立:包名鏈.properties配置文件名(英文資源);
加上沒有默認的區域的資源文件,一共定義了三個資源;
(3)通過程序進行指定區域的資源信息加載

此時在利用ResourceBundle類讀取資源的時候並沒有設置一個明確的Locale對象,但是發現“Messages_zh_CN”文件起作用了,因爲這個方法裏面默認加載的就是當前本地的Locale資源:

(4)如果現在有需要也可以修改當前的Locale環境,則可以使用ResourceBundle類中的如下方法:
|——獲取ResouceBundle對象:

package cn.victor.demo;

import java.util.Locale;
import java.util.ResourceBundle;

public class DateDemo {

	public static void main(String[] args) {
		Locale loc = Locale.getDefault();
		ResourceBundle rb = ResourceBundle.getBundle("Messages", loc);
		String val = rb.getString("info");
		System.out.println(val);
	}
}


如果現在有指定區域的資源文件存在的時候,那麼沒有設置區域的資源文件的信息將不會被讀取。
讀取順序:讀取指定區域的資源文件>默認的本地資源>公共的資源(沒有區域設置的)

5 格式化文本顯示

如果說現在某一位用戶登錄成功了,那麼一般都會顯示這樣的信息“XXX,歡迎您的光臨!”,也就是說,這個時候會顯示用戶名,那麼此時如果這些內容保存在了資源文件裏面,則就需要通過佔位符來進行描述,同時對於讀取出來的數據也需要進行消息格式化處理。
範例:修改資源文件
(1)中文資源文件:#註釋信息 info=歡迎{0}的訪問
(2)英文資源文件:
如果有需要則可以繼續添加”{1}“、“{2}”之類的內容;
此時如果要進行資源讀取則會將佔位符的信息一起讀取出來,所以此時就需要利用MessageFormat類進行格式化處理。
在MessageFormat類中提供有一個格式化文本的方法:public static String format​(String pattern, Object... arguments)

範例:格式化文本實現國際化

package cn.victor.demo;

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

public class DateDemo {

	public static void main(String[] args) {
		Locale loc = Locale.getDefault();
		ResourceBundle rb = ResourceBundle.getBundle("Messages", loc);
		String val = rb.getString("info");
		String str = MessageFormat.format(val, "lks", "love hhy");
		System.out.println(str);
	}
}


如果在日後開發過程之中見到資源文件裏面出現有的結構表示的都是佔位符,該信息一定都要進行格式化處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章