다국어 처리
웹 브라우저를 사용하는 국가에 따라 다양한 언어 및 지역을 지원하는 서비스
JSP 페이지에 JSTL의 fmt 태그를 이용하면 언어별로 페이지를 따로 만들 필요 없이
아주 간단하게 다국어를 지원할 수 있다.
i18n
Internationalization
국제화
L10n
localization
지역화
로케일 감지하기
웹 브라우저에 설정된 국가와 언어 이름을 아아내는 것을 로케일 감지라고 한다.
Locale 클래스를 이용한 다국어 처리
Locale 클래스를 이용한 다국어 처리 예제 Chap15_MultiLanguage
locale01.jsp
<%@page import="java.text.NumberFormat"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.util.Date"%>
<%@page import="java.util.Locale"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Locale클래스를 이용한 다국어 처리-1</title>
</head>
<body>
<h3>현제 로케일의 국가, 날짜, 통화</h3>
<%
//요청한 클라이언트의 Locale가져옴
Locale locale = request.getLocale();
Date date = new Date();
//DateFormat : 정해진 포멧을 상수(FULL, LONG, MEDIUM, SHORT)로 제공하고 있는 클래스
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
//SimpleDateFormat : DateFormat을 상속받고, 원하는 출력 형태를 직접 지정하고자 할때 사용
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
%>
<p>날짜 : <%=date %>
<p>날짜2 : <%=dateFormat.format(date) %>
<p>날짜3 : <%=sdf.format(date) %>
<p>국가 : <%=locale.getDisplayCountry() %>
<p>국가코드 : <%=locale.getCountry() %>
<p>국가언어 : <%=locale.getDisplayLanguage() %>
<p>국가언어 : <%=locale.getDisplayLanguage(locale) %>
<p>국가언어 : <%=locale.getDisplayName() %>
<p>숫자(123456.67) : <%=numberFormat.format(123456.67) %>
</body>
</html>
Locale클래스를 인스턴스로 생성하여 처리
locale02.jsp
<%@page import="java.text.NumberFormat"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.util.Date"%>
<%@page import="java.util.Locale"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Locale클래스를 이용한 다국어 처리-2</title>
</head>
<body>
<h3>Locale클래스를 인스턴스로 생성하여 처리</h3>
<%
//Locale locale = new Locale("fr", "CA"); //인스턴스 생성
Locale locale = Locale.TAIWAN; //Loclae클래스의 상수 이용
Date date = new Date();
//DateFormat : 정해진 포멧을 상수(FULL, LONG, MEDIUM, SHORT)로 제공하고 있는 클래스
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
//SimpleDateFormat : DateFormat을 상속받고, 원하는 출력 형태를 직접 지정하고자 할때 사용
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
%>
<p>날짜 : <%=date %>
<p>날짜2 : <%=dateFormat.format(date) %>
<p>날짜3 : <%=sdf.format(date) %>
<p>국가 : <%=locale.getDisplayCountry() %>
<p>국가코드 : <%=locale.getCountry() %>
<p>국가언어 : <%=locale.getDisplayLanguage() %>
<p>국가언어 : <%=locale.getDisplayLanguage(locale) %>
<p>국가언어 : <%=locale.getDisplayName() %>
<p>숫자(123456.67) : <%=numberFormat.format(123456.67) %>
</body>
</html>
모든 Locale인자값 출력하기
allLocale.jsp
<%@page import="java.util.Locale"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>모든 Locale인자값 출력하기</title>
</head>
<body>
<%
for(Locale locale : Locale.getAvailableLocales()) {
%>
<p>언어코드 : <%=locale.getLanguage() %>
<p>국가코드 : <%=locale.getCountry() %>
<p>국가명 : <%=locale.getDisplayCountry() %>
<p>언어,국가 : <%=locale.getDisplayName() %>
<%
}
%>
<p>총 Locale수 : <%=Locale.getAvailableLocales().length %>
</body>
</html>
플러그인 설치하기
properties editor 검색
ResourceBundle Editor 1.0.5 Install
태그 라이브러리 jar
한글을 입력한 동시에 유니코드값으로 변경되는 에디터 설정하기
myBundle_ko.properties
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
title=\uC790\uBC14 \uC11C\uBC84 \uD398\uC774\uC9C0
username=\uAD00\uB9AC\uC790
password=1234
title=자바 서버 페이지
username=관리자
password=1234
myBundle_en.properties
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
title=Java Server Page
username=admin
password=1234
다국어처리-fmt태그-01(로케일)
jstl_fmt.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- fmt태그 라이브러리 사용하기위해 teglib 지시자 설정 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>다국어처리-fmt태그-01(로케일)</title>
</head>
<body>
<p>--------------------------기본 로케일--------------------------</p>
<!-- 가져올 번들을 resourceBundle변수에 저장함 -->
<fmt:setBundle basename="kr.gov.bundle.myBundle_ko" var="resourceBundle"/> <!-- /Chap15_MultiLanguage/src/kr/gov/bundle/myBundle_ko.properties를 kr.gov.bundle.myBundle_ko로 변경-->
<p>제목 : <fmt:message key="title" bundle="${resourceBundle }"/> <!-- fmt:message : 지정한 언어에 해당하는 언어를 표시함 -->
<!-- username의 키를 주면 value값 관리자를 리턴하는데 그 값을 user변수에 저장 -->
<p><fmt:message key="username" var="user" bundle="${resourceBundle }"/>
이름 : ${user }
<p>비밀번호 : <fmt:message key="password" bundle="${resourceBundle }" />
<p>--------------------------영문 로케일--------------------------</p>
<fmt:setLocale value="en"/>
<fmt:setBundle basename="kr.gov.bundle.myBundle_en" var="resourceBundle"/> <!-- /Chap15_MultiLanguage/src/kr/gov/bundle/myBundle_ko.properties를 kr.gov.bundle.myBundle_ko로 변경-->
<p>제목 : <fmt:message key="title" bundle="${resourceBundle }"/> <!-- fmt:message : 지정한 언어에 해당하는 언어를 표시함 -->
<!-- username의 키를 주면 value값 관리자를 리턴하는데 그 값을 user변수에 저장 -->
<p><fmt:message key="username" var="user" bundle="${resourceBundle }"/>
이름 : ${user }
<p>비밀번호 : <fmt:message key="password" bundle="${resourceBundle }" />
</body>
</html>
다국어처리-fmt태그-02(숫자)
jstl_fmt_number.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>다국어처리-fmt태그-02(숫자)</title>
</head>
<body>
<!-- setLocale태그 이용하여 로케일 정해주면 그에 맞는 숫자,통화가 그 로케일로 맞춰진다. -->
<fmt:setLocale value="en_US"/>
<!-- fmt:formatNumber태그는 기본적으로 groupingUsed속성이 true로 되어 있어서
천단위자리에 ,로 구분되어진다. false하면 없어진다.-->
<p>숫자 : <fmt:formatNumber value="4545000"/> <!-- 천자리 구분(기본값) -->
<p>숫자 : <fmt:formatNumber value="4545000" groupingUsed="true"/>
<p>숫자 : <fmt:formatNumber value="4545000" groupingUsed="false"/><!-- 천자리구분 안함 -->
<p><fmt:formatNumber value="4545000" type="currency"/> <!-- ₩ -->
<p><fmt:formatNumber value="4545000" type="currency" currencySymbol="원"/>
<p><fmt:formatNumber value="0.45" type="percent"/> <!-- 45% -->
<!-- minIntegerDigits : 최대자리수, minFractionDigits : 소주점 자리 -->
<p><fmt:formatNumber value="4545000" minIntegerDigits="10" minFractionDigits="2"/>
<!-- 0은 자리수를 차지하고, #은 있으면 출력하고 없으면 출력을 하지 않음 -->
<p><fmt:formatNumber value="4545000" pattern="0000000000.000"/> <!-- 0004545000.000 -->
<p><fmt:formatNumber value="4545000" pattern="#########.###"/> <!-- 4545000 -->
</body>
</html>
다국어처리-fmt태그-03(날짜)
jstl_fmt_date.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>다국어처리-fmt태그-03(날짜)</title>
</head>
<body>
<!-- jsp:useBean : 액션태그 -->
<p><jsp:useBean id="now" class="java.util.Date" />
<!-- type에 따라서 출력내용 바뀜 -->
<p>date타입 : <fmt:formatDate value="${now }" type="date"/>
<p>time타입 : <fmt:formatDate value="${now }" type="time"/>
<p>both타입 : <fmt:formatDate value="${now }" type="both"/>
<!-- dateStyle에 따라 출력 내용이 바뀜 -->
<p>default 스타일 : <fmt:formatDate value="${now }" type="both" dateStyle="default"/>
<p>short 스타일 : <fmt:formatDate value="${now }" type="both" dateStyle="short"/> <!-- 21. 1. 22. 오후 3:16:38 -->
<p>medium 스타일 : <fmt:formatDate value="${now }" type="both" dateStyle="medium"/>
<p>long 스타일 : <fmt:formatDate value="${now }" type="both" dateStyle="long"/>
<p>full 스타일 : <fmt:formatDate value="${now }" type="both" dateStyle="full"/>
<!-- 직접 패턴을 주는 방법 -->
<p>패턴주기 : <fmt:formatDate value="${now }" type="both" pattern="yyyy년 MM월 dd일 HH시 mm분 ss초 E요일"/>
<p>패턴주기 : <fmt:formatDate value="${now }" type="both" pattern="yyyy-MM-dd HH:mm:ss"/>
</body>
</html>
다국어처리-fmt태그-04(타임존)
jstl_fmt_timeZone.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>다국어처리-fmt태그-04(타임존)</title>
</head>
<body>
<p><jsp:useBean id="now" class="java.util.Date"/>
<p>한국 : <fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/>
<p><fmt:timeZone value="America/New_York">
<p>뉴욕 : <fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/>
</fmt:timeZone>
<p><fmt:timeZone value="Europe/rundon">
<p>런던 : <fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/>
</fmt:timeZone>
<h2>타임존 목록</h2>
<c:forEach var="id" items="<%=java.util.TimeZone.getAvailableIDs() %>">
타임존 이름 : ${id }<br/>
</c:forEach>
<p>총 타임존의 수 : <c:out value="<%=java.util.TimeZone.getAvailableIDs().length %>"></c:out>
</body>
</html>
......