电竞比分网-中国电竞赛事及体育赛事平台

分享

JAVA的國(guó)際化

 昵稱22369024 2015-05-02

國(guó)際化的操作就是指一個(gè)程序可以同時(shí)適應(yīng)多門(mén)語(yǔ)言,即:如果現(xiàn)在程序者是中國(guó)人,則會(huì)以中文為顯示文字,如果現(xiàn)在程序的使用者是英國(guó)人,則會(huì)以英語(yǔ)為顯示的文字,也就是說(shuō)可以通過(guò)國(guó)際化操作,讓一個(gè)程序適應(yīng)各個(gè)國(guó)家的語(yǔ)言要求。

 

程序根據(jù)不同的語(yǔ)言環(huán)境找到不同的資源文件,之后從資源文件中取出內(nèi)容,資源文件中的內(nèi)容都是以key->value的形式保存的,所以在讀取的時(shí)候通過(guò)其key找到對(duì)應(yīng)的value

 

國(guó)際化實(shí)現(xiàn)的支持類

如果要想實(shí)現(xiàn)java程序的國(guó)際化操作必須通過(guò)以下的三個(gè)類完成:

java.util.Locale :用于表示一個(gè)國(guó)家語(yǔ)言類。

java.util.ResourceBundle:用于訪問(wèn)資源文件.

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

 

Local類

Local表示的是本地,實(shí)際上使用的是一個(gè)ISO編碼的封裝類。對(duì)于各個(gè)國(guó)家來(lái)說(shuō)都存在一個(gè)唯一的編碼,那么這種編碼就稱為ISO編碼,使用Local可以指定好一個(gè)具體的國(guó)家編碼。

例如: 中國(guó)的編碼:zh_CH 

            英語(yǔ)-美國(guó)的編碼:en-US

            法語(yǔ)的編碼:fr-FR

 

ResourceBundle

此類是專門(mén)完成屬性文件讀取操作的,讀取的時(shí)候直接指定文件名即可(此文件名稱一般不需要指定后綴,后綴同意為*.properties),可以根據(jù)Locale所指定的區(qū)域碼來(lái)自動(dòng)選擇所需要的資源文件。

public  static  final  ResourceBundle  getBundle(String  baseName) ,此方法就是指定要操作的資源文件,此方法找到的是默認(rèn)的操作系統(tǒng)的語(yǔ)言Locale對(duì)象

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

public  final  String  getString(String  key)根據(jù)key取得對(duì)應(yīng)的value

下面通過(guò)一道程序來(lái)觀察資源文件的使用,以及如何使用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下,如果不在此路徑下并且為指定完整包路徑名的話將報(bào)如下異常

[java]  Can't find bundle for base name message, locale zh_CH 

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

java國(guó)際化程序?qū)崿F(xiàn)

可以根據(jù)不同的國(guó)家輸出不同國(guó)家的你好:

中文:你好!

英文:Hello

法語(yǔ):Bonjour!

分別定義不同的資源文件,此時(shí)需要定義出三個(gè)資源文件,同時(shí)在定義資源文件的時(shí)候需要指定好此資源文件對(duì)應(yīng)的語(yǔ)言編碼:

中文: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");   //表示中國(guó)地區(qū)  
        Locale enLocale = new Locale("en","US");   //表示美國(guó)地區(qū)  
        Locale frLocale = new Locale("fr","FR");   //表示法國(guó)地區(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");   //表示中國(guó)地區(qū)
  Locale enLocale = new Locale("en","US");   //表示美國(guó)地區(qū)
  Locale frLocale = new Locale("fr","FR");   //表示法國(guó)地區(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)該將其進(jìn)行Unicode編碼,這樣可以避免一些系統(tǒng)所帶來(lái)的亂碼問(wèn)題

 

處理動(dòng)態(tài)文本

之前的資源文件中的所有內(nèi)容實(shí)際上都是固定的,而如果現(xiàn)在有些內(nèi)容,你好,XXX。那么此時(shí)就必須在資源文件中進(jìn)行一些動(dòng)態(tài)文本的配置,設(shè)置占位符,這些符號(hào)中的內(nèi)容暫時(shí)不固定,而是在程序執(zhí)行的時(shí)候由程序進(jìn)行設(shè)置的,而要想實(shí)現(xiàn)這樣的功能,則必須使用MessageFormat類。此類在java.text包中定義的。

占位符使用(數(shù)字)的形式表示,如果現(xiàn)在表示第一個(gè)內(nèi)容“{0}”、第二個(gè)內(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");   //表示中國(guó)地區(qū)  
        Locale enLocale = new Locale("en","US");   //表示美國(guó)地區(qū)  
        Locale frLocale = new Locale("fr","FR");   //表示法國(guó)地區(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");   //表示中國(guó)地區(qū)
  Locale enLocale = new Locale("en","US");   //表示美國(guó)地區(qū)
  Locale frLocale = new Locale("fr","FR");   //表示法國(guó)地區(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ù)都是固定個(gè)數(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]+"、");
  }
 }
}

使用一個(gè)類代替資源文件

也可以直接使用一個(gè)類來(lái)存放所有的資源文件內(nèi)容,但是,此類在操作的時(shí)候就必須有一個(gè)明顯的注意點(diǎn),必須繼承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");   //表示中國(guó)地區(qū)  
        ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //寫(xiě)入完整的路徑名  
        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");   //表示中國(guó)地區(qū)
  ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //寫(xiě)入完整的路徑名
  System.out.println(zhRb.getString("info"));
 }
}

 

不管是資源類還是資源文件,找的時(shí)候都是Message,那么如果現(xiàn)在多種資源文件一起出來(lái),那么最終找的是哪一個(gè)呢?

實(shí)際上此時(shí)就需要區(qū)分優(yōu)先級(jí):

Message_zh_CN.class

Message_zh_CN.properties

Message.properties


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多