隨筆-1  評論-68  文章-98  trackbacks-0
          <術語>
          國際化:internationalize,簡稱i18n,是指應用程序可以適應不同語言和地區的變化而變化的方案。
          本地化:localization,檢查l10n,是指應用程序適應某特定語言和地區的過程。

          軟件國際化是軟件發展之必然,幾乎所有的大眾軟件都支持多語言,最常見的就是英文軟件的漢化版。

          Java語言提供了基于unicode的國際化支持。通過Locale對象定義地區、語言、操作系統等信息,調用ResourceBundle的getBundle方法實現資源文件的數據綁定,輕松本地化不同的語言版本。

          通過?ResourceBundle 和 Locale 2個類的定義可以看出 java 讀取資源的流程為:language, country, variant -n-> language, country -n-> language -n-> Locale.getDefault()。

          ResourceBundle.getBundle(String?baseName)
          ResourceBundle.getBundle(String?baseName,?Locale?locale)

          Locale(String?language)
          Locale(String?language,?String?country)
          Locale(String?language,?String?country,?String?variant)

          ResourceBundle 儲存了鍵-值對形式的本地特殊化對象,如String,分為2種:ListResourceBundle和PropertyResourceBundle。

          前者通過.class程序實現,后者通過.properties配置文件實現本地化,樣例如下:

          1、ListResourceBundle Example

          1.1 默認(測試環境為中文)資源類

          /**
          ?*?$File:?Rb.java?????????????$?
          ?*?$Revision:?1.0.0???????????$
          ?*?$?$Date:?2006-8-18?2:12:11?$
          ?
          */

          package?org.anymobile.test;

          import?java.util.ListResourceBundle;

          /**
          ?*?
          ?*?
          @author?Xu?Jianxiang
          ?
          */

          public?class?Rb?extends?ListResourceBundle
          {
          ????
          static?final?Object[][]?contents?=?{
          ????????????
          {?"CHG",?"修改"?},?
          ????????????
          {?"MSG",?"消息"?},?
          ????????????
          {?"BYE",?"再見"?}
          ????}
          ;

          ????
          public?Object[][]?getContents()
          ????
          {
          ????????
          return?contents;
          ????}

          }

          1.2 英文資源類

          /**
          ?*?$File:?Rb_en.java????????$?
          ?*?$Revision:?1.0.0?????????$?
          ?*?$Date:?2006-8-18?2:14:37?$
          ?
          */

          package?org.anymobile.test;

          import?java.util.ListResourceBundle;

          /**
          ?*?
          ?*?
          @author?Xu?Jianxiang
          ?
          */

          public?class?Rb_en?extends?ListResourceBundle
          {
          ????
          static?final?Object[][]?contents?=?{
          ????????????
          {?"CHG",?"change"?},
          ????????????
          {?"MSG",?"message"?},
          ????????????
          {?"BYE",?"bye"?}
          ????}
          ;

          ????
          public?Object[][]?getContents()
          ????
          {
          ????????
          return?contents;
          ????}

          }

          1.3?測試類

          /**
          ?*?$File:?MyListResourceBundle.java?$
          ?*?$Revision:?1.0.0?????????????????$
          ?*?$Date:?2006-8-18?2:24:30?????????$
          ?
          */

          package?org.anymobile.test;

          import?java.util.Locale;
          import?java.util.MissingResourceException;
          import?java.util.ResourceBundle;

          /**
          ?*?Test?java.util.ListResourceBundle
          ?*?
          ?*?
          @author?Xu?Jianxiang
          ?
          */

          public?class?MyListResourceBundle
          {
          ????
          public?static?void?main(?String[]?args?)
          ????
          {
          ????????String?baseName?
          =?"org.anymobile.test.Rb";
          ????????String?key?
          =?"BYE";
          ????????
          try
          ????????
          {
          ????????????ResourceBundle?res?
          =?ResourceBundle.getBundle(?baseName?);
          ????????????System.out.println(?res.getString(?key?)?);
          ????????????
          ????????????res?
          =?ResourceBundle.getBundle(?baseName,?Locale.ENGLISH?);
          ????????????System.out.println(?res.getString(?key?)?);
          ????????}

          ????????
          catch?(?MissingResourceException?exp?)
          ????????
          {
          ????????????exp.printStackTrace();
          ????????}

          ????}

          }

          運行結果:

          再見
          bye

          2、PropertyResourceBundle Example

          2.1 英文配置文件({project}/classes/resources/rb_en.properties)

          #?rb_en.properties

          CHG?=?change
          MSG?=?message
          BYE?=?bye

          2.2 中文配置文件({project}/classes/resources/rb_zn_CN.properties)

          #?rb_zn_CN.properties

          CHG?=?修改
          MSG?=?消息
          BYE?=?再見

          2.3 測試類

          /**
          ?*?$File:?MyResourceBoundle.java?$
          ?*?$Revision:?1.0.0??????????????$?
          ?*?$Date:?2006-8-18?1:19:06??????$
          ?
          */

          package?org.anymobile.test;

          import?java.util.Locale;
          import?java.util.MissingResourceException;
          import?java.util.ResourceBundle;

          /**
          ?*?Test?java.util.PropertyResourceBundle
          ?*?
          ?*?
          @author?Xu?Jianxiang
          ?
          */

          public?class?MyPropResourceBundle
          {
          ????
          public?static?void?main(?String[]?args?)
          ????
          {
          ????????String?baseName?
          =?"resources.rb";
          ????????String?key?
          =?"CHG";

          ????????
          try
          ????????
          {
          //????????????ResourceBundle?res?=?ResourceBundle.getBundle(?baseName,?Locale
          //????????????????????.getDefault()?);
          ????????????ResourceBundle?res?=?ResourceBundle.getBundle(?baseName,?new?Locale("zh","CN","WINDOWS")?);
          ????????????System.out.println(?key?
          +?":?"?+?res.getString(?key?)?);

          ????????????res?
          =?ResourceBundle.getBundle(?baseName,?Locale.ENGLISH?);
          ????????????System.out.println(?key?
          +?":?"?+?res.getString(?key?)?);
          ????????}

          ????????
          catch?(?MissingResourceException?exp?)
          ????????
          {
          ????????????exp.printStackTrace();
          ????????}

          ????}

          }

          運行結果:

          CHG: 改變
          CHG: change

          另外,為了不致于在程序中產生亂碼,可以通過jdk自帶的native2ascii程序將.properties文件從本地編碼轉換成unicode編號格式的數據文件,為避免讀取時因編碼問題而出現亂碼,可以先編寫一個src.txt文件,然后執行指令:native2ascii src.txt dest.properties。轉換后,如“中國”的unicode字符碼為“\u4e2d\u56fd”。
          如果需要將unicode恢復成原編碼,可以執行指令:native2ascii -reverse dest.file src.file。

          每次必須運行native2ascii方法比較繁瑣,實際開發中,可以通過Apache Ant的native2Ascii任務進行批量轉碼。如:<native2ascii encoding="GBK" src="${src}" dest="${build}"/>

          3、Spring 的消息國際化

          org.springframework.context.ApplicationContext繼承了org.springframework.context.MessgeResource接口,通過起getMessage()的各個版本讀取文字消息的資源文件,從而實現消息國際化。

          public interface MessageSource
          {
          String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
          }

          參考資料:

          Java 2 SDK Document
          How to internationalize Java applications(Sun) http://java.sun.com/docs/books/tutorial/i18n/index.html
          ISO Language Code??? http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
          ISO Country Code????? http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
          posted on 2006-08-18 03:42 Xu Jianxiang 閱讀(1078) 評論(0)  編輯  收藏 所屬分類: Java Tech
          主站蜘蛛池模板: 墨玉县| 吉安市| 鄂尔多斯市| 万载县| 湘阴县| 自贡市| 奈曼旗| 绩溪县| 隆安县| 靖西县| 扶余县| 新建县| 无棣县| 洛阳市| 慈溪市| 永泰县| 新民市| 西乡县| 鹿邑县| 南溪县| 株洲市| 邹城市| 偏关县| 璧山县| 营口市| 吉隆县| 奉化市| 甘孜县| 安泽县| 平塘县| 延庆县| 开江县| 静海县| 卢湾区| 阳西县| 施秉县| 互助| 河津市| 页游| 襄垣县| 托克托县|