熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java程序的國際化和本地化介紹

2013-11-23 19:19:37  來源: Java核心技術 

   本文嘗試用一個簡單的例子來演示在書寫Java應用程序時候怎樣使之符合國際化標准然後對其進行本地化有多麼簡單
  當一個軟件產品需要在全球范圍應用的時候得考慮在不同的地域和語言環境下面的使用情況最簡單的要求就是UI上的信息上能用本地化語言來顯示當然一個優秀的全球化軟件產品關於國際化和本地化的要求遠遠不止於此本文只是涉及了國際化和本地化的關於界面顯示語言的一小部分Java語言內核基於Unicode提供了對不同國家和不同語言文字的內部支持由於先天的原因Java對於國際化的支持遠遠要比C/C++來的優越
  
  在開始具體介紹之前需要先介紹幾個術語
  
  in: 就是internationalization 國際化由於首字母i和末尾字母n間有個字符所以簡稱in internationalization指為了使應用程序能適應不同的語言和地區間的變化而不作系統性的變化所采取的設計措施
  
  ln: 就是localization 本地化由於首字母l和末尾字母n間有個字母所以簡稱ln localization指為了使應用軟件能夠在某一特定語言環境或地區使用而加入本地特殊化部件和翻譯後文本的過程
  
  locale: 簡單來說是指語言和區域進行特殊組合的一個標志
  
  我們的例子顯示一個有一個按鈕和一個菜單的Dialog窗在不改動程序的前提下使應用程能夠顯示英文文字的或者中文文字的界面 注:因為僅僅作為演示用我們的菜單欄也作為一個部件加入對話框好象是一個Button一樣而不是通常意義上的菜單條
  
  通常我們的程序是這樣的:
  
  /**
  
  * File name: inDemojava
  
  * Author ID: Jack at Java discuss board
  
  * Description: Shows a Dialog with a OK button and File/Exit menu
  
  */
  
  import javaxswing*;
  
  import javaawt*;
  
  import javautil*;
  
  public class inDemo {
  
  public static void main(String args[]) throws Exception{
  
  JDialog dialog=new JDialog();
  
  JButton btOK=new JButton();
  
  JMenuBar menuBar=new JMenuBar();
  
  JMenu menuFile=new JMenu();
  
  JMenuItem menuExit=new JMenuItem();
  
  
  btOKsetText(OK);
  
  menuFilesetText(File);
  
  menuExitsetText(Exit);
  
  dialogsetTitle(in Demo);
  
  
  menuBaradd(menuFile);
  
  menuFileadd(menuExit);
  
  dialoggetContentPane()setLayout(new FlowLayout());
  
  dialoggetContentPane()add(btOK);
  
  dialoggetContentPane()add(menuBar);
  
  dialogsetSize();
  
  dialogsetModal(true);
  
  dialogshow();
  
  Systemexit();
  
  }
  
  }
  
  我們通過修改程序來達到in的要求將那些和界面顯示有關系的資源單獨提取出來到資源文件裡面Java裡面的資源文件叫做ResourceBundle它分成兩種一種是ListResourceBundle另一種是PropertyResourceBundle我們這裡使用ListResourceBundle關於PropertyREsourceBundle請參閱文後的推薦閱讀當一個程序需要一些Locale相關的資源例如字符串資源的時候它可以從resource bundle裡面將需要的本地化資源裝入
  
  需要注意的是:為了能夠正確顯示中文字符程序裡的部件需要選擇指定字體例如在顯示中文的時候使用MS Song不然界面有中文字符的時候會出現沒有意義的方框
  
  請看修改過的程序和資源文件
  
  /**
  
  * File name: inDemojava
  
  * Author: Jack at Java discuss board
  
  * Email:
  
  * Description: Shows a Dialog with a OK button and File/Exit menu
  
  * This program made some modifications to fit the requestion of in
  
  */
  
  import javaxswing*;
  
  import javaawt*;
  
  import javautil*;
  
  
  public class inDemo {
  
  public static void main(String args[]) throws Exception{
  
  ResourceBundle res;
  
  if (argslength<) {
  
  //use current locale at machine to get the resource bundle
  
  res = ResourceBundlegetBundle(Res);
  
  }else {
  
  res = ResourceBundlegetBundle(Resnew Locale(args[] args[]));
  
  }
  
  JDialog dialog=new JDialog();
  
  JButton btOK=new JButton();
  
  JMenuBar menuBar=new JMenuBar();
  
  JMenu menuFile=new JMenu();
  
  JMenuItem menuExit=new JMenuItem();
  
  Font font = new Font(resgetString(FontName)FontPLAIN);
  
  btOKsetText(resgetString(OKText));
  
  menuFilesetText(resgetString(FileMenuText));
  
  menuExitsetText(resgetString(FileExitMenuText));
  
  dialogsetTitle(resgetString(DialogTitle));
  
  btOKsetFont(font);
  
  menuFilesetFont(font);
  
  menuExitsetFont(font);
  
  menuBaradd(menuFile);
  
  menuFileadd(menuExit);
  
  dialoggetContentPane()setLayout(new FlowLayout());
  
  dialoggetContentPane()add(btOK);
  
  dialoggetContentPane()add(menuBar);
  
  dialogsetSize();
  
  dialogsetModal(true);
  
  dialogshow();
  
  Systemexit();
  
  }
  
  }
  
  
  /**
  
  * File name: Res_en_USjava
  
  * Author: Jack at Java discuss board
  
  * Email:
  
  * Description: Resource file for inDemojava
  
  */
  
  import javautil*;
  
  public class Res_en_US extends javautilListResourceBundle {
  
  static final Object[][] contents = new String[][]{
  
  { OKText OK }
  
  { FontName Dialoginput }
  
  { FileMenuText File}
  
  { FileExitMenuText Exit}
  
  { DialogTitle Demo Dialog }};
  
  public Object[][] getContents() {
  
  return contents;
  
  }
  
  }
  
  在運行前我們再做一個包含中文資源的資源文件
  
  /**
  
  * File name: Res_zh_CNjava
  
  * Author: Jack at Java discuss board
  
  * Email:
  
  * Description: Resource file for inDemojava
  
  */
  
  import javautil*;
  
  public class Res_zh_CN extends javautilListResourceBundle {
  
  static final Object[][] contents = new String[][]{
  
  { OKText 確定 }
  
  { FontName MS Song }
  
  { FileMenuText 文件}
  
  { FileExitMenuText 退出}
  
  { DialogTitle 演示對話框 }};
  
  public Object[][] getContents() {
  
  return contents;
  
  }
  
  }
  
  先運行來看看結果:
  
  //Run next command step by step
  
  javac *java
  
  java inDemo
  
  java inDemo zh CN
  
  java inDemo en US
  
  可以看到出現了中文界面和英文界面的對話框
  
  具體的看一下程序:
  
  主程序inDemojava多了一個ResourceBundle對象它包含了一個資源文件的信息然後需要使用本地化資源的時候都通過resgetString(KEY)來得到相應的Locale的值通過命令行我們傳入關於語言和國家的代碼這樣在生成ResourceBundle對象的時候可以指向相應的資源文件如果沒有指定Locale那麼在生成ResourceBundle使用的Locale是當前機器上缺省的區域和語言在我的機器上(English WindowsNT )打開Richwin中文平台的時候缺省的locale是中國關閉RichWin的時候Locale是US
  
  資源文件Res_en_USjava裡面包含了英文的界面資源文件名裡的en指英語語言US指國家是美國Res_zh_CNjava是中文的資源文件zh說明語言是中文CN說明國家是中國關於語言和國家的完整對照表可以在參考資源裡找到鏈接
  
  Res_xx_XX類是從ListResourceBundle繼承而
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26670.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.