國際化的操作就是指一個程序可以同時適應(yīng)多門語言,即:如果現(xiàn)在程序者是中國人,則會以中文為顯示文字,如果現(xiàn)在程序的使用者是英國人,則會以英語為顯示的文字,也就是說可以通過國際化操作,讓一個程序適應(yīng)各個國家的語言要求。 程序根據(jù)不同的語言環(huán)境找到不同的資源文件,之后從資源文件中取出內(nèi)容,資源文件中的內(nèi)容都是以key->value的形式保存的,所以在讀取的時候通過其key找到對應(yīng)的value 國際化實現(xiàn)的支持類 如果要想實現(xiàn)java程序的國際化操作必須通過以下的三個類完成: java.util.Locale :用于表示一個國家語言類。 java.util.ResourceBundle:用于訪問資源文件. java.text.MessageFormat:格式化資源文件的占位字符串。 Local類 Local表示的是本地,實際上使用的是一個ISO編碼的封裝類。對于各個國家來說都存在一個唯一的編碼,那么這種編碼就稱為ISO編碼,使用Local可以指定好一個具體的國家編碼。 例如: 中國的編碼:zh_CH 英語-美國的編碼:en-US 法語的編碼:fr-FR ResourceBundle 此類是專門完成屬性文件讀取操作的,讀取的時候直接指定文件名即可(此文件名稱一般不需要指定后綴,后綴同意為*.properties),可以根據(jù)Locale所指定的區(qū)域碼來自動選擇所需要的資源文件。 public static final ResourceBundle getBundle(String baseName) ,此方法就是指定要操作的資源文件,此方法找到的是默認(rèn)的操作系統(tǒng)的語言Locale對象 public static final ResourceBundle getBundle(String baseName,Locale locale),此方法也是指定操作的資源文件,并傳入Locale對象。 public final String getString(String key)根據(jù)key取得對應(yīng)的value 下面通過一道程序來觀察資源文件的使用,以及如何使用ResourceBundle讀取資源文件。 message.properties [java] info=HELLO info=HELLO [java] 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")); } } 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默認(rèn)查找路徑為classpath下,如果不在此路徑下并且為指定完整包路徑名的話將報如下異常 [java] Can't find bundle for base name message, locale zh_CH Can't find bundle for base name message, locale zh_CH java國際化程序?qū)崿F(xiàn) 可以根據(jù)不同的國家輸出不同國家的你好: 中文:你好! 英文:Hello 法語:Bonjour! 分別定義不同的資源文件,此時需要定義出三個資源文件,同時在定義資源文件的時候需要指定好此資源文件對應(yīng)的語言編碼: 中文:Message_zh_CH.properties 英文:Message_en_US.properties 法文:Message_fr_FR.properties Message_zh_CN.properties [java] info=\u4f60\u597d info=\u4f60\u597dMessage_en_US.properties [java] info=Hello info=HelloMessage_fr_FR.properties [java] info=Bonjour info=Bonjour[java] view plaincopyprint?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"); //表示中國地區(qū) Locale enLocale = new Locale("en","US"); //表示美國地區(qū) Locale frLocale = new Locale("fr","FR"); //表示法國地區(qū) 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")); } } 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"); //表示中國地區(qū) Locale enLocale = new Locale("en","US"); //表示美國地區(qū) Locale frLocale = new Locale("fr","FR"); //表示法國地區(qū) 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:以上中文屬性如果是中文的話應(yīng)該將其進行Unicode編碼,這樣可以避免一些系統(tǒng)所帶來的亂碼問題 處理動態(tài)文本 之前的資源文件中的所有內(nèi)容實際上都是固定的,而如果現(xiàn)在有些內(nèi)容,你好,XXX。那么此時就必須在資源文件中進行一些動態(tài)文本的配置,設(shè)置占位符,這些符號中的內(nèi)容暫時不固定,而是在程序執(zhí)行的時候由程序進行設(shè)置的,而要想實現(xiàn)這樣的功能,則必須使用MessageFormat類。此類在java.text包中定義的。 占位符使用(數(shù)字)的形式表示,如果現(xiàn)在表示第一個內(nèi)容“{0}”、第二個內(nèi)容“{1}”依次類推。 在MessageFormat類中主要使用format()方法,此方法定義如下: public static String format(String pattern,Object...arguments) [java] info=\u4f60\u597d{0} info=Hello,{0} info=Bonjour,{0} info=\u4f60\u597d{0} info=Hello,{0} info=Bonjour,{0} [java] 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"); //表示中國地區(qū) Locale enLocale = new Locale("en","US"); //表示美國地區(qū) Locale frLocale = new Locale("fr","FR"); //表示法國地區(qū) 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")); } } 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"); //表示中國地區(qū) Locale enLocale = new Locale("en","US"); //表示美國地區(qū) Locale frLocale = new Locale("fr","FR"); //表示法國地區(qū) 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新特性,可變參數(shù) 在JDK1.5之后java增加了新特性的操作,可以向方法中傳遞可變的參數(shù),以前的定義的方法,實際上里面的參數(shù)都是固定個數(shù)的 [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]+"、"); } } } 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]+"、"); } } } 使用一個類代替資源文件 也可以直接使用一個類來存放所有的資源文件內(nèi)容,但是,此類在操作的時候就必須有一個明顯的注意點,必須繼承ListResourceBundle Message_zh_CN [java] 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.ListResourceBundle; public class Message_zh_CN extends ListResourceBundle { private final Object date[][] = { {"info","你好"} }; @Override protected Object[][] getContents() { // TODO Auto-generated method stub return date; } } 讀取資源類 [java] 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"); //表示中國地區(qū) ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //寫入完整的路徑名 System.out.println(zhRb.getString("info")); } } 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"); //表示中國地區(qū) ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //寫入完整的路徑名 System.out.println(zhRb.getString("info")); } } 不管是資源類還是資源文件,找的時候都是Message,那么如果現(xiàn)在多種資源文件一起出來,那么最終找的是哪一個呢? 實際上此時就需要區(qū)分優(yōu)先級: Message_zh_CN.class Message_zh_CN.properties Message.properties
|