日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Struts1.x系列教程(13):國(guó)際化

系統(tǒng) 2105 0

本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

上一篇: Struts1.x系列教程(12):Validator驗(yàn)證框架的內(nèi)置標(biāo)準(zhǔn)驗(yàn)證

Struts2教程10:國(guó)際化


對(duì)于一個(gè)面向全球的 Web 應(yīng)用程序,按著不同國(guó)家的要求顯示相關(guān)信息(稱為國(guó)際化)顯得尤為重要。國(guó)際化的工作非常復(fù)雜和繁瑣。因?yàn)橐g很多 Web 界面,信息格式等。然而, Struts 為我們提供了完成國(guó)際化工作的更容易的方式。在本文將介紹如何使用 Struts 來簡(jiǎn)化國(guó)際化的工作。

一、處理客戶端界面的編碼問題

由于 Web 瀏覽器可以使用不同的編碼格式來解析客戶端代碼,這主要取決于用戶的默認(rèn)設(shè)置或偏好。由于存在這種情況,因此,在服務(wù)端向客戶端發(fā)送數(shù)據(jù)時(shí),就必須使用和客戶端一致的編碼格式。
通常的做法是使用Internet上比較常用的UTF-8編碼,這主要是因?yàn)閁TF-8編碼格式所描述的字符包括了世界上所有以知國(guó)家和地區(qū)的語言編碼。這樣服務(wù)端就不用根據(jù)客戶端的編碼格式不斷地調(diào)整服務(wù)端響應(yīng)信息的編碼格式了。對(duì)于JSP頁面來說,可以使用page指定來設(shè)置響應(yīng)信息的編碼格式,如下面代碼所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagecontentType = " text/html;charset=UTF-8 " %>

當(dāng)然,如果我們?cè)赪eb程序中使用了Struts框架,還可以在struts-config.xml文件中使用如下的代碼來設(shè)置編碼格式:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < controller contentType ="text/html;charset=UTF-8" />

如果使用上面的設(shè)置,所有通過 .do <forward> 元素訪問的頁面都會(huì)繼承這一編碼設(shè)置。但是如果單獨(dú)訪問 JSP 頁面,就會(huì)繞過 Struts 的這個(gè)設(shè)置。
對(duì)于靜態(tài)頁面(如HTML)來說,需要使用<meta>元素來設(shè)置編碼格式,如下面代碼所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < head >
< meta http-equiv ="content-type" content ="text/html;charset=UTF-8" >
</ head >

除了使用通用的UTF-8編碼格式外,也可以從HTTP請(qǐng)求頭字段Accept- Charset中獲得客戶端的編碼格式。然后根據(jù)這個(gè)編碼格式來設(shè)置響應(yīng)信息的編碼格式。然而,雖然根據(jù)HTML4.0規(guī)范,Web瀏覽器可以設(shè)置 Accept-Charset字段,但是有很多瀏覽器可以會(huì)忽略這一字段,因此,只使用這個(gè)字段來確定Web瀏覽器所使用的編碼格式是不可靠的。所以最好 的國(guó)際化編碼格式解決方案仍然是UTF-8。

二、本地化屬性文件

本地化最重要的部分就是根據(jù)用戶所處的語言環(huán)境來顯示響應(yīng)語言的界面,如用戶在英文操作系統(tǒng)下,就會(huì)顯示英文界面,如果在中文操作系統(tǒng)下,就會(huì)顯示中文界面。最理想的情況是這種顯示效果的切換是完全透明的。

Struts 中提供了這種技術(shù),使我們可以更容易地實(shí)現(xiàn)透明地界面切換。在 Struts Bean 標(biāo)簽庫(kù)中有一個(gè) <bean:message> 標(biāo)簽,它可以根據(jù)客戶端瀏覽器所處的語言環(huán)境自動(dòng)選擇相應(yīng)的屬性文件來讀取界面顯示信息。為了演示如何使用 <bean:message> 以及不同的屬性文件來實(shí)現(xiàn)國(guó)際化的程序。讓我們先來看一個(gè)例子。

在本例中,選用了三個(gè)國(guó)家的語言環(huán)境(中文、英文和法文)來演示國(guó)際化的實(shí)現(xiàn)。由于讀者可能不便于輸入法文,因此,法文信息仍然用中文代替,只是后面多了個(gè)“(法文)”作為標(biāo)識(shí)。我們需要如下四步來完成這個(gè)例子:

【第 1 步】 建立一個(gè)默認(rèn)的屬性文件

在<samples工程目錄>\src\struts目錄中建立一個(gè)application.properties文件,內(nèi)容如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> title = 這是一個(gè)國(guó)際化的web程序(默認(rèn)值)
name
= 姓名(默認(rèn)值)
submit
= 提交(默認(rèn)值)

application.properties 文件是默認(rèn)的屬性文件,如果客戶端瀏覽器所處的語言環(huán)境在服務(wù)端未找到相應(yīng)的屬性文件, <bean:message> 標(biāo)簽就會(huì)從 application.properties 文件中讀取字符串信息。
在Eclipse中編輯非ISO 8859-1編碼格式的字符時(shí),應(yīng)使用在
《屬性(資源)文件亂碼問題的解決之道》 介紹的兩個(gè)Eclipse插件,或使用native2ascii.exe命令進(jìn)行轉(zhuǎn)換。否則在顯示屬性文件中的信息時(shí)會(huì)出現(xiàn)亂碼。

【第 2 步】 struts-config.xml 文件中配置屬性文件

Struts 中所有的屬性文件都必須在 struts-config.xml 文件中配置。否則 <bean:message> 標(biāo)簽就會(huì)由于無法找到相應(yīng)的屬性文件而拋出異常。
為了配置application.properties,需要在struts-config.xml文件中的<struts-config>標(biāo)簽中加入如下的代碼:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < message-resources parameter ="struts.application" key ="global" />

由于在 struts-config.xml 文件中已經(jīng)有一個(gè) ErrorDescription.properties 作為默認(rèn)的屬性文件,因此, application.properties 文件要使用一個(gè) key 加以標(biāo)識(shí)。在使用 <bean:message> 標(biāo)簽時(shí)必須要使用 bundle 屬性指定這個(gè) key 才能找到 application.properties 文件。

【第 3 步】 加入不同語言的屬性文件

在這一步我們來加入中文、英文、法文的屬性文件。這三個(gè)屬性文件的文件名如下:

  • 中文: application_zh.properties
  • 英文: application_en.properties
  • 法文: application_fr.properties

將這三個(gè)文件放到 <samples 工程目錄 >\src\struts 目錄中。它們的內(nèi)容如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> application_zh.properties
title
= 這是一個(gè)國(guó)際化的web程序
name
= 姓名
submit
= 提交

application_en.properties
title
= Thisisaninternationalizationwebprogram.
name
= name
submit
= submit

application_fr.properties
title
= 這是一個(gè)國(guó)際化的web程序(法語)
name
= 姓名(法語)
submit
= 提交(法語)

這三個(gè)屬性文件是不需要在 struts-config.xml 中配置的。 Struts 會(huì)自動(dòng)根據(jù)客戶端瀏覽器所處的語言環(huán)境來尋找這三個(gè)文件。

【第 4 步】 編寫 JSP 頁面

在這個(gè) JSP 頁面中使用了 <bean:message> 來根據(jù)客戶端瀏覽器所處的語言環(huán)境來讀取相應(yīng)的屬性文件中的內(nèi)容。在 web根目錄 中建立一個(gè) global.jsp 文件,代碼如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagepageEncoding = " UTF-8 " %>
<% @tagliburi = " http://struts.apache.org/tags-bean " prefix = " bean " %>
< html >
< head >
< title > 國(guó)際化 </ title >
</ head >
< body >
< bean:message key ="title" bundle ="global" />< p />
< form action ="" >
< bean:message key ="name" bundle ="global" />
< input type ="text" name ="name" />< p />
< input type ="submit" value =<bean:message key ="submit" bundle ="global" /> />
</ form >
</ body >
</ html >

由于安裝不同語言的操作系統(tǒng)很不方便,在這里我們采用另一種方法來模擬不同的語言環(huán)境測(cè)試這個(gè)程序。首先在 IE 中使用【工具】 > Internet 選項(xiàng)】 > 【常規(guī)】 > 【語言】來打開“語言首選項(xiàng)”對(duì)話框,使用“添加”按鈕添加“中文 [zh] ”、“英文 [en] ”和“法語(法國(guó)) [fr] ”,再添加一種其他語言,如“梵文 [sa] ”。添加后的界面如下圖所示。

然后分別將這四種語言上移到列表頂端。然后點(diǎn)擊“確定”按鈕保存設(shè)置。在啟動(dòng) Tomcat 后,在 IE 中輸入如下的 URL

http://localhost:8080/samples/global.jsp

根據(jù)語言設(shè)置的不同,在 IE 中會(huì)顯示不同語言的界面,如中文和英文的頁面分別如下面兩個(gè)圖所示。




如果在刷新時(shí)頁面語言未更新,可能是因?yàn)? IE Cache 的原因,讀者可以啟一個(gè)新的 IE 窗口,再進(jìn)行測(cè)試。
讀者在使用屬性文件進(jìn)行國(guó)際化時(shí)應(yīng)注意如下三點(diǎn):
1. 由于語言還可以繼續(xù)細(xì)分,如中文可以分為簡(jiǎn)體和繁體,英文也可以分為不同國(guó)家或地區(qū)的英文,如愛爾蘭、澳大利亞等。因此,對(duì)于更細(xì)化的語言,可以在屬性文件后面再加一個(gè)代表國(guó)家或地區(qū)的后綴,如application_zh_TW.properties代表中國(guó)臺(tái)灣所使用的繁體中文,application_en_AU.properties代表澳大利亞英文。Struts在尋找屬性文件時(shí),會(huì)首先查找?guī)в袊?guó)家或地區(qū)后綴的屬性文件,如果這類文件不存在,會(huì)繼續(xù)查找只有語言后綴的屬性文件,如果還不存在,最后會(huì)讀取默認(rèn)屬性文件,也就是application.properties的內(nèi)容。假設(shè)我們?cè)凇罢Z言首選項(xiàng)”中選擇了“中文(臺(tái)灣) [zh-tw]”,那么讀取文件的順序(從最左邊開始,如果文件不存在,依次讀取右邊的文件)如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> application_zh_TW.properties>application_zh.properties>application.properties

如果選擇的語言是“中文 [zh] ”,那么就直接從 application_zh.properties 開始讀取。
2.
在建立屬性文件時(shí)要注意,后綴的連接符為下劃線 ( _ ) ,而不能用減號(hào) ( - )
3. 代表語言的后綴(如zh、fr、en等)必須小寫,而代表國(guó)家或地區(qū)的后綴(如CN、TW、AU等)必須大寫。如寫成application_ZH_tw.properties是不正確的。
在Struts HTML標(biāo)簽庫(kù)中的標(biāo)簽中以key為后綴的屬性值就是屬性文件中的key,如下面的代碼所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < html:submit value ="提交" titleKey ="title" bundle ="global" />

上面的代碼將<html:submit>標(biāo)簽的title屬性值設(shè)為屬性文 件的title鍵的值。但是在<html:submit>標(biāo)簽中的value屬性無法使用屬性文件中的鍵值,解決的方法是使用< html:submit>標(biāo)簽的另一種寫法,代碼如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> < html:submit >
< bean:message key =“title” bundle =“global” />
</ html:submit >

三、實(shí)現(xiàn)多種語言界面的 Web 程序
在上面所講的國(guó)際化只是根據(jù)客戶端瀏覽器所處的語言環(huán)境來自動(dòng)設(shè)置界面語言。而我們?cè)? Internet 上會(huì)看到很多 Web 程序在主界面上都提供了對(duì)不同語言的選擇。在本節(jié)我們就來講一下如何通過編程的方式來干預(yù)服務(wù)端對(duì)屬性文件的選擇。
實(shí)現(xiàn)上,Java使用java.util.Locate類來描述語言,一個(gè)Locate類的對(duì)象實(shí)例就代表一種語言。并且從客戶端獲得的語言信息使用“org.apache.struts.action.LOCALE”保存在了session中,因此,我們只要在調(diào)用<bean:message>或其他使用屬性文件的語句之前修改session中保存的Locale對(duì)象,就可以達(dá)到我們的目的。現(xiàn)在我們來對(duì)global.jsp頁面進(jìn)行修改(新建一個(gè)文件newGlobal.jsp)。global.jsp中所有的代碼都不用動(dòng),只需要在第一個(gè)<bean:message>標(biāo)簽的前面加上如下的代碼:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
<%
if ( " en " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " en " ));
else if ( " zh " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " zh " ));
else if ( " fr " .equals(request.getParameter( " language " )))
session.setAttribute(
" org.apache.struts.action.LOCALE " , new java.util.Locale( " fr " ));
%>
< bean:messagekey = " title " bundle = " global " />

在Web根目錄 中建立一個(gè) mainGlobal.jsp 文件,如下面的代碼所示:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <% @pagepageEncoding = " UTF-8 " %>
< html >
< head >
< title > 多語言支持 </ title >
</ head >
< body >
< a href ="newGlobal.jsp?language=en" target ="_blank" > 英文 </ a >< p />
< a href ="newGlobal.jsp?language=zh" target ="_blank" > 中文 </ a >< p />
< a href ="newGlobal.jsp?language=fr" target ="_blank" > 法文 </ a >
</ body >
</ html >

啟動(dòng) Tomcat 后,在 IE 中輸入如下的 URL
http://localhost:8080/samples/mainGlobal.jsp
點(diǎn)擊 mainGlobal.jsp 頁面上的三個(gè)鏈接,就會(huì)分別顯示三種語言的頁面。
在Struts Action類中的也可以使用Action類提供的setLocale方法來設(shè)置語言。如在execute方法中設(shè)置語言的代碼如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> setLocale(request, new java.util.Locale( " zh " , " TW " ));

使用setLocale方法設(shè)置語言時(shí)應(yīng)注意兩點(diǎn):
1. java.util.Locale的構(gòu)造方法的第一個(gè)參數(shù)表示語言,第二個(gè)參數(shù)表示國(guó)家或地區(qū),這兩個(gè)參數(shù)值和屬性文件的后綴不同,它不區(qū)分大小寫,因此,也可以寫成如下的形式:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> setLocale(request, new java.util.Locale( " ZH " , " tw " ));

2. 所有經(jīng)過 <forward> 元素或 .do 的程序都會(huì)繼承 setLocale 方法設(shè)置后的語言,但 <action> 元素的 forward input 屬性所指的頁面除外。

下一篇: Struts1.x系列教程(14):動(dòng)態(tài)Form



國(guó)內(nèi)最棒的Google Android技術(shù)社區(qū)(eoeandroid),歡迎訪問!

《銀河系列原創(chuàng)教程》 發(fā)布

《Java Web開發(fā)速學(xué)寶典》 出版,歡迎定購(gòu)

Struts1.x系列教程(13):國(guó)際化


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 寿宁县| 宝清县| 来宾市| 辽阳市| 高邮市| 定州市| 漳州市| 威海市| 乐平市| 彰武县| 崇信县| 江陵县| 南丰县| 库车县| 琼结县| 长乐市| 任丘市| 炎陵县| 柏乡县| 永州市| 望奎县| 阜新市| 眉山市| 怀宁县| 金门县| 遵化市| 平顶山市| 永平县| 安宁市| 黄平县| 盘锦市| 栾川县| 横峰县| 综艺| 普陀区| 道孚县| 乌拉特中旗| 茂名市| 双江| 自治县| 兴国县|