스프링 프레임워크를 이용하여 다국어 메세지 처리를 설정할 수 있다.
다국어 처리를 통해 동일 페이지를 언어별로 만들지 않고, 한페이지 내 에서 언어코드를 이용하여 사용자에게 설정된 언어로 웹 페이지를 제공 할 수 있게 된다.
프로젝트를 진행하면서 다국어 관련 자료를 많이 찾게 되었고, 적용방법 또한 여러 방법이 있었다.
일반적인 방법은
1. 다국어 메세지 설정 파일 작성
2. 메세지 프로퍼티 파일 작성
3. 인터럽트를 통해 Language Code 변경 혹은 설정
4. java 혹은 jsp 파일 내에서 메세지 key 값으로 불러오기
하지만
내가 적용 하고 싶은 방법은 인터럽트를 통해서 Language Code를 설정하는 것이 아닌
로그인 성공하게 되면 로그인 한 사용자DB 정보 중 Language Code 값을 통해 웹 사이트의 Language Code를 설정하고자 한다.
첫째로 다국어 처리 관련 설정을 할 'message=context.xml' 을 작성한다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages/message"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="ko"/>
</bean>
</beans>
messageSource를 사용하기 위해 bean에 추가하고, basename 으로 'classpath:messages/message' 를 설정 기본 인코딩 값을 UTF-8로 설정
- basename의 설명은 아래 그림을 참조하자
- 그림에서 보면 classpath는 resources로 설정되어 있고 그 하위에 messages 폴더가 존재, 그 하위에 message_xx.properties 파일들로 구성되어있는 곳을 basename으로 설정한 것이다.
위 messages, message의 색으로 구분 할 수가 있다.
<!-- ################### MessageSource ################### -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/i18n/ui</value>
<value>classpath:/i18n/message</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
위의 경우처럼 ui, message 두개의 프로퍼티로 나눠서 구분 할 수도 있다.
message_xx.properties 파일 내에는 각 언어에 맞게 key = value 형식으로 값을 채워 넣는다.
이후 사용 방법으로는 다른 블로거의 내용을 참조 했다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
4. /WEB-INF/spring/appServlet/servlet-context.xml 파일을 수정하여 언어를 변경하기 위한 인터셉터를 등록합니다.
<interceptors>
<beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
</interceptors>
servlet-context.xml 파일의 기본 네임스페이스가 mvc 이므로 바로 <interceptors> 를 사용했습니다. 만약 기본 네임스페이스가 beans 등으로 mvc가 아니라면 <mvc:interceptors> 로 사용되어야 할 것입니다. 이 설정의 의미는 /i18n.do?lang=ko, /i18n.do?lang=en 등으로 요청을 보내면 컨트롤러 앞단에서 요청을 가로채서 언어를 변경하는 역할을 수행합니다.
출처: https://offbyone.tistory.com/24 [쉬고 싶은 개발자]
5. Java 코드에서 다국어 메세지를 사용하는 방법 입니다. com.tistory.pentode.HomeController.java 파일 입니다.
package com.tistory.pentode;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired
SessionLocaleResolver localeResolver;
@Autowired
MessageSource messageSource;
@RequestMapping(value = "/i18n.do", method = RequestMethod.GET)
public String i18n(Locale locale, HttpServletRequest request, Model model) {
// RequestMapingHandler로 부터 받은 Locale 객체를 출력해 봅니다.
logger.info("Welcome i18n! The client locale is {}.", locale);
// localeResolver 로부터 Locale 을 출력해 봅니다.
logger.info("Session locale is {}.", localeResolver.resolveLocale(request));
logger.info("site.title : {}", messageSource.getMessage("site.title", null, "default text", locale));
logger.info("site.count : {}", messageSource.getMessage("site.count", new String[] {"첫번째"}, "default text", locale));
logger.info("not.exist : {}", messageSource.getMessage("not.exist", null, "default text", locale));
//logger.info("not.exist 기본값 없음 : {}", messageSource.getMessage("not.exist", null, locale));
// JSP 페이지에서 EL 을 사용해서 arguments 를 넣을 수 있도록 값을 보낸다.
model.addAttribute("siteCount", messageSource.getMessage("msg.first", null, locale));
return "i18n";
}
콘솔 출력 결과 입니다. (언어가 영어로 선택되어 있는 경우)
messageSource의 가장 기본 적인 사용법은 다음과 같습니다.
message.getMessage(메세지 키값, 대체할 값이 있을경우 값의 배열, 메세지 기본값, 로케일);
메세지 키값에 해당하는 값이 없을 경우 세번째 인자인 메세지 기본값이 출력됩니다.
출처: https://offbyone.tistory.com/24 [쉬고 싶은 개발자]
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
내가 적용한 부분은 jsp 부분에서 다음과 같이 호출 하였다.
<dt class="column-table__title column-table__title--border">
<spring:message code="site.title" />
</dt>
jsp 에서 사용 방법은 <spring:message code="properties 에서 설정한 key 값" />
더 자세히 찾아보면 다음고 같이 추가적인 옵션을 넣어서 사용할 수도 있다.
<spring:message code="properties 에서 설정한 key 값" arguments="value" text="default 값" />
arguments 옵션은 properties 파일 내 {0}, {1}... 등등으로 변수를 선언해주고 선언해준 변수에 값을 넣을 때 사용 된다.
여기 까지가 구글링을 통해 찾아본 다국어 적용 방법이고 이후는 프로젝트 상황에 맞게 추가적으로 진행한
내가 적용 하고 싶은 방법은 인터럽트를 통해서 Language Code를 설정하는 것이 아닌
로그인 성공하게 되면 로그인 한 사용자DB 정보 중 Language Code 값을 통해 웹 사이트의 Language Code를 설정하고자 한다.
에 대한 내용이다.
public void loginSuccess(HttpServletRequest request,HttpServletResponse response,
Authentication authentication) {
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
/**
* 다국어 적용을 위한 초기 언어 설정
* */
if(loginUser.getLangCode().equals("zh_CN")) {
Locale locale = new Locale("zh","CN");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}
else if(loginUser.getLangCode().equals("en")) {
Locale locale = new Locale("en");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}
else {
Locale locale = new Locale("ko");
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setLocale(request,response,locale);
}
}
위의 loginSuccess 함수가 실행 되는 순서는 다음과 같다.
사용자 로그인 - springSecurity 설정파일에서 지정한 loginSuccessHandler 내 에서 실행 된다. 즉 로그인 이 성공하게 되면 실행되는 구조이다.
코드 내용은 loginUser에 로그인 한 사용자의 정보를 불러오고 그 loginUser 안에서 LangCode(Language Code) 값을 통해서 Locale 변수를 선언한다.
언어 값을 지정하여 만들어진 locale 변수를 통해 SessionLocaleResover에 우리는 Locale(언어 값)을 지정한다.
해당 작업은 위에서 설명한 인터럽트를 통해서 SessionLocaleResover 에 언어 값을 지정해주는 작업을 수동으로 로그인 성공시 지정하는 작업으로 이해하면 된다.
loginSuccessHandler 에서 위와 같은 작업을 진행하면 그 이후에는 세션이 끈기기 전까지는 계속해서 언어 값을 가지고 있을것이다.
이후에는 위에서 설명한 java, jsp 등에서 사용하는 방법을 통해 다국어 메세지 처리 기능을 사용 할 수 있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ