Khi nào và như thế nào tôi nên sử dụng <resource-bundle>
và <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:
Nó <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.properties
các tệp trong com.example.i18n
gó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_XX
và phần mở rộng tệp!):
<message-bundle>com.example.i18n.Messages</message-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.properties
các tệp trong com.example.i18n
gó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_XX
và 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.xhtml
như 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>
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.constraints
gó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!).
Trong các ví dụ trên, _xx_XX
trong 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 _en
thì 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-Language
tiêu đề yêu cầu HTTP. Điều tương tự cũng áp dụng cho quốc gia, ví dụ _en_US
hoặ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 .