728x90
개발하다보면 한 화면을 여러 언어로 보여줘야 하는 경우가 있다.
언어마다 같은 HTML을 작성하지 않고, 스프링을 이용하여 편리하게 구현해봤다.
- 먼저 Bean 등록을 해준다. LocaleConfig라는 파일을 생성하여 작성했다.
- @Value값 안에 들어가는 내용은 application.properties에 작성했다.
- basename에는 앞으로 여러 언어를 같은 코드로 관리하기 위한 파일인 messages.properties파일의 경로를 넣어주었다.
- 나같은 경우 messages/messages를 넣었다.
- encoding은 UTF-8을 넣어주었다.
- 스프링 부트의 경우 Bean등록을 안해도 된다는 글들이 많았는데, 안해주니 나는 에러가 발생했다.(해주면 이상 없음)
@Bean
public MessageSource messageSource(
@Value("${spring.messages.basename}") String basename,
@Value("${spring.messages.encoding}") String encoding
) {
ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
resourceBundleMessageSource.setBasename(basename);
resourceBundleMessageSource.setDefaultEncoding(encoding);
return resourceBundleMessageSource;
}
- application.properties
spring.messages.basename=messages/messages
spring.messages.encoding=UTF-8
- messages_ko.properties
member.text.welcome=안녕하세요 스프링입니다.
member.text.title=회원 기능
member.text.join=회원 가입
member.text.list=회원 목록
- messages_en.properties
member.text.welcome=Hello Spring.
member.text.title=Member Function
member.text.join=Member Join
member.text.list=Member List
- HTML(thymeleaf 사용)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<div class="container">
<div>
<h1 th:text="#{member.text.welcome}">Hello Spring</h1>
<p th:text="#{member.text.title}">회원 기능</p>
<p>
<a href="/members/new" th:text="#{member.text.join}">회원 가입</a>
<a href="/members" th:text="#{member.text.list}}">회원 목록</a>
</p>
</div>
</div> <!-- /container -->
</body>
</html>
- 제대로 된 경우
- 화면에서 넘어오는 파라미터에 따라서 messages_ko.properties를 읽어올 것인지, messages_en.properties를 읽어올 것인지 정해진다.
- 컨트롤러의 코드
@GetMapping("/")
public String home(@RequestParam(value = "lang", required = false) String lang, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
if (Objects.equals(lang, "en") ) {
Locale locale = new Locale(lang);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
Objects.requireNonNull(localeResolver).setLocale(request, response, locale);
} else {
lang = "ko";
Locale locale = new Locale(lang);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
Objects.requireNonNull(localeResolver).setLocale(request, response, locale);
}
return "home";
}
- 이 방법을 사용하려면 LocaleResolver를 Bean으로 등록해줘야 한다.
- 아까 만든 LocaleConfig파일에 추가해준다.
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.KOREA);
// sessionLocaleResolver.setLocaleAttributeName("sessionLang"); // 세션에 담을 변수명
return sessionLocaleResolver;
}
- 파라미터로 lang을 넘겨주면
728x90
'개발 > Java&Kotlin' 카테고리의 다른 글
[JPA] LIKE 정리 (0) | 2022.08.24 |
---|---|
[Java] 예외처리 (0) | 2022.08.23 |
[Spring] Validation 적용해보기 (0) | 2022.08.18 |
[Spring] 스웨거(Swagger) 라이브러리 (1) | 2022.08.17 |
[Java] Generics (1) | 2022.08.17 |