說起國際化,第一次接觸的時候感到這個功能很神奇,起初很天真的以為是什么國際通訊之類的功能,其實不是的。。。這個功能用中文叫國際化,英文里就有一個很高大上的稱呼,叫i18n,其實i18n就是internationalization的偷懶寫法,聽起來很有逼格。除了i18n,L10n(localization),g11n(globalization),還有m17n(multilingualization),這些解決方案都是為了能讓站點的頁面能夠適應多國語言,當然,如果有必要的話。
其實多語言問題,Java本身就提供了解決方案,util工具包中ResourceBundle就可以解決該問題,ResourceBundle的說明如下寫道
......
This allows you to write programs that can:
- be easily localized, or translated, into different languages
- handle multiple locales at once
- be easily modified later to support even more locales
...... 顯然,為了能使用國家化,我們需要為每一個需要使用的語言單獨配置他們的語言內容。分別新建中文和英文的語言配置文件置于src下
Message_zh.properties
1 username=\u7528\u6237\u540D(用戶名)
2 password=\u5BC6\u7801(密碼)
Message_en.properties
1 username=username
2 password=password
由于properties只支持iso-8859格式的編碼,所以在輸入中文的時候會有些問題,只是Eclipse自帶的properties編輯器可以進行可視化的文本輸入,不需要關注編碼。另外我們可以通過Java自帶的轉碼工具native2ascii進行轉碼。
測試類如下,
getBundle方法接收兩個參數,第一個是BaseName,可以理解為資源的基礎名,第二個是語言碼,中文是zh,英文是en等等,測試類運行完畢之后會給出英文資源文件中username所對應的值,同理Locale設置為中文則輸出中文的值。所以資源文件我們以Message_en.properties這種格式來命名,其中en之后還可以添加下劃線跟第三個值區域碼,但是一般可以省略。
1 package demo.i18n;
2
3 import java.util.Locale;
4 import java.util.ResourceBundle;
5
6 public class I18nTest {
7
8 public static void main(String[] args) {
9 ResourceBundle rb = ResourceBundle.getBundle("Message", Locale.ENGLISH);
10 System.out.println(rb.getString("username"));
11 }
12
13 }
14
基于上面的內容,struts2使用它們配置全局國際化資源,在struts.xml中添加國家化的配置,其中value就是資源的基礎名
1 <constant name="struts.custom.i18n.resources" value="Message" />
之后,在頁面上使用struts2的標簽進行對應語言內容的顯示,當然,顯示哪種語言需要顯式的將語言碼作為參數傳入,請求地址需要寫作/XXX.action?request_locale=en
1 全局國際化<br/>
2 <s:text name="username"/><br/>
除了全局國際化的配置,struts2還提供了包范圍和action范圍的國際化,其中包范圍的國際化,需要將資源文件命名為“package_語言碼.properties”的形式,然后置于需要的包下,struts2會優先取得較小范圍的國際化資源文件,同時定義全局國際化資源和包國際化資源,那么包范圍的資源會優先生效。至于action范圍的國際化,因為國際化在日常的開發中本來用的就不是很多,就算真的碰到需要雙語開發的情況,或許也是做兩套頁面,或者直接做兩套網站,除非是那種跨國性質的“因特噗啦一吇”,否則不要說struts2的全局國際化的使用,針對包范圍和action范圍的國際化,都是少有問津。