Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

วิธีใช้ Resource Bundle ใน JSP (JSTL fmt:bundle)

Tag <fmt:bundle> โหลด ResourceBundle ทำให้ <fmt:message> ภายในใช้ bundle นั้นโดยไม่ต้องระบุ basename ซ้ำ

Attributes

AttributeคำอธิบายRequiredDefault
basenameBase name ของ resource bundle (fully qualified class name)Yes-
prefixPrefix เพิ่มหน้า key ใน fmt:message subtagsNo-

1. สร้าง Resource Bundle Class

package com.example;

import java.util.ListResourceBundle;

public class Messages_En extends ListResourceBundle {
    protected Object[][] getContents() {
        return new Object[][] {
            {"count.one", "One"},
            {"count.two", "Two"},
            {"count.three", "Three"},
            {"greeting", "Hello"}
        };
    }
}

คอมไพล์ → Messages_En.class วางใน WEB-INF/classes/com/example/

2. ใช้งานใน JSP

<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<html>
<body>
    <!-- แบบมี prefix -->
    <fmt:bundle basename="com.example.Messages" prefix="count.">
        <fmt:message key="one"/><br/>     <!-- ใช้ key="count.one" -->
        <fmt:message key="two"/><br/>
        <fmt:message key="three"/><br/>
    </fmt:bundle>
    
    <hr/>
    
    <!-- แบบไม่มี prefix (ใช้ key เต็ม) -->
    <fmt:bundle basename="com.example.Messages">
        <fmt:message key="count.one"/><br/>
        <fmt:message key="greeting"/><br/>
    </fmt:bundle>
</body>
</html>

ผลลัพธ์

One
Two
Three

One
Hello

Internationalization (i18n)

สร้าง bundle หลาย locale:

  • Messages_En.class (default)
  • Messages_Th.class (Thai)
  • Messages_Th_TH.class (Thai Thailand)

JSTL เลือก bundle ตาม Locale ของ request (header Accept-Language) หรือตั้งค่า <fmt:setLocale>

ตั้งค่า Locale

<fmt:setLocale value="th_TH" scope="session"/>
<fmt:bundle basename="com.example.Messages">
    <fmt:message key="greeting"/>  <-- แสดงภาษาไทย -->
</fmt:bundle>

Property Files (Alternative)

ใช้ .properties files แทน class (วางใน classpath):

# Messages.properties
greeting=Hello
count.one=One

# Messages_th.properties
greeting=สวัสดี
count.one=หนึ่ง

basename เหมือนกัน (ไม่ต้องมี _En suffix สำหรับ default)