Spring에서 제공하는 다국어 설정을 위한 인터페이스이다.
국제화를 위해 Locale 값을 얻어올 때 사용되며, 기본 구현체는 AcceptHeaderLocaleResolver
를 사용한다.
Set-Cookie: en_US
@Configuration
public class LocaleConfig {
/**
* LocaleResolver 설정
* - Cookie 방식 사용
*/
@Bean
public LocaleResolver localeResolver() {
// 쿠키
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
cookieLocaleResolver.setCookieHttpOnly(true);
return cookieLocaleResolver;
}
}
@Configuration
public class LocaleConfig {
/**
* LocaleResolver 설정
* - Session 방식 사용
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.ENGLISH);
return sessionLocaleResolver;
}
}
@Controller
public class IndexController {
@RequestMapping("/")
public String changeLocale(
@RequestParam("lang") String language,
HttpSession session
) {
session.setAttribute(
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
new Locale(language)
);
return "form/items";
}
}
HttpSession의 setAttribute 메서드를 통해 위와 같이 Session에 저장된 Locale 값을 바꿀 수 있다.
하지만, 위 방법은 다른 URL로 Redirect가 힘들다는 단점이 있다.
그래서 위 방법보다 아래의 인터셉터를 사용하는 방법을 많이 사용한다.
@Configuration
public class LocaleConfig extends WebMvcConfigurationSupport {
/**
* Locale 정보 변경 ( 인터셉터 )
* - 모든 URL에 대해 ?lang= 쿼리를 날리면 이 인터셉터를 지난다.
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
/**
* 인터셉터 등록
*/
@Override
protected void addInterceptors(
InterceptorRegistry registry
) {
registry.addInterceptor(localeChangeInterceptor());
}
}
Spring에서 제공하는 LocaleChangeInterceptor
를 이용하여 어떤 URL 경로에 상관없이 ?lang=
쿼리를 추가하는 것으로 Session에 저장된 Locale 값을 변경할 수 있다.