localization - JSF中的國際化,何時使用消息包和資源包?





internationalization (2)


<郵件束>

當你想覆蓋JSF驗證/轉換材料所使用的JSF默認警告/錯誤消息時,就會使用<message-bundle> 。 您可以在JSF規範的第2.5.2.4章中找到默認警告/錯誤消息的鍵。

例如,下面的com.example.i18n包中的Messages_xx_XX.properties文件覆蓋默認的required="true"消息:

com/example/i18n/Messages_en.properties

javax.faces.component.UIInput.REQUIRED = {0}: This field is required

com/example/i18n/Messages_nl.properties

javax.faces.component.UIInput.REQUIRED = {0}: Dit veld is vereist

可以配置如下(不帶語言環境說明符_xx_XX和文件擴展名!):

<message-bundle>com.example.i18n.Messages</message-bundle>

<資源束>

每當你想註冊一個本地化的資源包時,就會使用<resource-bundle> ,這個資源包在整個JSF應用程序中都可用,而不需要在每個視圖中指定<f:loadBundle>

例如, com.example.i18n包中的Text_xx_XX.properties文件如下所示:

com/example/i18n/Text_en.properties

main.title = Title of main page
main.head1 = Top heading of main page
main.form1.input1.label = Label of input1 of form1 of main page

com/example/i18n/Text_nl.properties

main.title = Titel van hoofd pagina
main.head1 = Bovenste kop van hoofd pagina
main.form1.input1.label = Label van input1 van form1 van hoofd pagina

可以配置如下(不帶語言環境說明符_xx_XX和文件擴展名!):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

並在main.xhtml使用,如下所示:

<h:head>
    <title>#{text['main.title']}</title>
</h:head>
<h:body>
    <h1 id="head1">#{text['main.head1']}</h1>
    <h:form id="form1">
        <h:outputLabel for="input1" value="#{text['main.form1.input1.label']}" />
        <h:inputText id="input1" label="#{text['main.form1.input1.label']}" />
    </h:form>
</h:body>

ValidationMessages(JSR303 Bean驗證)

從Java EE 6 / JSF 2開始,還有新的JSR303 Bean驗證API,它由javax.validation.constraints包的javax.validation.constraintsSizejavax.validation.constraints等註釋表示。 您應該了解這個API JSF 完全無關 。 它不是JSF的一部分,但JSF恰好在驗證階段支持它。 即它確定並認識到JSR303實現(例如Hibernate Validator)的存在,然後將驗證委派給它(可以通過使用<f:validateBean disabled="true"/>來禁用它)。

根據JSR303規範的第4.3.1.1 ,自定義JSR303驗證消息文件需要具有名稱ValidationMessages_xx_XX.properties並且它需要放在類路徑的根目錄中(因此不在包中!)。

本土化

在上面的示例中,文件名中的_xx_XX表示(可選)語言和國家/地區代碼。 如果這完全沒有,那麼它將成為默認(後備)捆綁。 如果語言存在,例如_en ,則當客戶端在Accept-Language HTTP請求頭中明確請求該語言時,將使用該語言。 這同樣適用於該國,例如_en_US_en_GB

您可以在faces-config.xml <locale-config>元素中為消息和資源包指定支持的語言環境。

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>nl</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

所需的語言環境需要通過<f:view locale>來設置。 另請參閱JSF中的本地化,如何記住每個會話選定的區域設置,而不是每個請求/視圖

何時以及如何在faces-config.xml使用<resource-bundle><message-bundle>標記進行本地化? 這兩者之間的差異對我來說不是很清楚。




.jsf擴展名是FacesServlet在JSF 1.2期間經常映射到web.xml

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

.xhtml擴展名是實際的 Facelets文件,因為您實際放置在webapp的webcontent中,例如Webapp/WebContent/page.xhtml

如果您使用.jsf擴展名調用此頁面,例如http://localhost:8080/webapp/page.jsf ,則將調用FacesServlet ,找到page.xhtml文件並解析/呈現其JSF組件。 如果未調用FacesServlet ,那麼最終用戶將最終獲得原始XHTML源代碼(可以通過右鍵單擊View Source查看 )。

有時使用*.faces擴展名或/faces/* foldermapping。 但這是從JSF 1.0 / 1.1時代開始的。 您可以自由選擇並使用您希望FacesServlet監聽的任何映射,即使它不是什麼意思*.xyz 。 實際頁面本身應始終具有.xhtml擴展名,但這可以通過web.xml的以下<context-param>進行配置:

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xml</param-value>
</context-param>

這將更改FacesServlet以找到(默認) page.xhtml

最近,使用JSF / Facelets 2.0進行了*.xhtml映射。 在JSF / Facelets 1.x中,無法使用與物理文件相同的映射擴展。 它會導致無限循環。 但是,由於JSF / Facelets 2.0是可能的,這允許您通過http://localhost:8080/webapp/page.xhtml調用頁面。

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

這樣,您無需配置一些安全限制來隱藏原始源文件,以防止最終用戶更改例如瀏覽器地址欄中.xhtml URL中的.jsf 。 只有工具(IDE和插件)和學習資源仍然需要趕上從*.jsf*.xhtml *.jsf移動。 根據JSF 2.3, FacesServlet默認情況下也會在*.xhtml上自動註冊(在/faces/**.faces*.jsf )。 這被移植到Mojarra 2.2.11。

也可以看看:





jsf localization internationalization