1. 程式人生 > >java學習筆記12--國際化

java學習筆記12--國際化

例如 html 我們 源文件 所有 cti csdn 配置 文件中

國際化的操作就是指一個程序可以同時適應多門語言,即:如果現在程序者是中國人,則會以中文為顯示文字,如果現在程序的使用者是英國人,則會以英語為顯示的文字,也就是說可以通過國際化操作,讓一個程序適應各個國家的語言要求。

技術分享圖片

程序根據不同的語言環境找到不同的資源文件,之後從資源文件中取出內容,資源文件中的內容都是以key->value的形式保存的,所以在讀取的時候通過其key找到對應的value

國際化實現的支持類

如果要想實現java程序的國際化操作必須通過以下的三個類完成:

java.util.Locale :用於表示一個國家語言類。

java.util.ResourceBundle:用於訪問資源文件.

java.text.MessageFormat:格式化資源文件的占位字符串。

Local類

Local表示的是本地,實際上使用的是一個ISO編碼的封裝類。對於各個國家來說都存在一個唯一的編碼,那麽這種編碼就稱為ISO編碼,使用Local可以指定好一個具體的國家編碼。

例如: 中國的編碼:zh_CH

英語-美國的編碼:en-US

法語的編碼:fr-FR

ResourceBundle

此類是專門完成屬性文件讀取操作的,讀取的時候直接指定文件名即可(此文件名稱一般不需要指定後綴,後綴同意為*.properties),可以根據Locale所指定的區域碼來自動選擇所需要的資源文件。

public static final ResourceBundle getBundle(String baseName) ,此方法就是指定要操作的資源文件,此方法找到的是默認的操作系統的語言Locale對象

public static final ResourceBundle getBundle(String baseName,Locale locale),此方法也是指定操作的資源文件,並傳入Locale對象。

public final String getString(String key)根據key取得對應的value

下面通過一道程序來觀察資源文件的使用,以及如何使用ResourceBundle讀取資源文件。

message.properties

info=HELLO

package com.itmyhome;

import java.util.ResourceBundle;

public class T {
	public static void main(String[] args) throws Exception{
		ResourceBundle rb = ResourceBundle.getBundle("message");
		System.out.println(rb.getString("info"));
	}
}


PS:message.properties默認查找路徑為classpath下,如果不在此路徑下並且為指定完整包路徑名的話將報如下異常

Can‘t find bundle for base name message, locale zh_CH

java國際化程序實現

可以根據不同的國家輸出不同國家的你好:

中文:你好!

英文:Hello

法語:Bonjour!

分別定義不同的資源文件,此時需要定義出三個資源文件,同時在定義資源文件的時候需要指定好此資源文件對應的語言編碼:

中文:Message_zh_CH.properties

英文:Message_en_US.properties

法文:Message_fr_FR.properties

Message_zh_CN.properties

info=\u4f60\u597d

Message_en_US.properties

info=Hello

Message_fr_FR.properties

info=Bonjour
package com.itmyhome;

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

public class T {
	public static void main(String[] args) throws Exception{
		Locale zhLocale = new Locale("zh","CN");   //表示中國地區
		Locale enLocale = new Locale("en","US");   //表示美國地區
		Locale frLocale = new Locale("fr","FR");   //表示法國地區
		ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
		ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
		ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
		System.out.println(zhRb.getString("info"));
		System.out.println(enRb.getString("info"));
		System.out.println(frRb.getString("info"));
	}
}


PS:以上中文屬性如果是中文的話應該將其進行Unicode編碼,這樣可以避免一些系統所帶來的亂碼問題

處理動態文本

之前的資源文件中的所有內容實際上都是固定的,而如果現在有些內容,你好,XXX。那麽此時就必須在資源文件中進行一些動態文本的配置,設置占位符,這些符號中的內容暫時不固定,而是在程序執行的時候由程序進行設置的,而要想實現這樣的功能,則必須使用MessageFormat類。此類在java.text包中定義的。

占位符使用(數字)的形式表示,如果現在表示第一個內容“{0}”、第二個內容“{1}”依次類推。

在MessageFormat類中主要使用format()方法,此方法定義如下:

public static String format(String pattern,Object...arguments)

info=\u4f60\u597d{0}
info=Hello,{0}
info=Bonjour,{0}


package com.itmyhome;

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

public class T {
	public static void main(String[] args) throws Exception{
		Locale zhLocale = new Locale("zh","CN");   //表示中國地區
		Locale enLocale = new Locale("en","US");   //表示美國地區
		Locale frLocale = new Locale("fr","FR");   //表示法國地區
		ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
		ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
		ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
		System.out.println(MessageFormat.format(zhRb.getString("info"), "itmyhome"));
		System.out.println(MessageFormat.format(enRb.getString("info"), "itmyhome"));
		System.out.println(MessageFormat.format(frRb.getString("info"), "itmyhome"));
	}
}


java新特性,可變參數

在JDK1.5之後java增加了新特性的操作,可以向方法中傳遞可變的參數,以前的定義的方法,實際上裏面的參數都是固定個數的

package com.itmyhome;

public class T {
	public static void main(String[] args) throws Exception{
		fun("java","c++",".net");
		fun("itmyhome");
	}
	public static void fun(Object...args){
		for (int i = 0; i < args.length; i++) {
			System.err.println(args[i]+"、");
		}
	}
}

使用一個類代替資源文件

也可以直接使用一個類來存放所有的資源文件內容,但是,此類在操作的時候就必須有一個明顯的註意點,必須繼承ListResourceBundle

Message_zh_CN

package com.itmyhome;

import java.util.ListResourceBundle;

public class Message_zh_CN extends ListResourceBundle {

	private final Object date[][] = {
			{"info","你好"}
	};
	@Override
	protected Object[][] getContents() {
		// TODO Auto-generated method stub
		return date;
	}
}


讀取資源類

package com.itmyhome;

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

public class T {
	public static void main(String[] args) throws Exception{
		Locale zhLocale = new Locale("zh","CN");   //表示中國地區
		ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //寫入完整的路徑名
		System.out.println(zhRb.getString("info"));
	}
}



不管是資源類還是資源文件,找的時候都是Message,那麽如果現在多種資源文件一起出來,那麽最終找的是哪一個呢?

實際上此時就需要區分優先級:

Message_zh_CN.class

Message_zh_CN.properties

Message.properties

總結:國際化程序實現的思路:程序與顯示相分離,根據不同的Locale指定的區域找到不同的資源文件並根據其key取得對應的value

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

java學習筆記12--國際化