一個支持i18n的應用程序應該有如下一些特征:
1增加支持的語言時要求不更改程序代碼
2字符元素、消息、和圖象保存在原代碼之外
3依賴于不同文化的數據如:日期時間、小數、及現金符號等數據對用戶的語言和地理位置應該有正確的格式
4應用程序能迅速地適應新語言和/或新地區
Struts主要采用兩個i18n組件來實現國際化編程:
第一個組件是一個被應用程序控制器管理的消息類,它引用包含地區相關信息串的資源包。第二個組件是一個JSP定制標簽, ,它用于在View層呈現被控制器管理的實際的字符串。在我們前面的登錄例子中這兩方面的內容都出現過。
用Struts實現國際化編程的標準做法是:生成一個java屬性文件集。每個文件包含您的應用程序要顯示的所有消息的鍵/值對。
這些文件的命名要遵守如下規則,代表英文消息的文件可作為缺省的文件,它的名稱是ApplicationResources.properties;其他語種的文件在文件名中都要帶上相應的地區和語言編碼串,如代表中文的文件名應為ApplicationResources_zh_CN.properties。并且其他語種的文件與ApplicationResources.properties文件要放在同一目錄中。
ApplicationResources.properties文件的鍵/值都是英文的,而其他語種文件的鍵是英文的,值則是對應的語言。如在我們前面的登錄例子中的鍵/值對:logon.jsp.prompt.username=Username:在中文文件中就是:logon.jsp.prompt.username=用戶名:當然,在實際應用時要把中文轉換為AscII碼。
有了上一篇文章和以上介紹的一些基礎知識后。我們就可以將我們的登錄程序進行國際化編程了。
首先,我們所有jsp頁面文件的字符集都設置為UTF-8。即在頁面文件的開始寫如下指令行:
<%@ page contentType="text/html; charset=UTF-8" %>,在我們的登錄例子中已經這樣做了,這里不需要再改動。
其次,將所有的request的字符集也設置為UTF-8。雖然,我們可以在每個文件中加入這樣的句子:request.setCharacterEncoding("UTF-8");來解決,但這樣顯得很麻煩。一種更簡單的解決方法是使用filter。具體步驟如下:
在mystruts\WEB-INF\classes目錄下再新建一個名為filters的目錄,新建一個名為:SetCharacterEncodingFilter的類,并保存在該目錄下。其實,這個類并不要您親自來寫,可以借用tomcat中的例子。現將該例子的程序節選如下:
其中,request.setCharacterEncoding(encoding);是一個關鍵句子。
為了讓該類工作,我們還要在web.xml文件中對它進行配置,配置代碼如下:
最后,就是準備資源包文件,我們以創建一個中文文件為例:
將ApplicationResources.properties文件打開,另存為ApplicationResources_zh.properties,這只是一個過渡性質的文件。將文件中鍵/值對的值都用中文表示。更改完后的代碼如下:
使用native2ascii工具將上面文件中的中文字符轉換為ascii碼,并生成一個最終使用的資源文件ApplicationResources_zh_CN.properties。
具體做法是打開一個dos窗口,到mystruts\WEB-INF\classes目錄下,運行如下語句:
native2ascii -encoding GBK ApplicationResources_zh.properties ApplicationResources_zh_CN.properties
生成的文件ApplicationResources_zh_CN.properties的內容如下:
從這里可以看出,所有的中文字都轉換成了對應的Unicode碼。
現在,再運行登錄例子程序,您會發現它已經是顯示的中文了。在瀏覽器的"工具"--"Internet選項"的"語言首選項"對話框中,去掉"中文(中國)"加上英文,再試登錄程序,此時,又會顯示英文。這就是說不同國家(地區)的客戶都可以看到自己語言的內容,這就實現了國際化編程的基本要求。如果還要顯示其他語言,可采用類似處理中文的方法進行,這里就不細講了。
本文中的例子程序所采用的數據庫仍然是MS SQLServer2000,數據庫字符集為gbk。實驗表明,對簡、繁體中文,英文及日文字符都能支持。
參考文獻:
《Programming Jakarta Struts》Chuck Cavaness著
《Mastering Jakarta Struts》James Goodwill著
1增加支持的語言時要求不更改程序代碼
2字符元素、消息、和圖象保存在原代碼之外
3依賴于不同文化的數據如:日期時間、小數、及現金符號等數據對用戶的語言和地理位置應該有正確的格式
4應用程序能迅速地適應新語言和/或新地區
Struts主要采用兩個i18n組件來實現國際化編程:
第一個組件是一個被應用程序控制器管理的消息類,它引用包含地區相關信息串的資源包。第二個組件是一個JSP定制標簽,
用Struts實現國際化編程的標準做法是:生成一個java屬性文件集。每個文件包含您的應用程序要顯示的所有消息的鍵/值對。
這些文件的命名要遵守如下規則,代表英文消息的文件可作為缺省的文件,它的名稱是ApplicationResources.properties;其他語種的文件在文件名中都要帶上相應的地區和語言編碼串,如代表中文的文件名應為ApplicationResources_zh_CN.properties。并且其他語種的文件與ApplicationResources.properties文件要放在同一目錄中。
ApplicationResources.properties文件的鍵/值都是英文的,而其他語種文件的鍵是英文的,值則是對應的語言。如在我們前面的登錄例子中的鍵/值對:logon.jsp.prompt.username=Username:在中文文件中就是:logon.jsp.prompt.username=用戶名:當然,在實際應用時要把中文轉換為AscII碼。
有了上一篇文章和以上介紹的一些基礎知識后。我們就可以將我們的登錄程序進行國際化編程了。
首先,我們所有jsp頁面文件的字符集都設置為UTF-8。即在頁面文件的開始寫如下指令行:
<%@ page contentType="text/html; charset=UTF-8" %>,在我們的登錄例子中已經這樣做了,這里不需要再改動。
其次,將所有的request的字符集也設置為UTF-8。雖然,我們可以在每個文件中加入這樣的句子:request.setCharacterEncoding("UTF-8");來解決,但這樣顯得很麻煩。一種更簡單的解決方法是使用filter。具體步驟如下:
在mystruts\WEB-INF\classes目錄下再新建一個名為filters的目錄,新建一個名為:SetCharacterEncodingFilter的類,并保存在該目錄下。其實,這個類并不要您親自來寫,可以借用tomcat中的例子。現將該例子的程序節選如下:
|
其中,request.setCharacterEncoding(encoding);是一個關鍵句子。
為了讓該類工作,我們還要在web.xml文件中對它進行配置,配置代碼如下:
|
最后,就是準備資源包文件,我們以創建一個中文文件為例:
將ApplicationResources.properties文件打開,另存為ApplicationResources_zh.properties,這只是一個過渡性質的文件。將文件中鍵/值對的值都用中文表示。更改完后的代碼如下:
|
使用native2ascii工具將上面文件中的中文字符轉換為ascii碼,并生成一個最終使用的資源文件ApplicationResources_zh_CN.properties。
具體做法是打開一個dos窗口,到mystruts\WEB-INF\classes目錄下,運行如下語句:
native2ascii -encoding GBK ApplicationResources_zh.properties ApplicationResources_zh_CN.properties
生成的文件ApplicationResources_zh_CN.properties的內容如下:
|
從這里可以看出,所有的中文字都轉換成了對應的Unicode碼。
現在,再運行登錄例子程序,您會發現它已經是顯示的中文了。在瀏覽器的"工具"--"Internet選項"的"語言首選項"對話框中,去掉"中文(中國)"加上英文,再試登錄程序,此時,又會顯示英文。這就是說不同國家(地區)的客戶都可以看到自己語言的內容,這就實現了國際化編程的基本要求。如果還要顯示其他語言,可采用類似處理中文的方法進行,這里就不細講了。
本文中的例子程序所采用的數據庫仍然是MS SQLServer2000,數據庫字符集為gbk。實驗表明,對簡、繁體中文,英文及日文字符都能支持。
參考文獻:
《Programming Jakarta Struts》Chuck Cavaness著
《Mastering Jakarta Struts》James Goodwill著