2014년 1월 6일 월요일

[Spring] spring + java web application 다국어 지원 설정

다국어를 사용하기 위해서는 코딩시에 여러가지 사항들을 고려 해야 한다.
spring framework 및 설정을 통해서 다국어를 사용하는 방법에 여러가지가 있다.
상황에 따라서 쿠키를 이용하거나 세션 그리고 브라우져의 언어 설정을 이용하는 방법등 다양한 방법이 있지만 세션을 이용하는게 현재 작업하는 내용과 가장 일치 하기 때문에 이 방법에 대해서 정리 하도록 한다.


[목차]

  1. 인코딩 설정 하기
  2. Spring 설정 
  3. Locale을 설정하는 Controller 클래스 작성
  4. 현재 설정된  Locale을 확인 하는 클래스 작성 
  5. 메시지를 언어 설정에 따라서 가져오는 클래스
  6. Javascript용 파일 생성하기
  7. JAVA에서 사용하는 방법
  8. JSP에서 사용 하는 방법 
  9. 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>


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;


7. JAVA에서 사용하는 방법

자바에서 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>








댓글 2개:

  1. 퍼갈게요...좋은자료네요

    답글삭제
  2. 좋은 자료 감사합니다. 너무 잘 정리 해 주셨네요

    답글삭제