다국어를 사용하기 위해서는 코딩시에 여러가지 사항들을 고려 해야 한다.
spring framework 및 설정을 통해서 다국어를 사용하는 방법에 여러가지가 있다.
상황에 따라서 쿠키를 이용하거나 세션 그리고 브라우져의 언어 설정을 이용하는 방법등 다양한 방법이 있지만 세션을 이용하는게 현재 작업하는 내용과 가장 일치 하기 때문에 이 방법에 대해서 정리 하도록 한다.
spring framework 및 설정을 통해서 다국어를 사용하는 방법에 여러가지가 있다.
상황에 따라서 쿠키를 이용하거나 세션 그리고 브라우져의 언어 설정을 이용하는 방법등 다양한 방법이 있지만 세션을 이용하는게 현재 작업하는 내용과 가장 일치 하기 때문에 이 방법에 대해서 정리 하도록 한다.
[목차]
- 인코딩 설정 하기
- Spring 설정
- Locale을 설정하는 Controller 클래스 작성
- 현재 설정된 Locale을 확인 하는 클래스 작성
- 메시지를 언어 설정에 따라서 가져오는 클래스
- Javascript용 파일 생성하기
- JAVA에서 사용하는 방법
- JSP에서 사용 하는 방법
- javascript 설정및 사용하는 방법
[설명]
1. 인코딩 설정하기
다국어를 사용하기 위해서는 web.xml 에서 인코딩필터를 UTF-8 로 설정해 주어야 한다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring 의 application-servlet.xml 파일에 MessageSource 를 설정한다.
아래 설정은 ReloadableResourceBundleMessageSource 을 사용하여 설정을 바꾸면 다시 읽도록 처리 하였다.
<!-- java 에서 사용하기 위해 만든 클래스 -->
3. Locale을 설정하는 Controller 클래스 작성
/**
* 세션에 있는 로케일을 변환 하는 Controller 클래스
*/
4. 현재 설정된 Locale을 확인 하는 클래스 작성
7. JAVA에서 사용하는 방법
자바에서 controller 에서 HttpRequest 객체를 넣어서 현재 locale 를 얻어 온 다음에 Prop 클래스를 통해서 메시지를 가져 온다.
8. JSP에서 사용 하는 방법
spring tag 를 통해서 값을 가져온다.
9. javascript 설정및 사용하는 방법
javascrpit 는 설정 파일을 별도로 만들었다. 이 경우 javascript에서 파일(message.i18n.js)을 지정해서 하나만 사용하는 편이 편하다.
2. Spring 설정하기
Spring 의 application-servlet.xml 파일에 MessageSource 를 설정한다.
아래 설정은 ReloadableResourceBundleMessageSource 을 사용하여 설정을 바꾸면 다시 읽도록 처리 하였다.
<!--
MessageSource 를 선언하고 설정한다.
메시지는 classpath 에 선언된곳에 놓는다 .
-->
<bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8"/>
<property name="basenames">
<list>
<value>classpath:/com/test/mydomain/message</value>
</list>
</property>
<property name="fallbackToSystemLocale" value="false"/>
<property name="cacheSeconds" value="60"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="ko" />
</bean>
<!-- java 에서 사용하기 위해 만든 클래스 -->
<bean id="prop" class="com.common.util.Prop" />
- /com/test/mydomain 이 패키지 위치에 다국어 문장을 포함한 파일을 넣는다.
message.property - 기본 언어 셋
message_ko.property - 한국어 언어셋
message_en.property - 영어 언어셋
- 파일의 내용은 다음과 같은 형식이다. ( 영어인 경우 아래 문장들이 영어로 번역되어 들어 가면된다.)
test.message=안녕하세요.test.hello={0}님 안녕하세요. {1}
{0}과 {1} 은 치환될 영역이다. 사용자가 해당 문구를 사용시에 치환해서 사용해야 하는 경우 이런식으로 메시지를 작성해서 치환하면 된다. - 기본적으로 한국어를 사용하면 굳이 message_ko.property를 만들지 않아도 된다.
3. Locale을 설정하는 Controller 클래스 작성
/**
* 세션에 있는 로케일을 변환 하는 Controller 클래스
*/
@Controller
public class LocaleController {
@RequestMapping(value = "/changeLocale")
public String changeLocale(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = false) String locale) {
HttpSession session = request.getSession();
Locale lo = null;
//step. 파라메터에 따라서 로케일 생성, 기본은 KOREAN
if (locale.matches("en")) {
lo = Locale.ENGLISH;
} else {
lo = Locale.KOREAN;
}
// step. Locale을 새로 설정한다. session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, lo);
// step. 해당 컨트롤러에게 요청을 보낸 주소로 돌아간다.
String redirectURL = "redirect:" + request.getHeader("referer");
return redirectURL;
}
}
4. 현재 설정된 Locale을 확인 하는 클래스 작성
public class LocaleUtil {
/**
* 기본 로케일을 리턴한다. 기본은 한글이다.
*/
public static Locale getDefaultLocale() {
return Locale.KOREAN;
}
/**
* HttpServletRequest 를 받아서 저장되어 있를 locale 값을 리턴한다. 없는 경우는 기본 로케일을 리턴한다.
*/
public static Locale getLocale(HttpServletRequest request) {
Locale locale = null;
HttpSession session = request.getSession();
locale = (Locale)session.getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);
if (locale == null ) {
locale = getDefaultLocale();
}
return locale;
}
}
5. 메시지를 언어 설정에 따라서 가져오는 클래스
public class Prop implements MessageSourceAware {
private static MessageSource msg;
public void setMessageSource (MessageSource msg) {
Prop.msg = msg;
}
/**
* 시스템 속성을 얻기위한 함수
* 호출 내용은 기존 메시지와 동일하나 기능적으로 구분하기 위해서 추가한 메소드 이다.
*/
public static String prop(String key) {
return Prop.msg(key);
}
public static String prop(String key, Locale locale) {
return Prop.msg(key, locale);
}
public static String propFormat(String key, Object...objects) {
return MessageFormat.format(Prop.msg(key),objects);
}
public static String propFormat(String key, Locale locale, Object...objects) {
return MessageFormat.format(Prop.msg(key, locale),objects);
}
/**
* 메지시를 리턴한다.
*/
public static String msg(String key){
return msg.getMessage(key, null, Locale.getDefault());
}
public static String msg(String key, Locale locale){
return msg.getMessage(key, null, locale);
}
}
6. javascript용 파일 생성하기
message.i18n.js 는 사용하기 편리 하도록 만든 파일이다. 파일 내용은 아래와 같다.
function loadBundles(lang) {
jQuery.i18n.properties({
name:'message',
path:'/js/message/prop/',
mode:'both',
language:lang,
callback: function() {
}
});
}
i18nProp = jQuery.i18n.prop;
자바에서 controller 에서 HttpRequest 객체를 넣어서 현재 locale 를 얻어 온 다음에 Prop 클래스를 통해서 메시지를 가져 온다.
Locale locale = LocaleUtil.getLocale(request);
String message= Prop.propFormat("message.java", locale, "[Message]","java");
8. JSP에서 사용 하는 방법
spring tag 를 통해서 값을 가져온다.
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<spring:message code="message.jsp" arguments=" 메시지, JSP"/>
9. javascript 설정및 사용하는 방법
javascrpit 는 설정 파일을 별도로 만들었다. 이 경우 javascript에서 파일(message.i18n.js)을 지정해서 하나만 사용하는 편이 편하다.
<script type="text/javascript" language="JavaScript" src="/js/lib/jquery.i18n.properties-min-1.0.9.js"></script>
<script type="text/javascript" language="JavaScript" src="/js/message/message.i18n.js"></script>
<script type="text/javascript">
<!--
jQuery(document).ready(function() {
loadBundles('<%=(LocaleUtil.getLocale(request)).toString()%>');
});
//-->
</script>
- jquery.i18n.properties-min-1.0.9.js 파일은 jquery를 이용해서 만든 i18n 용 라이브러리이다.
https://code.google.com/p/jquery-i18n-properties/downloads/list - property 파일은 message.i18n.js 파일의 path 변수에 정의된 폴더에 name 으로 정의된 형태로 만들어 주면 된다.