selfstarter

Spring JavaConfig 다국어 처리 본문

Server/Spring

Spring JavaConfig 다국어 처리

selfstarter 2019. 6. 25. 16:27

Spring JavaConfig 다국어 처리

  • 다국어 처리를 Client 단에서 하면 코드가 지저분해지고 유지보수도 어렵다
  • Spring에서 properties 파일을 이용하여 다국어 처리를 쉽게할 수 있도록 지원해준다

ContextMessageConfig

  • 다국어 설정을 할 Config(MessageConfig.java)추가
  • setBasename는 메시지 properties가 있는 위치로 설정해준다
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Configuration
public class ContextMessageConfig  {

    @Bean
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
        source.setBasename("classpath:/properties/messages/message");
        source.setDefaultEncoding("UTF-8");
        source.setCacheSeconds(60);
        source.setUseCodeAsDefaultMessage(true);

        return source;        
    }

    @Bean
    public SessionLocaleResolver localResolver() {
        return new SessionLocaleResolver();
    }
}

ServletConfig.java

  • LocaleChangeInterceptor(인터셉터)는 페이지에 lang=언어를 붙이는 역활을 한다. 이렇게 server에서 lang 값만 변경해주면 쉽게 언어 변환이 가능하다
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
    interceptor.setParamName("lang");
    return interceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry)  {
      InterceptorRegistration interceptor =  registry.addInterceptor(loginLogInterceptor());
      interceptor.addPathPatterns("/**");
      registry.addInterceptor(localeChangeInterceptor());  // 인터셉터 등록
}

properties 추가

  • message.properties, message_ko.properties, message_en.properties 파일을 추가한다.
  • properties 파일은 Untitled Text File로 추가한다
  • 유니코드로 보이게 하려면 Properties File Editor로 변경. 파일도 UTF-8이 아닌 Default(ISO-8859-1) 인코딩으로 설정한다
  • (왜 유니코드를 사용하지 잘 모르겠다)
message.properties
title=\uAE30\uBCF8 \uD0C0\uC774\uD2C0
hello=\uC548\uB155
message_ko.properties
title=\uD55C\uAD6D \uB2E4\uAD6D\uC5B4 \uD0C0\uC774\uD2C0
hello=\uC548\uB155
message_en.properties
title=base title
hello=hello

Controller.java

  • MessageSource를 사용하여 원하는 언어로 변환된 text를 가져올 수도 있다
  • sessionLocaleResolver 객체에 원하는 언어로 설정된 Locale를 전달하면 다국어 처리 완료
  • properties_ss.properties 라는 이름을 붙이고 Locale("ss")라고 해도 properties_ss.properties의 text 처리가 잘 된다. 한국어는 ko, 영어는 en이라고 정해져 있는게 아니라 properties name을 따라가는 듯
import java.util.Locale;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import com.base.controller.service.BaseService;

@Controller
public class HomeController {

    @Autowired
    @Qualifier("BaseService")
    private BaseService service;

    @Autowired
    private MessageSource messageSource;

    @Autowired
    private SessionLocaleResolver sessionLocaleResolver;

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value = "", method = RequestMethod.GET)
    public String home(Locale locale, HttpServletRequest request,  HttpServletResponse response, Model model) {        

        System.out.println("한글:" + messageSource.getMessage("title", null, "no surch", Locale.KOREA));    

        locale = new Locale("ko");
        sessionLocaleResolver.setLocale(request, response, locale);

        model.addAttribute("sessionLocale", sessionLocaleResolver.resolveLocale(request));

        return "home";
    }
}

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title><spring:message code="title" text="사이트" /></title>
</head>
<body>
<h1>
    <spring:message code="hello" text="기본 text" />
</h1>
<p>Session Locale : <c:out value="${sessionLocale}" /></p>
</body>
</html>

SOLVED

서버에서 다국어 처리 불가

  • 서버에서 messageSource 를 이용해 원하는 언어를 가져오려고 했지만 가져오지 못했다. 알고보니 properties 위치를 잘못 설정했다.setBasename 수정 후 해결

다국어 처리가 안되는 상황 발생

  • 서버에서 messageSource 를 이용해 원하는 언어로 가져올 수 있었는데 CLIENT 언어는 계속 영어인 경우가 있었다. 알고보니 내가 Chrome에 기본 언어 설정을 영어로 해서 어떤 언어이든 간에 무조건 영어로 번역되는 듯 했다(explore는 다국어 처리가 잘됨) Chrom 언어 변경 후 해결

'Server > Spring' 카테고리의 다른 글

json list 안에 list 읽기  (0) 2019.07.15
Spring resources 위치 가져오기  (0) 2019.07.13
전자정부프레임워크(egov) logback 설정  (0) 2019.07.12
Invalid bound statement error 해결  (1) 2019.07.10
@ControllerAdvice JavaConfig  (0) 2019.07.01
Comments