Internationalization ใน JSF ควรใช้ message-bundle และ resource-bundle เมื่อใด


84

ฉันควรใช้<resource-bundle>และ<message-bundle>แท็กสำหรับการแปลเป็นภาษาท้องถิ่นเมื่อfaces-config.xmlใดและอย่างไร ความแตกต่างระหว่างสองคนนั้นไม่ชัดเจนสำหรับฉัน

คำตอบ:


148

<message-bundle>

<message-bundle>จะใช้เมื่อใดก็ตามที่คุณต้องการแทนที่ข้อความเตือน / ข้อผิดพลาด JSF เริ่มต้นซึ่งจะถูกนำมาใช้โดยการตรวจสอบ JSF / สิ่งแปลง คุณสามารถค้นหาคีย์ข้อความเริ่มต้นเตือน / ข้อผิดพลาดในบทที่ 2.5.2.4 ของข้อกำหนด JSF

ตัวอย่างเช่นMessages_xx_XX.propertiesไฟล์ในcom.example.i18nแพ็คเกจด้านล่างซึ่งจะแทนที่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>

<resource-bundle>จะใช้เมื่อใดก็ตามที่คุณต้องการลงทะเบียนมัดทรัพยากรที่มีการแปลที่สามารถใช้ได้ตลอดทั้งการประยุกต์ใช้ JSF ทั้งหมดโดยไม่จำเป็นที่จะต้องระบุ<f:loadBundle>ในทุกมุมมองเดียว

ตัวอย่างเช่นText_xx_XX.propertiesไฟล์ในcom.example.i18nแพ็คเกจด้านล่าง:

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 ซึ่งเป็นตัวแทนโดยผู้ที่@NotNull, Size, @Maxฯลฯ คำอธิบายประกอบของjavax.validation.constraintsแพคเกจ คุณควรเข้าใจว่า API นี้ไม่เกี่ยวข้องกับ JSF โดยสิ้นเชิง ไม่ใช่ส่วนหนึ่งของ JSF แต่ JSF เพิ่งได้รับการสนับสนุนในช่วงการตรวจสอบความถูกต้อง กล่าวคือกำหนดและรับรู้การมีอยู่ของการนำไปใช้งาน JSR303 (เช่น Hibernate Validator) จากนั้นมอบหมายการตรวจสอบความถูกต้องให้ (ซึ่งสามารถปิดใช้งานได้โดยใช้<f:validateBean disabled="true"/>)

ตามบทที่ 4.3.1.1 ของข้อกำหนด JSR303ที่กำหนดเอง JSR303 ข้อความการตรวจสอบไฟล์ต้องมีว่าชื่อValidationMessages_xx_XX.propertiesและจะต้องมีการวางไว้ในรากของ classpath (จึงไม่ได้อยู่ในแพคเกจ!)


การแปล

ในตัวอย่างข้างต้น_xx_XXในชื่อไฟล์แสดงถึงภาษาและรหัสประเทศ (ไม่บังคับ) หากสิ่งนี้ขาดไปพร้อมกันมันจะกลายเป็นกลุ่มเริ่มต้น (ทางเลือก) หากมีภาษาอยู่เช่นภาษา_enนั้นจะถูกใช้เมื่อไคลเอนต์ได้ร้องขออย่างชัดเจนสำหรับภาษานี้ในAccept-Languageส่วนหัวของคำร้องขอ HTTP เช่นเดียวกับประเทศเช่นหรือ_en_US_en_GB

คุณสามารถระบุสถานที่ได้รับการสนับสนุนทั้งข้อความและทรัพยากรมัดทั่วไปในองค์ประกอบของ<locale-config>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>

<f:view locale>ความต้องการสถานที่ที่ต้องการจะได้รับการตั้งค่าผ่านทาง ดูเพิ่มเติมรองรับหลายภาษาใน JSF วิธีที่จะจำสถานที่เลือกต่อเซสชั่นแทนการต่อคำขอ


1
สวัสดี Balus C เราสามารถใช้ <message-bundle> หลายตัวและจะเรียกมันจาก java bean ได้อย่างไร?
T8Z

จำเป็นต้องให้ความระมัดระวังเป็นพิเศษกับโครงสร้างโฟลเดอร์เมื่อใช้ <resource-bundle> หากบอกว่าคุณมีสิ่งต่อไปนี้ใน faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle> แล้ว message.properties ทั้งหมด message_es.properties, message_de.properties ควรอยู่ในโฟลเดอร์ 'src / main / resources / org / abc / def' เท่านั้น เช่นอย่าสร้างโฟลเดอร์ 'ข้อความ' ภายใต้โฟลเดอร์ 'def' จนถึง 'def' คือสิ่งที่รีซอร์สบันเดิลคาดหวังว่าจะพบไฟล์ Messages_xx.properties ทั้งหมด
Rahul Saini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.