ฉันควรใช้<resource-bundle>
และ<message-bundle>
แท็กสำหรับการแปลเป็นภาษาท้องถิ่นเมื่อfaces-config.xml
ใดและอย่างไร ความแตกต่างระหว่างสองคนนั้นไม่ชัดเจนสำหรับฉัน
ฉันควรใช้<resource-bundle>
และ<message-bundle>
แท็กสำหรับการแปลเป็นภาษาท้องถิ่นเมื่อfaces-config.xml
ใดและอย่างไร ความแตกต่างระหว่างสองคนนั้นไม่ชัดเจนสำหรับฉัน
คำตอบ:
<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>
จะใช้เมื่อใดก็ตามที่คุณต้องการลงทะเบียนมัดทรัพยากรที่มีการแปลที่สามารถใช้ได้ตลอดทั้งการประยุกต์ใช้ 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>
ตั้งแต่ 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 วิธีที่จะจำสถานที่เลือกต่อเซสชั่นแทนการต่อคำขอ