JSF 2.0和Resource Bundles使用範例

在開發的系統裏,很多時候會遇到需要支援多種語言,雖然我們可以直接把語言文字直接寫在介面的位置,但維護和增加語言時十分困難。所以,在這個JSF 2.0教學裏,將會演示如何使用Resource bundle方式來顯示文字,建議大家使用這種方式集中把文字放進messages properties文件裏。

1.建立 Properties 文件

新建一個properties文件,文件裏包函了系統會使用的文字,把這個文件放置到resource 文件夾。

messages.properties

titleText=JSF Messages Demo

message = This is "message"
message.test1 = This is "message.test1"
message.test2 = This is "<h2>message.test3</h2>"
message.test3 = This is "&lt;h2&gt;message.test4&lt;/h2&gt;"
message.param1 = This is "message.param1" - {0}
message.param2 = This is "message.param2" - {0} and {1}

項目文件結構

2.使用Resource Bundles

在JSF 2.0載入Resource Bundles有兩種方法。

全域載入
以全域的方式載入,可以讓所有的JSF頁面都可以存取這個文字資源,全域載入需要建立faces-config.xml。

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
    <application>
        <locale-config>
            <default-locale>zh_HK</default-locale>
        </locale-config>
        <resource-bundle>
            <base-name>com.test.demojsf.messages</base-name>
            <var>msg</var>
        </resource-bundle>
        <message-bundle>com.test.demojsf.messages</message-bundle>
    </application>
</faces-config>

本地載入
以本地的方式載入,在需要使用文字的頁面上宣告<f:loadBundle />標簽便可。

<f:loadBundle basename="com.test.demojsf.messages" var="msg"/>

3.JSF 2.0頁面

這個範例裏,在messages.properties裏定義了變數名為msg,所以只需要使用「msg.<key>」便可以存取需要的文字

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html;charset=UTF8"%>
<f:view>
<html>
    <head>
        <title><h:outputText value="#{msgs.titleText}"/></title>
    </head>
    <body>
        <h1><h:outputText value="#{msgs.titleText}"/></h1>
        <ol>
            <li><h:outputText value="#{msg.message}" /></li>
            <li><h:outputText value="#{msg['message.test1']}" /></li>
            <li><h:outputText value="#{msg['message.test2']}" /></li>
            <li><h:outputText value="#{msg['message.test2']}" escape="false" /></li>
            <li><h:outputText value="#{msg['message.test3']}" /></li>
            <li><h:outputText value="#{msg['message.test3']}" escape="false" /></li>
            <li>
                <h:outputFormat value="#{msg['message.param1']}">
                    <f:param value="param0" />
                </h:outputFormat>
            </li>
            <li>
                <h:outputFormat value="#{msg['message.param2']}">
                    <f:param value="param0" />
                    <f:param value="param1" />
                </h:outputFormat>
            </li>
        </ol>
    </body>
</html>
</f:view>

4.輸出結果

下載範例(GitHub)

https://github.com/vvtitana/DemoJSF-Resource-Bundles-Example

下載附件

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

驗證碼 * Time limit is exhausted. Please reload CAPTCHA.

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料