[spring] java 다국어지원 -- JSP, SPRING




다국어지원을 위해 ASP.NET에서는 Global Resource를 이용하였었는데, Java진영에서는 아래와 같이 ResourceBundle을 이용해 개발이 가능하다. 실제로 Glocal Resource와 개념은 거의 같으므로 Global Resource를 사용해본 유저라면 ResourceBundle도 쉽게 이용이 가능하다.


1. Resource 파일

먼저 Resource파일을 만든다. (리소스명_locale.properties)

[resource_ko_KR.properties]
TEST: 하이

[resource_en_US.properties]
TEST: hello



그리고나서 이 리소스파일들을 인식하기 위해 해당 리소스파일이 들어있는 폴더를 추가해준다.

Eclipse Project명 > 마우스 오른쪽버튼 > Properies > Java Build Path > Source탭

Add Folder버튼을 눌러 위의 리소스파일을 만든 폴더를 추가해준다.


2. Locale지정

ResourceBundle객체를 이용해 Locale을 지정하여 Locale에 맞는 리소스파일의 문구를 얻는다.

import java.util.Locale;
import java.util.ResourceBundle;

// resource 는 리소스명
// Locale을 지정하지 않으면 기본 Locale이 지정된다. (한국어에서는 ko_KR)
ResourceBundle bundle = ResourceBundle.getBundle("resource");

OR

// en_US Locale을 지정하면 resource_en_US.properties의 내용을 읽을 수 있다.
ResourceBundle bundle = ResourceBundle.getBundle("resource", new Locale("en", "US"));



3. Resource파일 문구읽기

위에 지정했던 TEST라는 문구를 읽기 위해 아래와 같이 하면,

System.out.println(bundle.getString("TEST"));

Locale이 ko_KR인 경우에는 "하이"가 나오고, en_US인 경우에는 "hello"가 나타나게 된다.


한글인 경우에는 깨져서 나올 수 있는데 이럴 때는 아래와 같이 UTF8로 변환해야 한다.

System.out.println(new String(bundle.getString("TEST").getBytes("8859_1"), "utf-8"));


추가) 2014.11.27
spring messagesource locale(다국어 지원)
http://dualstun.blogspot.kr/2013/10/spring-framework-spring-messagesource.html

불러올 언어별 프로퍼티파일 생성

message.properties(아래 두 파일이 없을 경우 불러온다)
message_ko.properties
message_en.properties

ex) test.input.name=이름입력

------------------------------------------------------------------------------

아래처럼 리스트에 ko파일과 en파일을 넣으면 우선적으로 접속한 사용자의 로컬언어를 먼저 찾고 그다음 없을 경우 기본 파일의 내용을 가져오게 된다.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
   // UTF-8로 지정하고 properties파일을 UTF-8형식으로 사용하면 한글이 정상적으로 로드됨
  
<property name="defaultEncoding" value="UTF-8"/>
   <property name="basenames">
       <list>
           <value>classpath:message</value>
       </list>
   </property>
  

   // true인 경우, locale에 해당하는 file이 없을 경우 system locale을 사용
   <property name="fallbackToSystemLocale" value="false"/>  
   

   // 5초마다 업데이트 된 properties 파일을 새로 로드함
   <property name="cacheSeconds" value="5"/>
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    // 세션에 locale 정보가 없을 경우 기본 언어
   <property name="defaultLocale" value="ko" /> 
</bean>


// 세션에 locale 정보를 업데이트 하는 세션 컨트롤러
<bean id="/setChangeLocale.do" class="com.prompt.cam.management.controller.SessionLocaleController" /> 

------------------------------------------------------------------------------

package com.test.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Controller
public class SessionLocaleController {

    @RequestMapping(value = "/setChangeLocale.do")
    public String changeLocale(@RequestParam(required = false) String locale,
        ModelMap map, HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        Locale locales = null;

        // 넘어온 파라미터에 ko가 있으면 Locale의 언어를 한국어로 바꿔준다.
        // 그렇지 않을 경우 영어로 설정한다.
        if (locale.matches("ko")) {
            locales = Locale.KOREAN;
        } else {
            locales = Locale.ENGLISH;
        }

        // 세션에 존재하는 Locale을 새로운 언어로 변경해준다.
        session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locales);
      
        // 해당 컨트롤러에게 요청을 보낸 주소로 돌아간다.
        String redirectURL = "redirect:" + request.getHeader("referer");
        return redirectURL;
    }
}


------------------------------------------------------------------------------
실제 소스에 적용시 아래와 같이 넣어준다.
태그 라이브러리 호출
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

자바스크립트에 넣을 경우
<spring:message code="test.input.name" javaScriptEscape="true"/>

HTML TAG안에 TEXT로 넣을 경우
<spring:message code="test.input.name"/>
------------------------------------------------------------------------------

적용 후 jsp에서 간단하게 아래와 같이 테스트 해볼 수 있다.

<a href="/setChangeLocale.do?locale=ko">한국어</a>
<a href="/setChangeLocale.do?locale=en">ENGLISH</a>


덧글

댓글 입력 영역



20140817_300_250

통계 위젯 (화이트)

48227
1037
1030811