<術語>
國際化: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?=?bye2.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.htmlISO Language Code???
http://www.ics.uci.edu/pub/ietf/http/related/iso639.txtISO 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