軟件在開發時要能使它同時應對世界不同地區和國家的使用,針對不同地區和國家的訪問,提供相應的,符合使用者閱讀習慣的操作環境,這就必須要有國際化的概念,國際化又稱為“i18n”:internationalization。
國際化要能使靜態數據和動態數據都能做到符合國際化的需求,本篇先講述如何使靜態數據滿足國際化需求,再下一篇文章中再講訴如何使動態數據做到國際化。
對軟件或頁面中的靜態數據要想做到國際化,必須滿足一下兩個步驟:
① 將這些靜態數據編寫到一個properties文件中,比如說取名為“resource.properties”,作為默認資源配置文件。接着可以根據不同的國家或者語言環境來再次編寫不同的properties文件,比如編寫resource_zh.properties和resource_en.properties文件。
注意,編寫默認資源配置文件之后的不同properties文件中,內容使用的關鍵字要和最開始編寫的“resource.properties”文件內使用的關鍵字相同。請看例1。
最開始編寫的properties文件名稱為“基名”,比如上述中的“resource”,其他的properties根據該基名並編寫不同國家和語言的配置文件,這一組properties統稱為一個資源包。
“zh”和“en”分別代表不同的語言編碼,這一點請看上一篇博客《Java描述語言、國家和地理的類——Locale》。這些語言編碼在編寫不同國家語言的properties文件時必須的。
資源文件內容和Map集合一樣(因為Property就是Map集合的子類),采用“關鍵字=值”的方式,在默認資源配置文件中定義的關鍵字,在其他不同資源文件中都必須相同,而其他不同資源文件中的關鍵字的值使用不同語言的文字。如果在資源配置文件中使用到了中文,請使用Unicode碼(JDK提供了轉換工具native2ascii,請看博客《使用JDK自帶的工具將中文轉換為ascii碼》)。
② 使用Java的ResourceBundle類對象來代表描述一個資源包。通過使用該類的靜態方法getBundle,傳入參數為某資源包的基名,可以也可以不傳入一個代表國家或語言的Locale對象。
通過上述方法獲得的對象,在資源包中如果找不到與制定語言環境匹配的資源配置環境,會找和語言環境相近的資源文件,如果還找不到,那么就會使用默認資源配置文件(如上述的resource.properties)。
通過ResourceBundle實例對象的getString(String key)方法就能獲取對應資源文件中指定關鍵字的值了。
例1:
創建一個工程,因為資源包中資源個數可能會很多,並且為了某組資源包不和其他組資源包累積在一起,因此我們使用一個包將該組資源包封裝,並定義一個默認資源文件,基名為“MessageResource”,同時創建另外兩個分別對應中文和英文的資源文件(記住,語言編碼或國家編碼一定要有):

在默認資源配置文件“MessageResource.properties”文件中,定義資源文件使用的關鍵字,當然在默認資源配置文件中關鍵字的值是作為如果無法找到匹配資源文件才使用的,這里我選擇英文:

而對應的中文資源文件MessageResource_zh.properties的內容為:

其實在MyEclipse中properties文件的另一個界面是這樣的:

而在英文資源文件MessageResource_en.properties中內容和默認資源文件內容是一樣的,這里就不再重復貼出。
配置好資源文件后,我們就可以在工程中使用,我們新建一個demo,然后通過ResourceBundle的getBundle()這個靜態方法來獲取代表資源文件的對象:
1 public class Demo1 { 2 3 public static void main(String[] args) { 4 ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", Locale.CHINESE); 5 String username = bundle.getString("username"); 6 System.out.println(username); 7 } 8 }
在getBundle方法中,第一個參數必須使用的是資源包基名,不帶文件后綴名,同時因為我們將資源包放在包中,所以必須要有完整名稱(如果不放在包中而直接放在【src】目錄下只需要基名即可);該方法的第二個參數是指定使用的語言或國家環境,通過這個參數ResourceBundle能自動識別和使用資源包中的哪個資源文件。這里我選擇的是中文環境,因此程序執行效果如下:

如果使用的是英文的語言環境,那么只需要將Locale對象換成英文的即可,對於上面的代碼只需要修改成:
ResourceBundle bundle =
ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", Locale.ENGLISH);
那么程序執行效果就會如下:

例2:在JSP頁面上根據來訪者的地區或國家來進行國際化顯示:
在web工程中,根據Request請求對象中的getLocale()方法可以獲取來訪者的國家、地區或語言環境的Locale對象,那么我們就可以使用ResourceBundle對象指定頁面中顯示的語言文字了:
資源文件和存入的包名與例1相同,這里就省略步驟了,在JSP頁面上模擬國際化(真實開發時使用國際化標簽或自定義標簽封裝Java代碼):
1 <body> 2 <% 3 Locale locale = request.getLocale(); 4 ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", locale); 5 %> 6 7 <form action="" method="post"> 8 <%=bundle.getString("username") %><input type="text" name="username"> <br> 9 <%=bundle.getString("password") %><input type="password" name="password"> <br> 10 </form> 11 </body>
在瀏覽器中觀察效果:

另外如果想在JSP頁面中能有超鏈接來選擇何種語言,那么只需要來超鏈接后面添加請求參數來指定語言環境即可,在例2中補充:
1 <a href="${pageContext.request.contextPath}/login.jsp?language=zh"> 2 中文 3 </a> 4 <a href="${pageContext.request.contextPath}/login.jsp?language=en"> 5 english 6 </a> 7 8 9 <% 10 String language = request.getParameter("language"); 11 if(language==null) { 12 language = "zh"; 13 } 14 Locale locale = new Locale(language); 15 ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", locale); 16 %>
在瀏覽器中觀察效果:

