關(guān)于Java用戶界面本地化實(shí)例探索

          國(guó)際化是使程序具有足夠的靈活性、能在世界上任何地區(qū)運(yùn)行的過程。國(guó)際化所要求的必然結(jié)果是地方化――使一個(gè)程序能夠運(yùn)行在特定地區(qū)的過程。本文嘗試用一個(gè)簡(jiǎn)單的例子來演示Java用戶界面本地化。Java語(yǔ)言內(nèi)核基于Unicode3.0(Java 1.4)提供了對(duì)不同國(guó)家和不同語(yǔ)言文字的內(nèi)部支持,由于先天的原因,Java對(duì)于國(guó)際化的支持遠(yuǎn)遠(yuǎn)要比C/C++來的優(yōu)越。
            
            在我看來本地化必須滿足以下的三個(gè)條件:
            
            1、程序必須能讀、寫和操作本地化的文本。
            
            2、程序在顯示日期和時(shí)間、使數(shù)字格式化以及排序子串時(shí),必須符合地方習(xí)慣。(通過java.text包里面的類可以實(shí)現(xiàn)這些要求)
            
            3、所有用戶可見的文本都能在運(yùn)行時(shí)獲得,而不是直接寫入程序中。(通過java.util包里的ResourceBundle類和他的子類可以實(shí)現(xiàn)這些要求。)
            
            實(shí)現(xiàn)這三個(gè)方面可以真正實(shí)現(xiàn)程序的國(guó)際化。
            
            首先讓我們來了解一下地區(qū)。地區(qū)代表一個(gè)地理上、政治上或文化上的區(qū)域。在Java中,地區(qū)由java.util.Locale類表示。地區(qū)常常以一種語(yǔ)言來定義,該語(yǔ)言則由其標(biāo)準(zhǔn)的小寫雙字母代碼表示。(例如:en代表英國(guó),fr代表法國(guó),zh代表中國(guó)),但有時(shí)候語(yǔ)言是不能代表一個(gè)地區(qū)的,那就要在語(yǔ)言后面再加上一個(gè)國(guó)家或該國(guó)家的地域(例如:en_US代表美國(guó),zh_TW)。Locale類保存著一個(gè)靜態(tài)的默認(rèn)地區(qū),它可以用Locale.setDefault()和Locale.getDefault()來設(shè)置和查詢。一個(gè)程序可以生成和使用任意數(shù)目的非默認(rèn)Locale對(duì)象。
            
            讓我們?cè)賮砜匆幌耈nicode字符編碼。Java使用Unicode的字符編碼,其本身就是邁向國(guó)際化的一大步。Unicode編碼其每個(gè)字符都占兩個(gè)字節(jié)。用\u****的形式表示。Unicode的字符可以等價(jià)于其他編碼的字符(例如:從\u0020到\u007E的字符等價(jià)于ASCII和ISO8859-1字符的0x20到0x7E)。
            
            本文主要是對(duì)用戶界面地方化,由于我使用的是資源束!所以有必要對(duì)資源束作一下解釋。
            
            為定義一束地方化的資源,你需要生成一個(gè)ResourceBundle(資源束)的子類并且提供handleGetObject()和getKeys()方法的定義。為了在程序中使用來自ResourceBundle的地方化資源,就需要先調(diào)用靜態(tài)的getBundle()方法,用getBundle()獲得一個(gè)ResourceBundle對(duì)象,然后再用getObject()方法去按照名字來查找資源。當(dāng)然也可以使用getString()簡(jiǎn)單的把getObject()的返回值分配給一個(gè)String對(duì)象。GetBundle()方法采用basename_language_country_variait----沒找到的話->basename_language_country----沒找到的話->basename_language----沒找到的話->basename(默認(rèn)資源文件)的算法尋找合適的資源。如果以上都沒找到的話,則會(huì)拋出一個(gè)MissingResourceException異常。
            
            現(xiàn)在我們來看一個(gè)簡(jiǎn)單的例子,如何使Java程序用戶界面地方化的。
            
            首先我們的程序需要查找特定Locale對(duì)象關(guān)聯(lián)的資源包,所以應(yīng)該定義一個(gè)Local對(duì)象,來獲取本地默認(rèn)的地區(qū)!然后可以調(diào)用ResourceBundle的getBundle方法,并將locale對(duì)象作為參數(shù)傳入。
            
            清單一:
            
            Locale locale = Locale.getDefault(); //獲取地區(qū):默認(rèn)
            //獲取資源束。如未發(fā)現(xiàn)則會(huì)拋出MissingResourceException異常
            ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
            
            清單一中的”Properties.Dorian”代表Properties包下以Dorian命名的默認(rèn)資源文件。這樣就可以使用資源文件了!讓我們來看看資源文件是如何定義的。
            
            清單二:
            
            # Dorian.properties是默認(rèn)的"Dorian"資源束文件。
            # 作為中國(guó)人,我用自己的地區(qū)作為默認(rèn)
            
            Title=\u4e2d\u56fd;
            red.label=\u7ea2\u8272;
            green.label=\u7eff\u8272;
            blue.label=\u84dd\u8272;
            
            清單三:
            
            # 文件Dorian_en_US.properties,是美國(guó)地區(qū)的資源束
            # 它覆蓋了默認(rèn)資源束
            
            Title=America;
            red.label=Red;
            green.label=Green;
            blue.label=Blue ;
            
            清單一和二定義了一個(gè)默認(rèn)資源文件,和美國(guó)地區(qū)的資源文件。其中等號(hào)左邊的字符串表示主鍵,它們是唯一的。為了獲得主鍵對(duì)應(yīng)的值,你可以調(diào)用ResourceBundle類的getString方法,并將主鍵作為參數(shù)。此外,文件中以“#”號(hào)開頭的行表示注釋行。需要注意的是清單二中的“\u4e2d\u56fd”,它是字符“中國(guó)”的Unicode字符碼。是使用Java自帶的native2ascii工具轉(zhuǎn)換的(native2ascii in.properties out.properties),這是為了不在程序界面中產(chǎn)生亂碼。
            
            清單四:
            
            cmdRed.setText(bundle.getString("red.label"));
            cmdBlue.setText (bundle.getString("blue.label"));
            cmdGreen.setText (bundle.getString("green.label"));
            
            清單二中的cmdRed、cmdBlue、cmdGreen 為按鈕。bundle.getString("red.label")為得到資源文件中主鍵是red.label的值。
            
            好了到此為止Java程序用戶界面的本地化就是這么簡(jiǎn)單。不過,要提醒你的是在為用戶界面事件編寫事件監(jiān)聽器代碼時(shí),要格外小心。請(qǐng)看下面這段代碼。
            
            清單五:
            
            public class MyApplet extends Japplet implements ActionListener{
            public void init(){
            JButton cancelButton=new JButton(“Cancel”);
            CancelButton.addActionListener(this);
            ...
            }
            
            public void actionPerformed(ActionEvent e){
            String s=e.getActionCommand();
            if(arg.equals(“Cancel”);
            doCancel();
            else ……
            }
            }
            
            如果你對(duì)清單五的代碼不進(jìn)行本地化,她就可能會(huì)運(yùn)行的很好。但當(dāng)你的按鈕被本地化為中文時(shí),“Cancel”變?yōu)榱恕叭∠薄_@時(shí)就會(huì)出現(xiàn)你不愿意看到的問題。下面有三個(gè)方法可以消除這個(gè)潛在的問題!
            
            1> 使用內(nèi)部類而不使用獨(dú)立的actionPerformed程序。
            
            2> 使用引號(hào)而不使用標(biāo)簽來標(biāo)識(shí)組件。
            
            3> 使用name屬性來標(biāo)識(shí)組件
            
            本例稍后的代碼就是采用第一種方法來消除這個(gè)問題的。
            
            清單六:完整的代碼
            
            //:MyNative.java
            
            /**
            Copyright (c) 2003 Dorian. All rights reserved
            @(#)MyNative.java 2003-12-21
            @author Dorian
            @version 1.0.0
            visit http://www.Dorian.com/Java/
            */
            
            import java.awt.*;
            import java.awt.event.*;
            import javax.swing.*;
            import java.util.*;
            
            /**
            這是一個(gè)將Java程序界面地方化的例子本例采用讀取屬性文件來達(dá)到目的
            @see java.util.Locale;
            @see java.util.ResourceBundle;
            @see java.util.MissingResourceException;
            */
            
            public class MyNative{
            public static void main(String[] args){
            JFrame frame = new MyNativeFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
            frame.setVisible(true); // Pop the window up.
            }
            }
            
            class MyNativeFrame extends JFrame{
            public MyNativeFrame(){
            Locale locale = Locale.getDefault();//獲取地區(qū):默認(rèn)
            //獲取資源束。如未發(fā)現(xiàn)則會(huì)拋出MissingResourceException異常
            //"Properties.Dorian"為在Properties下以Dorian為文件名的默認(rèn)屬性文件
            ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
            setTitle(bundle.getString("Title"));//通過getString()的返回值來設(shè)置Title
            setSize(WIDTH,HEIGHT); // Set the window size.
            panel=new MyNativePanel();
            Container contentPane=getContentPane();
            contentPane.add(panel);
            
            //通過獲取資源束中*.label的值對(duì)三個(gè)按鈕設(shè)置其Label
            
            panel.setCmdRed(bundle.getString("red.label"));
            panel.setCmdBlue(bundle.getString("blue.label"));
            panel.setCmdGreen(bundle.getString("green.label"));
            }
            
            private MyNativePanel panel;
            private static final int WIDTH=400;
            private static final int HEIGHT=100;
            }
            
            class MyNativePanel extends JPanel{
            public MyNativePanel(){
            layout=new BorderLayout();
            setLayout(layout);
            
            txt=new JTextField(50);
            add(txt,layout.CENTER);
            cmdRed=new JButton();
            cmdBlue=new JButton();
            cmdGreen=new JButton();
            panel.add(cmdRed);
            panel.add(cmdBlue);
            panel.add(cmdGreen);
            add(panel,layout.SOUTH);
            cmdRed.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            String s = e.getActionCommand();
            txt.setBackground(Color.red);
            txt.setText(s);
            }
            });
            
            cmdBlue.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            String s = e.getActionCommand();
            txt.setBackground(Color.blue);
            txt.setText(s);
            }
            });

          posted on 2006-05-25 17:40 software5168 閱讀(368) 評(píng)論(1)  編輯  收藏

          評(píng)論

          # re: 關(guān)于Java用戶界面本地化實(shí)例探索 2006-05-25 18:44 pc

          http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=20064615519 javaBean與EJB區(qū)別 http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=200646151043 JavaBeans 程序開發(fā)從入門到精通教程 http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=20064614542 Java實(shí)現(xiàn)ftp功能(源程序)  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          JAVA學(xué)習(xí)網(wǎng)站

          綜合

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 江西省| 托克托县| 体育| 修文县| 喀什市| 广西| 鄂伦春自治旗| 林口县| 荥阳市| 延长县| 保山市| 南和县| 哈巴河县| 娄烦县| 龙泉市| 铁力市| 嘉黎县| 博爱县| 大同县| 阳江市| 荃湾区| 聊城市| 靖边县| 宜兴市| 东乡族自治县| 萨嘎县| 麦盖提县| 潜江市| 乳山市| 清远市| 汕尾市| 桂东县| 黔江区| 内乡县| 淮阳县| 抚州市| 突泉县| 内丘县| 芦山县| 内乡县| 牡丹江市|