티스토리 뷰

 

spring boot MessageSource 다국어처리

spring reactive 기반으로 다국어처리를 한번 해보겠다. 틀린 부분도 있을것이다. webflux로 진행해보겠다. 일단 프로젝트를 하나 생성해보자. 개발환경은 인텔리j, maven기반이다. 먼저 템플릿 엔진은 thymeleaf를 사용하기 때문 아래와 같이 pom.xml에 추가해주자.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

그 다음 MessageSource 와 templateResolver 설정이다.

MessageSource beannames는 프로젝트 resources 하위 message 프로퍼티경로를 적어주면된다. messages/message는 resources 폴더아래 messages폴더아래 message.properties이렇게 있다는 것이다.application.properties에 설정해도 된다. ex) spring.messages.basename=

MessageSource 설정은 더 많다. 각자 찾아 보도록 하자. message lang 기본은 설정안했기에 ko이다.

@Configuration
@EnableWebFlux
public class WebConfig implements ApplicationContextAware, WebFluxConfigurer {

ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext context) {
this.context = context;
}

@Bean
public ITemplateResolver thymeleafTemplateResolver() {
final SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(this.context);
resolver.setPrefix("classpath:templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCacheable(false);
resolver.setCheckExistence(false);
return resolver;

}

@Bean
public ISpringWebFluxTemplateEngine thymeleafTemplateEngine() {
SpringWebFluxTemplateEngine templateEngine = new SpringWebFluxTemplateEngine();
templateEngine.setTemplateResolver(thymeleafTemplateResolver());
return templateEngine;
}

@Bean
public ThymeleafReactiveViewResolver thymeleafReactiveViewResolver() {
ThymeleafReactiveViewResolver viewResolver = new ThymeleafReactiveViewResolver();
viewResolver.setTemplateEngine(thymeleafTemplateEngine());
return viewResolver;
}

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.viewResolver(thymeleafReactiveViewResolver());
}

@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages/message");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}

LocaleResolver 설정을하자. LocaleContextResolver를 상속받고 구현해주자. 주석으로 처리된 부분은 헤더로 값을 받을때이고 바로 아래는 파라미터로localhost:8080?lang=en-us 이렇게 온 값을 받아오는 것이다.

@Configuration
public class LocaleResolver implements LocaleContextResolver {

@Override
public LocaleContext resolveLocaleContext(ServerWebExchange exchange) {
//String language = exchange.getRequest().getHeaders().getFirst("Accept-Language");
String language = exchange.getRequest().getQueryParams().getFirst("lang");
Locale targetLocale = Locale.getDefault();
if (language != null && !language.isEmpty()) {
targetLocale = Locale.forLanguageTag(language);
}
return new SimpleLocaleContext(targetLocale);
}

@Override
public void setLocaleContext(ServerWebExchange exchange, LocaleContext localeContext) {
throw new UnsupportedOperationException("Not Supported");
}

}

이제 MessageSource를 편하게 공통으로 사용할 수 있게 설정을 해주자.

@Configuration
public class MessageByLocale {

@Autowired
private MessageSource messageSource;

@Autowired
private LocaleResolver localeResolver;

public String getMessage(String code, ServerWebExchange exchange) {
LocaleContext localeContext = localeResolver.resolveLocaleContext(exchange);
return messageSource.getMessage(code, null, localeContext.getLocale());
}
}

마지막으로 message프로퍼티를 만들자. message.properties는 기본언어 설정값이다. 필자는 국가 언어 으로 처리하기 위해 위처럼 properties명을 위처럼 생성하였다. 국가로만 하려면 message_en.properties 이렇게 설정해주고 파라미터 값을 보낼때 en-us가 아닌 en, ko 이렇게 보내주면된다. 저렇게 하지 않으면 다국어 처리가 되지 않으니 헷갈려 하지 말자.



message.properties

label.welcome = 환영합니다.
label.content = 웹플럭스 국제화 예제입니디.
label.changeLang = 지원 언어

label.lang.ko = 한국어
label.lang.us = 영어
label.lang.cn = 중국어


label.msg = 안녕하세요.

message_en_US.properties

label.welcome = Welcome
label.content = This is sample project for Internalization and Localization in Webflux
label.changeLang = Supported languages

label.lang.ko = Korean
label.lang.us = English
label.lang.cn = Chinese


label.msg = Hello

message_zn_CN.properties

label.welcome =欢迎
label.content =这是Webflux中内化和本地化的示例项目
label.changeLang =支持的语言

label.lang.ko =朝鲜的
label.lang.us =英文
label.lang.cn =中文


label.msg = 中国

view 페이지를 작성해 보자. 필자는 main.html 아래와 같이 작성했다.

<h2 data-th-text="#{label.welcome}"></h2>
<p data-th-text="#{label.content}"></p>
<p data-th-text="#{label.changeLang}"></p>
<p data-th-text="${msg}"></p>
<ul>
<li>
<a href="/hello?lang=ko-kr" data-th-text="#{label.lang.ko}"></a>
</li>
<li>
<a href="/hello?lang=en-us" data-th-text="#{label.lang.us}"></a>
</li>
<li>
<a href="/hello?lang=zh-cn" data-th-text="#{label.lang.cn}"></a>
</li>
</ul>

이제 테스트를 위해 controller를 작성하자.

@Autowired
private MessageByLocale message;

@GetMapping("/")
public String main() {
return "index";
}

@GetMapping("/hello")
public String hello(ServerWebExchange exchange, Model model) {
String msg = message.getMessage("label.msg", exchange);
model.addAttribute("msg", msg);
System.out.println(msg);
return "main";
}

localhost:8080/hello 실행해보면 아래와 같이 화면이 출력되고 영어, 중국어를 선택하면 각 언어에 맞게 출력된다.


간단한 예제는 여기에 있다.

'Spring-Boot' 카테고리의 다른 글

Spring boot for Apache Kafka  (2) 2019.06.28
spring boot mybatis 연동  (0) 2019.02.06
spring boot Transaction(@Transactional)  (0) 2018.01.15
spring xml을 java config로 설정하기  (0) 2017.08.16
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함