溫故知新:struts2_07其他功能:國(guó)際化
說(shuō)起國(guó)際化,第一次接觸的時(shí)候感到這個(gè)功能很神奇,起初很天真的以為是什么國(guó)際通訊之類(lèi)的功能,其實(shí)不是的。。。這個(gè)功能用中文叫國(guó)際化,英文里就有一個(gè)很高大上的稱(chēng)呼,叫i18n,其實(shí)i18n就是internationalization的偷懶寫(xiě)法,聽(tīng)起來(lái)很有逼格。除了i18n,L10n(localization),g11n(globalization),還有m17n(multilingualization),這些解決方案都是為了能讓站點(diǎn)的頁(yè)面能夠適應(yīng)多國(guó)語(yǔ)言,當(dāng)然,如果有必要的話(huà)。其實(shí)多語(yǔ)言問(wèn)題,Java本身就提供了解決方案,util工具包中ResourceBundle就可以解決該問(wèn)題,ResourceBundle的說(shuō)明如下寫(xiě)道
......
This allows you to write programs that can:
顯然,為了能使用國(guó)家化,我們需要為每一個(gè)需要使用的語(yǔ)言單獨(dú)配置他們的語(yǔ)言?xún)?nèi)容。分別新建中文和英文的語(yǔ)言配置文件置于src下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
Message_zh.properties
1 username=\u7528\u6237\u540D(用戶(hù)名)
2 password=\u5BC6\u7801(密碼)
2 password=\u5BC6\u7801(密碼)
Message_en.properties
測(cè)試類(lèi)如下,getBundle方法接收兩個(gè)參數(shù),第一個(gè)是BaseName,可以理解為資源的基礎(chǔ)名,第二個(gè)是語(yǔ)言碼,中文是zh,英文是en等等,測(cè)試類(lèi)運(yùn)行完畢之后會(huì)給出英文資源文件中username所對(duì)應(yīng)的值,同理Locale設(shè)置為中文則輸出中文的值。所以資源文件我們以Message_en.properties這種格式來(lái)命名,其中en之后還可以添加下劃線跟第三個(gè)值區(qū)域碼,但是一般可以省略。
基于上面的內(nèi)容,struts2使用它們配置全局國(guó)際化資源,在struts.xml中添加國(guó)家化的配置,其中value就是資源的基礎(chǔ)名1 username=username
2 password=password
由于properties只支持iso-8859格式的編碼,所以在輸入中文的時(shí)候會(huì)有些問(wèn)題,只是Eclipse自帶的properties編輯器可以進(jìn)行可視化的文本輸入,不需要關(guān)注編碼。另外我們可以通過(guò)Java自帶的轉(zhuǎn)碼工具native2ascii進(jìn)行轉(zhuǎn)碼。2 password=password
測(cè)試類(lèi)如下,getBundle方法接收兩個(gè)參數(shù),第一個(gè)是BaseName,可以理解為資源的基礎(chǔ)名,第二個(gè)是語(yǔ)言碼,中文是zh,英文是en等等,測(cè)試類(lèi)運(yùn)行完畢之后會(huì)給出英文資源文件中username所對(duì)應(yīng)的值,同理Locale設(shè)置為中文則輸出中文的值。所以資源文件我們以Message_en.properties這種格式來(lái)命名,其中en之后還可以添加下劃線跟第三個(gè)值區(qū)域碼,但是一般可以省略。
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
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
1 <constant name="struts.custom.i18n.resources" value="Message" />
之后,在頁(yè)面上使用struts2的標(biāo)簽進(jìn)行對(duì)應(yīng)語(yǔ)言?xún)?nèi)容的顯示,當(dāng)然,顯示哪種語(yǔ)言需要顯式的將語(yǔ)言碼作為參數(shù)傳入,請(qǐng)求地址需要寫(xiě)作/XXX.action?request_locale=en1 全局國(guó)際化<br/>
2 <s:text name="username"/><br/>
除了全局國(guó)際化的配置,struts2還提供了包范圍和action范圍的國(guó)際化,其中包范圍的國(guó)際化,需要將資源文件命名為“package_語(yǔ)言碼.properties”的形式,然后置于需要的包下,struts2會(huì)優(yōu)先取得較小范圍的國(guó)際化資源文件,同時(shí)定義全局國(guó)際化資源和包國(guó)際化資源,那么包范圍的資源會(huì)優(yōu)先生效。至于action范圍的國(guó)際化,因?yàn)閲?guó)際化在日常的開(kāi)發(fā)中本來(lái)用的就不是很多,就算真的碰到需要雙語(yǔ)開(kāi)發(fā)的情況,或許也是做兩套頁(yè)面,或者直接做兩套網(wǎng)站,除非是那種跨國(guó)性質(zhì)的“因特噗啦一吇”,否則不要說(shuō)struts2的全局國(guó)際化的使用,針對(duì)包范圍和action范圍的國(guó)際化,都是少有問(wèn)津。2 <s:text name="username"/><br/>
posted on 2014-11-02 15:13 都較瘦 閱讀(135) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): MVCFramework