JSTL 국제화(Internationalization, i18n) 태그는 웹 애플리케이션을 다양한 언어와 지역 설정(Locale)에 맞게 쉽게 구성할 수 있도록 지원하는 태그 라이브러리. <fmt: ... > 형태로 사용되며, 숫자, 날짜, 시간 형식, 메시지 등을 해당 지역에 맞는 형식으로 표시할 수 있다.
JSTL 국제화 태그를 사용하려면 JSP 페이지 상단에 다음과 같은 taglib 지시어를 추가해야 한다.
Java
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
1. 로케일(Locale) 설정
- 로케일: 언어, 국가, 문자 집합 등 특정 지역의 문화적 설정을 나타내는 식별자. (예: 한국어-한국 ko_KR, 영어-미국 en_US, 일본어-일본 ja_JP)
- <fmt:setLocale>:
- JSP 페이지에서 사용할 로케일을 설정.
- 속성:
- value: 로케일 지정 (문자열 또는 java.util.Locale 객체)
- scope: 로케일 설정이 적용될 범위 (page, request, session, application, 기본값: page)
- variant : 추가적인 변형을 지정(잘 사용하지 않음)
- 예시:
Java
<fmt:setLocale value="ko_KR" /> <%-- 한국어(대한민국) 로케일 설정 --%>
<fmt:setLocale value="en_US" scope="session" /> <%-- 영어(미국) 로케일을 세션 범위에 설정 --%>
<fmt:setLocale value="${param.lang}" /> <%-- 요청 파라미터 lang 값으로 로케일 설정 --%>
2. 리소스 번들(Resource Bundle) 사용
- 리소스 번들: 여러 언어에 대한 메시지(텍스트)를 key-value 형태로 저장해 놓은 파일들의 집합. 각 언어별로 별도의 파일(.properties)을 만든다.
- messages.properties (기본)
- messages_ko.properties (한국어)
- messages_en.properties (영어)
- messages_ja.properties (일본어)
- <fmt:bundle>:
- JSP 페이지에서 사용할 리소스 번들을 지정.
- 속성:
- basename: 리소스 번들 파일들의 기본 이름 (확장자 제외) (필수)
- prefix: 리소스 번들 키에 접두어를 붙임.
- <fmt:setBundle>:
- 리소스 번들을 변수에 저장하여 다른 곳에서 재사용할 수 있도록 한다.
- 속성:
- basename: 리소스 번들 파일들의 기본 이름 (필수)
- var: 리소스 번들을 저장할 변수 이름 (필수)
- scope: 변수의 유효 범위
- 리소스번들 탐색 순서
- basename + _ + language + _ + country + _ + variant
- basename + _ + language + _ + country
- basename + _ + language
- basenam
- 예시:
-
Java
<%-- messages 리소스 번들 사용 --%>
<fmt:bundle basename="messages">
<fmt:message key="welcome.message" />
</fmt:bundle>
<%-- errors 리소스 번들을 errorMessages 변수에 저장 --%>
<fmt:setBundle basename="errors" var="errorMessages" scope="request" />
<fmt:message key="invalid.input" bundle="${errorMessages}" />
3. 메시지 출력 (<fmt:message>)
- 기능: 리소스 번들에서 지정된 키(key)에 해당하는 메시지를 가져와 출력.
- 속성:
- key: 리소스 번들에서 가져올 메시지의 키 (필수)
- bundle: 사용할 리소스 번들 (<fmt:bundle> 또는 <fmt:setBundle>로 지정)
- var: 메시지를 저장할 변수 이름 (출력하지 않고 변수에 저장)
- scope: 변수의 유효 범위
- <fmt:param> (중첩 태그): 메시지에 파라미터를 전달하여 동적으로 메시지를 구성할 수 있다.
- 예시:messages.properties (기본):messages_ko.properties (한국어):messages_en.properties (영어):
-
사용예시:
greeting=Hello, {0}!
date.label=Date
number.label=Number
currency.label=Currency
greeting={0}님, 안녕하세요!
date.label=날짜
number.label=숫자
currency.label=통화
greeting=Hello, {0}!
date.label=Date
number.label=Number
currency.label=Currency
<fmt:bundle basename="messages">
<fmt:message key="greeting">
<fmt:param value="${userName}" />
</fmt:message>
<br>
<fmt:message key="date.label" />: <fmt:formatDate value="${now}" type="date" dateStyle="long"/><br>
<fmt:message key="number.label"/>: <fmt:formatNumber value="12345.67" type="number"/><br>
<fmt:message key="currency.label"/>: <fmt:formatNumber value="12345.67" type="currency" currencyCode="KRW"/>
</fmt:bundle>
<%-- 메시지를 변수에 저장 --%>
<fmt:message key="error.message" var="errorMessage" scope="request" />
<p>Error: ${errorMessage}</p>
4. 숫자 형식 지정 (<fmt:formatNumber>)
- 기능: 숫자를 지정된 형식(통화, 퍼센트, 소수점 자리수 등)으로 변환하여 출력.
- 속성:
- value: 형식화할 숫자 (필수)
- type: 형식 (number, currency, percent, 기본값: number)
- pattern: 사용자 정의 형식 패턴 (예: "#,##0.00")
- currencyCode: 통화 코드 (예: USD, KRW, EUR)
- currencySymbol: 통화 기호 (예: $, ₩, €)
- groupingUsed: 천 단위 구분 기호 사용 여부 (true/false, 기본값: true)
- maxIntegerDigits: 정수 부분의 최대 자릿수
- minIntegerDigits: 정수 부분의 최소 자릿수
- maxFractionDigits: 소수 부분의 최대 자릿수
- minFractionDigits: 소수 부분의 최소 자릿수
- var: 포맷팅된 결과를 저장할 변수 이름. 지정되면 결과를 출력하는 대신 변수에 저장
- scope: 변수의 유효 범위(page, request, session, application), var속성이 있을 때 사용
- 예시:
-
- Java
<fmt:formatNumber value="12345.678" type="number" /> <%-- 12,345.678 --%>
<fmt:formatNumber value="12345.678" type="currency" currencyCode="USD" /> <%-- $12,345.68 --%>
<fmt:formatNumber value="0.75" type="percent" /> <%-- 75% --%>
<fmt:formatNumber value="12345.678" pattern="#,##0.00" /> <%-- 12,345.68 --%>
<fmt:formatNumber value="1234.5678" maxIntegerDigits="3" var="formattedNumber" scope="request"/>
5. 날짜/시간 형식 지정 (<fmt:formatDate>)
- 기능: 날짜/시간 객체(java.util.Date, java.time.* 등)를 지정된 형식으로 변환하여 출력.
- 속성:
- value: 형식화할 날짜/시간 객체 (필수)
- type: 형식 (date, time, both, 기본값: date)
- dateStyle: 날짜 형식 (default, short, medium, long, full)
- timeStyle: 시간 형식 (default, short, medium, long, full)
- pattern: 사용자 정의 형식 패턴 (예: "yyyy-MM-dd HH:mm:ss")
- timeZone: 시간대 (예: "America/Los_Angeles")
- var: 포맷팅된 결과를 저장할 변수의 이름
- scope: 변수를 저장할 범위
- 예시:
-
Java
<% java.util.Date now = new java.util.Date(); %>
<c:set var="now" value="<%= now %>" />
<fmt:formatDate value="${now}" type="date" dateStyle="short" /> <%-- 23. 7. 19. --%>
<fmt:formatDate value="${now}" type="time" timeStyle="long" /> <%-- 오후 5:17:27 GMT+09:00 --%>
<fmt:formatDate value="${now}" type="both" pattern="yyyy-MM-dd HH:mm:ss" /> <%-- 2023-07-19 17:17:27 --%>
<fmt:timeZone value="America/Los_Angeles">
<fmt:formatDate value="${now}" type="both" timeStyle="long" dateStyle="long"/>
</fmt:timeZone>
6. <fmt:timeZone> 및 <fmt:setTimeZone>
- <fmt:timeZone>: 태그 몸체 안에서만 유효한 시간대를 설정.
- value: 시간대 ID (예: "America/Los_Angeles", "Asia/Seoul")
```jsp
<fmt:timeZone value="GMT">
<fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full"/>
</fmt:timeZone>
```
- <fmt:setTimeZone>: 설정한 시간대를 변수에 저장하거나, 지정된 범위(scope)의 기본 시간대로 설정.
- value: 시간대
- var: 시간대 정보(TimeZone)를 저장할 변수
- scope: 변수의 유효 범위
<fmt:setTimeZone value="GMT" var="gmtTimeZone" scope="session"/>
7. <fmt:requestEncoding>
- 요청 파라미터의 문자 인코딩을 설정.
- value : 사용할 문자 인코딩
Java
<fmt:requestEncoding value="UTF-8" />