Quốc tế hóa trong JSF, khi nào sử dụng gói thông báo và gói tài nguyên?


84

Khi nào và như thế nào tôi nên sử dụng <resource-bundle><message-bundle>các thẻ để bản địa hóa faces-config.xml? Tôi không rõ lắm sự khác biệt giữa hai cái đó.

Câu trả lời:


148

<message-bundle>

<message-bundle>sẽ được sử dụng bất cứ khi nào bạn muốn ghi đè các thông báo lỗi / cảnh báo mặc định JSF được sử dụng bởi công cụ xác thực / chuyển đổi JSF. Bạn có thể tìm thấy các khóa của cảnh báo / thông báo lỗi mặc định trong chương 2.5.2.4 của đặc tả JSF .

Ví dụ: Messages_xx_XX.propertiescác tệp trong com.example.i18ngói dưới đây ghi đè required="true"thông báo mặc định :

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

có thể được cấu hình như sau (không có mã định vị ngôn ngữ _xx_XXvà phần mở rộng tệp!):

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

<resource-bundle>

Điều <resource-bundle>này sẽ được sử dụng bất cứ khi nào bạn muốn đăng ký một gói tài nguyên được bản địa hóa, gói này có sẵn trong toàn bộ ứng dụng JSF mà không cần chỉ định <f:loadBundle>trong mọi chế độ xem.

Ví dụ: Text_xx_XX.propertiescác tệp trong com.example.i18ngói như sau:

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

có thể được cấu hình như sau (không có mã định vị ngôn ngữ _xx_XXvà phần mở rộng tệp!):

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

và được sử dụng main.xhtmlnhư sau:

<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 Validation)

Kể từ Java EE 6 / JSF 2, cũng có API JSR303 Bean Validation mới được đại diện bởi những @NotNull, Size, @Max, vv chú thích của javax.validation.constraintsgói. Bạn nên hiểu rằng API này hoàn toàn không liên quan đến JSF. Nó không phải là một phần của JSF, nhưng JSF chỉ tình cờ hỗ trợ nó trong giai đoạn xác thực. Tức là nó xác định và nhận ra sự hiện diện của triển khai JSR303 (ví dụ: Hibernate Validator) và sau đó ủy quyền xác thực cho nó (nhân tiện, có thể bị vô hiệu hóa bằng cách sử dụng <f:validateBean disabled="true"/>).

Theo chương 4.3.1.1 của đặc tả JSR303 , tệp thông báo xác thực JSR303 tùy chỉnh cần có tên chính xácValidationMessages_xx_XX.properties và nó cần được đặt trong thư mục gốc của classpath (do đó, không phải trong một gói!).


Bản địa hóa

Trong các ví dụ trên, _xx_XXtrong tên tệp đại diện cho ngôn ngữ (tùy chọn) và mã quốc gia. Nếu điều này hoàn toàn vắng mặt, thì nó sẽ trở thành gói (dự phòng) mặc định. Ví dụ: nếu ngôn ngữ có sẵn _enthì nó sẽ được sử dụng khi khách hàng đã yêu cầu rõ ràng ngôn ngữ này trong Accept-Languagetiêu đề yêu cầu HTTP. Điều tương tự cũng áp dụng cho quốc gia, ví dụ _en_UShoặc _en_GB.

Bạn có thể chỉ định chung các ngôn ngữ được hỗ trợ cho cả gói tài nguyên và thông báo trong <locale-config>phần tử của faces-config.xml.

<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>

Ngôn ngữ mong muốn cần được đặt qua <f:view locale>. Xem thêm Bản địa hóa trong JSF, cách ghi nhớ ngôn ngữ đã chọn trên mỗi phiên thay vì theo yêu cầu / chế độ xem .


1
Xin chào Balus C, chúng tôi có thể sử dụng nhiều <message-bundle> không và cách gọi nó từ java bean?
T8Z

Cần chú ý đặc biệt đến cấu trúc thư mục khi sử dụng <resource-bundle>. Nếu giả sử bạn có thông tin sau trong face-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle> thì tất cả message.properties, message_es.properties, message_de.properties chỉ nên nằm trong thư mục 'src / main / resources / org / abc / def'. tức là không tạo một thư mục 'messages' trong thư mục 'def'. Cho đến khi 'def' là gói tài nguyên đang mong đợi nơi nó mong đợi để tìm tất cả các tệp messages_xx.properties.
Rahul Saini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.