<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    java國(guó)際化

    Posted on 2007-08-08 15:08 semovy 閱讀(422) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JAVA基礎(chǔ)

    一 介紹

            國(guó)際化(Internationalization設(shè)計(jì)一個(gè)適用于多種語(yǔ)言和地區(qū)的應(yīng)用程序的過(guò)程。適用于多種語(yǔ)言和地區(qū)的含義是當(dāng)使用不同語(yǔ)言及處于不同的地區(qū)的用戶(hù)在使用這個(gè)應(yīng)用程序時(shí),應(yīng)用程序必須使用他們能看懂的語(yǔ)言和符合他們文化習(xí)慣來(lái)顯示信息。國(guó)際化有時(shí)候被簡(jiǎn)稱(chēng)為i18n,因?yàn)橛?8個(gè)字母在國(guó)際化的英文單詞的字母i和n之間。

            一個(gè)國(guó)際化的程序通常具有以下特征:

    • 有一個(gè)附加的本地化數(shù)據(jù)(localized  data)及擁有在全世界各個(gè)地區(qū)執(zhí)行的能力。
    • 文本的元素,比如狀態(tài)信息或GUI截面的lables,不是直接寫(xiě)(hardcoded)在程序中,而是被存儲(chǔ)在本地化的數(shù)據(jù)中,并且能被程序正確的動(dòng)態(tài)的使用。
    • 支持新的語(yǔ)言時(shí),不需要修改程序,不需要重新編譯。
    • 文化差異的數(shù)據(jù),比如日期和貨幣,必須根據(jù)擁護(hù)的語(yǔ)言和習(xí)慣顯示不同的格式。
    • 可以被迅速的本地化。

            本地化(Localization)是指通過(guò)增加本地描述的構(gòu)件(locale-specific components )和文字翻譯工作來(lái)使應(yīng)用程序適應(yīng)于不同的語(yǔ)言和地區(qū)的過(guò)程。本地化有時(shí)候被簡(jiǎn)稱(chēng)為l10n,應(yīng)為有10個(gè)字母在本地化的英文單詞的字母l和n之間。通常本地化最耗時(shí)的工作應(yīng)該是文字翻譯。本地化工作者們要根據(jù)地區(qū)的具體需求來(lái)為日期、數(shù)字和通貨等數(shù)據(jù)建立新的格式。其他類(lèi)型的數(shù)據(jù),象聲音,圖象等,也需要根據(jù)具體需要來(lái)決定是否本地化。

             下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明如何給一個(gè)程序提供國(guó)際化的特性。這個(gè)例子在不同的語(yǔ)言環(huán)境下顯示不同的文本信息。

    一個(gè)簡(jiǎn)單的例子

            先看下面的一段代碼:
        public class NotI18N {
                    static public void main(String[] args) {
                     System.out.println("Hello.");
                     System.out.println("How are you?");
                     System.out.println("Goodbye.");
                 }
             }
        如果你決定在上面的程序中給德國(guó)和法國(guó)的不同用戶(hù)顯示同樣的信息。但是你的程序員卻不是個(gè)語(yǔ)言專(zhuān)家,他不懂德語(yǔ)和法語(yǔ)。所以你需要翻譯人員把它翻譯成德語(yǔ)和法語(yǔ),但是你的翻譯人員不懂程序,所以你可以把這些信息存到一個(gè)文本或其他格式的文件中供翻譯人員使用。那么,程序必須能顯示不同語(yǔ)言的信息,并且你并不知道你希望為這個(gè)程序提供的下一個(gè)語(yǔ)言支持是什么,或許是日語(yǔ)或許是別的什么語(yǔ)言。
        下面的代碼是一個(gè)國(guó)際化的代碼的例子:
             import java.util.*;

             public class I18NSample {
                 static public void main(String[] args) {
                     String language;

    String country;

                     if (args.length != 2) {
                         language = new String("en");
                         country = new String("US");
                     } else {
                         language = new String(args[0]);
                         country = new String(args[1]);
                     }

                     Locale currentLocale;
                     ResourceBundle messages;

                     currentLocale = new Locale(language, country);
                     messages = ResourceBundle.getBundle("MessagesBundle",
                                                            currentLocale);
                     System.out.println(messages.getString("greetings"));
                     System.out.println(messages.getString("inquiry"));
                     System.out.println(messages.getString("farewell"));
                 }
             }
        請(qǐng)注意:在上面的代碼中,信息并沒(méi)有被hardcoded在代碼中!
        如果想運(yùn)行上面的代碼,請(qǐng)下載下面的文件:
        1、I18NSample.java
        2、MessageBundle.properties
        3、MessageBundle_de_DE.properties
        4、MessageBundle_en_US.properties
        5、MessageBundle_fr_FR.properties    
        下面看看這個(gè)程序的運(yùn)行結(jié)果:
        顯示法語(yǔ)信息:
        java I18NSample fr FR
        Bonjour.Comment allez-vous?
        Au revoir.
        顯示英語(yǔ)信息:    
        java I18NSample en US
        Hello.
        How are you?
        Goodbye.

     

        從上面的代碼我們可以看出,在實(shí)現(xiàn)了國(guó)際化的代碼中,并沒(méi)有將需要顯示的信息直接hardcode在代碼中,而是存在一個(gè)文件中供程序使用。程序根據(jù)不同的語(yǔ)言和國(guó)家(Local)來(lái)取得文件中不同信息顯示。我們?cè)囍匆幌碌牟襟E一步一步分析這段代碼如何實(shí)現(xiàn)了國(guó)際化:

        1、建立properties文件----本地化數(shù)據(jù)

         properties文件用來(lái)存儲(chǔ)程序和環(huán)境相關(guān)的信息。必須以.properties的后綴結(jié)尾,properties文件是純文本格式的。在上面的例子中,一共有4個(gè)properties文件。分別定義了不同語(yǔ)言和國(guó)家的打招呼、再見(jiàn)和問(wèn)候時(shí)使用的語(yǔ)言。properties文件使用名值對(duì)(key-value)的形式,如下所示:
         greetings = Bonjour.
         farewell = Au revoir.
         inquiry = Comment allez-vous?
         properties文件的名字很重要,它的形式是basename_LL_CC.properties.LL表示語(yǔ)言代碼,CC表示國(guó)家代碼。語(yǔ)言代碼和國(guó)家代碼是Local類(lèi)初始化的參數(shù),basename是創(chuàng)建ResourceBundle對(duì)象的參數(shù)。

          2、創(chuàng)建Local對(duì)象----不同語(yǔ)言和國(guó)家的標(biāo)識(shí)

            java.util.Local是JDK提供的標(biāo)準(zhǔn)API。這個(gè)類(lèi)用來(lái)標(biāo)識(shí)國(guó)家和語(yǔ)言。
            我們可以創(chuàng)建一個(gè)local對(duì)象:
                     aLocale = new Locale("en","US");
            這個(gè)對(duì)象標(biāo)志了一個(gè)地方,這個(gè)地方是美國(guó),并且這里的語(yǔ)言是英語(yǔ)。
            這下面2個(gè)對(duì)象又表示什么呢?
                    
    caLocale = new Locale("fr","CA");
                      frLocale = new Locale("fr","FR");

            caLocale對(duì)象標(biāo)志的是加拿大并且那里使用了法語(yǔ),而frLocal標(biāo)志的是法國(guó)而那里的語(yǔ)言是法語(yǔ)。
            注意:Local對(duì)象只是一個(gè)標(biāo)識(shí)類(lèi),創(chuàng)建了這個(gè)類(lèi)的對(duì)象并不表示你的程序已經(jīng)實(shí)現(xiàn)了國(guó)際化。這個(gè)類(lèi)是給那些需要實(shí)現(xiàn)國(guó)際化的類(lèi)使用的,它用來(lái)標(biāo)識(shí)我們即將實(shí)現(xiàn)國(guó)際化的Local信息。

             3、創(chuàng)建ResourceBundle對(duì)象----本例中實(shí)現(xiàn)國(guó)際化的主要角色

             java.util.ResourceBundle是JDK提供的標(biāo)準(zhǔn)API。它實(shí)際上是個(gè)抽象類(lèi),同時(shí)它提供了創(chuàng)建它的子類(lèi)的靜態(tài)工廠方法。在例子程序中我們實(shí)際上使用的是ResourceBundle的子類(lèi)PropertyResourceBundle的對(duì)象。通過(guò)它,我們可以根據(jù)Local對(duì)象來(lái)讀取不同的properties文件,從而取得不同的信息。
            如
    果local = new Locale("en","US");則讀取了MessagesBundle_en_US.properties文件。
             在例子中,用如下語(yǔ)句創(chuàng)建這個(gè)對(duì)象:
    message = ResourceBundle.getBundle("MessagesBundle",  currentLocale);

     

           4、用ResourceBundle讀取信息----本地化實(shí)現(xiàn)了

              讀取了propeties文件后,我們就可以用ResourceBundle的實(shí)例通過(guò)getString(String Key)方法來(lái)取得信息了。如下的語(yǔ)句所示:
                      
    String msg1 = messages.getString("greetings");

    結(jié)論:

               如上面的例子所示,實(shí)現(xiàn)國(guó)際化實(shí)際上并不困難。他需要你做一些計(jì)劃,并在程序中加入少量的額外編碼。本章只是簡(jiǎn)介,在后面的章節(jié)中我們會(huì)了解JAVA的更多國(guó)際化的高級(jí)特性。

    主站蜘蛛池模板: 亚洲乱码一区av春药高潮| 日韩内射激情视频在线播放免费| 老汉精品免费AV在线播放| 亚洲国产av玩弄放荡人妇| 日本最新免费不卡二区在线| 亚洲欧洲另类春色校园网站| 99国产精品永久免费视频| 亚洲日产2021三区在线| 国产乱码免费卡1卡二卡3卡| 亚洲中文字幕久久精品无码A| 免费羞羞视频网站| 美景之屋4在线未删减免费| 国产乱子伦精品免费女| 国产国产人免费人成成免视频| 亚洲熟妇无码AV在线播放| 亚洲视频免费在线观看| 亚洲三级在线播放| 亚洲第一页综合图片自拍| a毛片免费在线观看| 亚洲高清视频在线播放| 免费阿v网站在线观看g| 牛牛在线精品免费视频观看| 一区二区亚洲精品精华液| 亚洲免费二区三区| 亚洲一区二区三区四区在线观看| 无码中文在线二区免费| 亚洲免费二区三区| 亚洲AV无码成人精品区日韩 | 亚洲熟妇av一区二区三区漫画| 国产一级淫片a视频免费观看| 成人午夜视频免费| 久久毛片免费看一区二区三区| 亚洲无线一二三四区| 久久精品亚洲综合一品| 在线v片免费观看视频| 亚洲视频免费播放| 一区二区三区免费精品视频| 亚洲国产成人精品无码区在线网站| 亚洲一二成人精品区| 亚洲人成网站在线播放影院在线| 日韩视频免费在线|