引言
今天小編聽到了一個詞:國際化。現在全球都要多元化了,所以程序國際化也是順勢而出的……(ps:其實這個早就有了,小編也是硬扯到一起的!)
國際化簡介
國際化的英文爲Internationalization,這個也太長了,所以它又稱爲I18n(英文單詞 internationalization的首末字符i和n,18爲中間的字符數)。
除了i18n還有L10n(localization),g11n(globalization),還有m17n(multilingualization)
它們的區別是:
- i18n支持多種語言,但是同一時間只能是英文和一種選定的語言,例如英文+中文、英文+德文、英文+韓文等等;
- L10n(localization),支持2種語言,英文和另外一種語言(例如中文);
- g11n(globalization),簡單的理解可以認爲g11n = i18n + L10n。
- m17n(multilingualization)可以在同一時間支持多種語言,例如你可以在一個頁面裏看到中文、英文、德文和韓文。
國際化的操作就是指一個程序可以同時適應多門語言,即:如果現在程序者是中國人,則會以中文爲顯示文字,如果現在程序的使用者是美國人,則會以英語爲顯示的文字,也就是說可以通過國際化操作,讓一個程序適應各個國家的語言要求。由此可知,國際化是java的必要元素呀!
原理
程序根據不同的語言環境找到不同的資源文件,之後從資源文件中取出內容,資源文件中的內容是以key-àvalue的形式保存的,所以在讀取的時候通過其key找到對應的value.
國際化實現的支持類
如果想要實現java程序的國際化操作必須通過以下的三個類完成:
1.Java.util.Locale:用於表示一個國家語言類
2.Java.util.ResourceBundle:用於訪問資源文件
3.Java.text.MessageFormat:格式化資源文件的佔位字符串
Locale類
Locale表示的是本地,實際上使用的是ISO編碼的封裝類。對於各個國家來說都存在一個唯一的編碼,那麼這種編碼就成爲ISO編碼,使用Locale以指定好一個具體的國家編碼。
例如: 中國的編碼:zh_CH
英語的編碼:en-US
ResourceBundle類
這個類是專門完成屬性文件讀取操作的,讀取的時候直接指定文件名即可(此文件名稱一般不需要指定後綴名,統一爲*.properties),可以更具Locale所指定的區域碼來自動選擇所需要的資源文件。
方法:
1. Public static final ResourceBundlegetBundle(String baseName)//此方法就是指定要操作的資源文件,此方法找到的是默認的操作系統的語言Locale對象
2.Public staticfinal ResourceBundle getBundle(String baseName,Local locale)//此方法也是指定操作的資源文件,並傳入Locale對象
3.Public finalString getString(String key)根據key取得對應的value
MessageFormat類
如果想出現“你好,XXX”的效果,就必須在資源文件中進行一些動態文本的配置,設置佔位符,這些符號中的內容暫時不固定,而是在程序執行的時候由程序進行設置的,而要想實現這樣的功能,則必須使用MessageFormat類。此類在java.text包中定義的。
佔位符使用數字的形式表示,如果現在表示第一個內容”{0}”、第二個內容”{1}”……
Demo
1、首先建一個java類
package com.bjpowernode.i18n;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class I18nSample {
public static void main(String[] args){
Locale defaultLocale = Locale.getDefault();
System.out.println("country="+ defaultLocale.getCountry());
System.out.println("language="+ defaultLocale.getLanguage());
Locale currentLocale = new Locale("en","CN");
ResourceBundle rb = ResourceBundle.getBundle("MessageBundle",defaultLocale);
MessageFormat mf = new MessageFormat(rb.getString("k1"));
System.out.println(mf.format(new Object[]{"張三"}));
}
}
2、建立國際化資源文件(這裏我們建立一箇中文的,一個英文的)
MessageBundle_zh_CN.properties
k1=\u4F60\u597D,{0}
k2=\u518D\u89C1
k1就是“你好”,k2就是“再見”,上面使用的是unicode。可以使用Unicode的轉換器來進行轉換,也可以使用命令,這裏就給讀者自己一個研究的機會吧……
MessageBundle_en_US.properties
k1=hello,{0}
k2=good bye
3、效果
當我們的本機是中文的時候,去讀取中文的國際化資源文件:
當我們的本機調成英文的時候,去讀取英文的國際化資源文件:
擴展
struts國際化配置:
1、在struts-config.xml文件中加入<message-resources parameter="MessageResources"/>
2、提供國際化資源文件
3、在jsp中採用<bean:message>讀取國際化消息文本
總結
國際化的知識雖然只是入了門,但是感覺這個思想還是很重要的!以後我們做的東西要靈活,對着中國人說中國話,對着外國人說外國話!