웹 개발

Spring i18n ( 다국어 ) - Locale Resolver

노루아부지 2019. 11. 17. 10:31

Locale Resolver의 종류

 

1. AbstractLocaleContextResolver

  • http의 헤더의 Accept-Language에 의해 선택된다.
  • setLocale이 지원되지 않는다. 오직 브라우저 설정에 의해서만 결정

2. SessionLocaleResolver

  • 처음 들어갈 때는 AccpetHeaderLocaleResolver처럼 브라우저의 언어 설정에 의한 Accept-Language로 값이 결정된다.
  • 단, setDefaultLocale을 설정한다면 이 값이 최우선
  • 세션으로 저장되며 org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE 라는 세션 속성 이름으로 클래스를 시리얼라이징 되어 저장

3. CookieLocaleResolver

  • SessionLocaleResolver와 속성이 동일하지만 lang 값이 바뀔 경우 세션이 아닌 쿠키에 저장된다.
  • 때문에 SessionLocaleResolver의 경우 세션이 끊어지면 언어 설정이 되돌아오지만, 이 리졸버를 이용할 경우 쿠키의 값을 우선으로 불러온다.

4. AcceptHeaderLocaleResolver

5. FixedLocaleResolver

 

 

Spring 설정 방법

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="ko" />
</bean>

 

JAVA에서 사용 방법

1. SESSION의 값 사용

@Controller
public class SessionLocaleController {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    
    @RequestMapping(value = "/setChangeLocale")
    public String changeLocale(@RequestParam(required = false) String language, HttpServletRequest request) throws IOException {
        HttpSession session = request.getSession();
        Locale locales = LocaleUtil.getLocale(language);
        // 넘어온 파라미터에 ko가 있으면 Locale의 언어를 한국어로 바꿔준다.
        // 그렇지 않을 경우 영어로 설정한다.
        logger.debug("getCountry : " + locales.getCountry());
        logger.debug("getLanguage : " + locales.getLanguage());
        
        // 세션에 존재하는 Locale을 새로운 언어로 변경해준다.
        session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locales);
        
        // 해당 컨트롤러에게 요청을 보낸 주소로 돌아간다.
        String redirectURL = "redirect:" + "/";
        
        logger.debug("redirectURL : " + redirectURL);
        
        return redirectURL;
    }
}

 

Locale currentLocale = (Locale)session.getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);

 

2. Controller에서 Locale 사용

@RequestMapping(value = "/loginPage")
public String list(Locale locale, Model model,HttpServletRequest request){
    System.out.println("*********** locale : " + locale.getLanguage());
    return "login";
}

 

3. LocaleContextHolder 사용

 

* Spring의 LocaleResolver는 JAVA가 참고하고 있는 System Locale을 설정한게 아닌 스프링의 LocaleContextHolder를 설정한 것이기 때문에 Locale.getDefault();를 사용하게 되면 전혀 다른 값이 나오게 된다.

@RequestMapping(value = "/loginPage")
public String list(Locale locale, Model model,HttpServletRequest request){
    System.out.println("*********** holder : " + LocaleContextHolder.getLocale().getLanguage());
    return "login";
}

 

 

728x90
loading