在程序設計領域, 把在無需改寫源代碼即可讓開發出來的應用程序能夠支持多種語言和數據格式的技術稱爲國際化.
與國際化對應的是本地化, 指讓一個具備國際化支持的應用程序支持某個特定的地區
Struts2 國際化是建立在 Java 國際化基礎上的:
1.爲不同國家/語言提供對應的消息資源文件
2.Struts2 框架會根據請求中包含的 Locale 加載對應的資源文件
3.通過程序代碼取得該資源文件中 指定 key 對應的消息
如何配置國際化資源文件
I.Action 範圍資源文件:在Action類文件所在的路徑建立名爲ActionName_language_country.properties 的文件
II.包範圍資源文件:在包的根路徑下建立文件名爲package_language_country.properties 的屬性文件, 一旦建立,處於該包下的所有 Action 都可以訪問該資源文件。注意:包範圍資源文件的 baseName 就是package,不是Action所在的包名。
II.全局資源文件:命名方式: basename_language_country.properties
struts.xml <constant name="struts.custom.i18n.resources" value="baseName"/>
https://blog.csdn.net/courage0316/article/details/81255479
IV.國際化資源文件加載的順序如何呢?離當前Action較近的將優先加載
2).如何在頁面上和Action類中訪問國際化資源文件的value值
I.在Action類中,若Action 實現了 TextProvider 接口,則可以調用getText()方法獲取value值
>通過繼承ActionSupport的方式
II. 頁面上可以使用 s:text 標籤; 對於表單標籤可以使用表單標籤的 key 屬性值
> 若有佔位符, 則可以使用 s:text 標籤的 s:param 子標籤來填充佔位符
> 可以利用標籤和 OGNL 表達式直接訪問值棧中的屬性值(對象棧 和 Map 棧)
time1=Time:{0}
<s:text name="time1">
<s:param value="date"></s:param>
</s:text>
------------------------------------
time2=Time:${date}
<s:text name="time2"></s:text>
3).實現通過超鏈接切換語言
I. 關鍵之處在於知道 Struts2 框架是如何確定 Local 對象的 !
II. 可以通過閱讀 I18N 攔截器知道.
III. 具體確定 Locale 對象的過程:
> Struts2 使用 i18n 攔截器 處理國際化,並且將其註冊在默認的攔截器棧中
> i18n攔截器在執行Action方法前,自動查找請求中一個名爲 request_locale 的參數。
如果該參數存在,攔截器就將其作爲參數,轉換成Locale對象,並將其設爲用戶默認的Locale(代表國家/語言環境)。並把其設置爲 session 的 WW_TRANS_I18N_LOCALE 屬性
> 若 request 沒有名爲request_locale 的參數,則 i18n 攔截器會從 Session 中獲取 WW_TRANS_I18N_LOCALE 的屬性值,
若該值不爲空,則將該屬性值設置爲瀏覽者的默認Locale
> 若 session 中的 WW_TRANS_I18N_LOCALE 的屬性值爲空,則從 ActionContext 中獲取 Locale 對象。
IV. 具體實現: 只需要在超連接的後面附着 request_locale 的請求參數, 值是 語言國家 代碼.
<a href="testI18n.action?request_locale=en_US">English</a>
<a href="testI18n.action?request_locale=zh_CN">中文</a>
超鏈接必須是一個 Struts2 的請求, 否則 i18n 攔截器不起作用!