스프링 다국어처리를 이용하려면 controller를 통해서 해당 페이지로 이동하게 해야 한다.
servlet-context.xml에서 다국어 처리부분을 기술
<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<benas:porperty name="basenames" value="locale/messages"/>
</beans:bean>
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<beans:property name="defaultLocale" value="ko" />
</beans:bean>
<mvc:interceptors>
<beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
</mvc:interceptors>
ResourceBundleMessageSource 부분이 바로 위에서 저장된 messages 파일들을 읽어오는 부분이다. 해당언어의 파일들이 존재하면 된다. basenames에서 경로/파일명 앞부분을 적어준다.
localeResolver에서 다국어처리 방법을 선택한다. localeResolver는 3가지 종류가 있다.
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
<beans:property name="cookieName" value="clientlanguage" />
<beans:property name="cookieMaxAge" value="100000" />
<beans:property name="cookiePath" value="web/cookie" />
</beans:bean>
속성 | 기본값 | 설명 |
---|---|---|
cookieName | classname+locale | 저장할 쿠키명 |
cookieMaxAge | -1 | -1은 브라우저를 닫으면 지움 |
cookiePath | / | 경로를 지정할 수 있음 |
만약 저장된 쿠키값이 없어서 특정값으로 세팅하고자 한다면 defaultLocale를 추가하면 된다.
<beans:property name="defaultLocale" value="ko" />
SessionLocaleResolver나 CookieLocaleResolver에 defaultLocale이 없다면 브라우저의 언어설정을 따르게 된다.
그렇게 되면 링크를 통해 언어변환처리를 할 수 있다. <mvc:interceptors></mvc:interceptors>로 감싸면 Spring MVC에서 controller를 통해서 접근시 가로채서 LocaleChangeInterceptor를 적용하게 된다.
파일명 | 파일 내용 |
---|---|
messages_en.properties | hello=Hello |
messages_ko.properties | hello=안녕하세요 |
예시 - Spring Boot를 이용한 다국어(MessageSource) 설정하기
WebMvcConfigurer 인터페이스 구현
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@Configurer
public class WebMvcConfig implements WebMvcConfigurer{
@Bean
public ReloadableResourceBundleMessageSource messageSource(){
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
// 메세지 프로퍼티파일의 위치와 이름을 지정한다.
source.setBasename("classpath:/messages/message");
// 기본 인코딩을 지정한다.
source.setDefaultEncoding("UTF-8");
// 프로퍼티 파일의 변경을 감지할 시간 간격을 지정한다.
source.setCacheSeconds(60);
//없는 메세지일 경우 예외를 발생시키는 대신 코드를 기본 메세지로 한다.
source.setUseCodeAsDefaultMessage(true);
return source;
}
/**
변경된 언어 정보를 기억할 로케일 리졸버를 생성한다.
여기서는 세션에 저장하는 방식을 사용한다.
*/
@Bean
public SessionLocaleResolver localeResolver(){
return new SessionLocaleResolver();
}
/**
언어 변경을 위한 인터셉터를 생성한다.
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParameName("lang");
return interceptor;
}
/**
인터셉터를 등록한다.
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(localeChangeInterceptor());
}
}
message 프로젝트 위치 및 파일명