Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- android error
- MySQL
- css
- DataTable
- JavaScript
- android fragment
- Android Apk 이름 변경
- Java
- Program type already present
- spring
- Android Apk
- java error
- CSS사용법
- Android Apk 이름
- Android
- release unsigned
- jQuery
- FLUTTER
- 안드로이드
- Kotlin
- Eclipse
- error
- tomcat
- apache gzip
- Firebase
- Exception
- R프로그래밍
- fragment
- release Apk
- html
Archives
- Today
- Total
selfstarter
Spring JavaConfig 다국어 처리 본문
Spring JavaConfig 다국어 처리
- 다국어 처리를 Client 단에서 하면 코드가 지저분해지고 유지보수도 어렵다
- Spring에서 properties 파일을 이용하여 다국어 처리를 쉽게할 수 있도록 지원해준다
ContextMessageConfig
- 다국어 설정을 할 Config(MessageConfig.java)추가
- setBasename는 메시지 properties가 있는 위치로 설정해준다
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
@Configuration
public class ContextMessageConfig {
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
source.setBasename("classpath:/properties/messages/message");
source.setDefaultEncoding("UTF-8");
source.setCacheSeconds(60);
source.setUseCodeAsDefaultMessage(true);
return source;
}
@Bean
public SessionLocaleResolver localResolver() {
return new SessionLocaleResolver();
}
}
ServletConfig.java
- LocaleChangeInterceptor(인터셉터)는 페이지에 lang=언어를 붙이는 역활을 한다. 이렇게 server에서 lang 값만 변경해주면 쉽게 언어 변환이 가능하다
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptor = registry.addInterceptor(loginLogInterceptor());
interceptor.addPathPatterns("/**");
registry.addInterceptor(localeChangeInterceptor()); // 인터셉터 등록
}
properties 추가
- message.properties, message_ko.properties, message_en.properties 파일을 추가한다.
- properties 파일은 Untitled Text File로 추가한다
- 유니코드로 보이게 하려면 Properties File Editor로 변경. 파일도 UTF-8이 아닌 Default(ISO-8859-1) 인코딩으로 설정한다
- (왜 유니코드를 사용하지 잘 모르겠다)
message.properties
title=\uAE30\uBCF8 \uD0C0\uC774\uD2C0
hello=\uC548\uB155
message_ko.properties
title=\uD55C\uAD6D \uB2E4\uAD6D\uC5B4 \uD0C0\uC774\uD2C0
hello=\uC548\uB155
message_en.properties
title=base title
hello=hello
Controller.java
- MessageSource를 사용하여 원하는 언어로 변환된 text를 가져올 수도 있다
- sessionLocaleResolver 객체에 원하는 언어로 설정된 Locale를 전달하면 다국어 처리 완료
- properties_ss.properties 라는 이름을 붙이고 Locale("ss")라고 해도 properties_ss.properties의 text 처리가 잘 된다. 한국어는 ko, 영어는 en이라고 정해져 있는게 아니라 properties name을 따라가는 듯
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import com.base.controller.service.BaseService;
@Controller
public class HomeController {
@Autowired
@Qualifier("BaseService")
private BaseService service;
@Autowired
private MessageSource messageSource;
@Autowired
private SessionLocaleResolver sessionLocaleResolver;
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value = "", method = RequestMethod.GET)
public String home(Locale locale, HttpServletRequest request, HttpServletResponse response, Model model) {
System.out.println("한글:" + messageSource.getMessage("title", null, "no surch", Locale.KOREA));
locale = new Locale("ko");
sessionLocaleResolver.setLocale(request, response, locale);
model.addAttribute("sessionLocale", sessionLocaleResolver.resolveLocale(request));
return "home";
}
}
home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title><spring:message code="title" text="사이트" /></title>
</head>
<body>
<h1>
<spring:message code="hello" text="기본 text" />
</h1>
<p>Session Locale : <c:out value="${sessionLocale}" /></p>
</body>
</html>
SOLVED
서버에서 다국어 처리 불가
- 서버에서 messageSource 를 이용해 원하는 언어를 가져오려고 했지만 가져오지 못했다. 알고보니 properties 위치를 잘못 설정했다.setBasename 수정 후 해결
다국어 처리가 안되는 상황 발생
- 서버에서 messageSource 를 이용해 원하는 언어로 가져올 수 있었는데 CLIENT 언어는 계속 영어인 경우가 있었다. 알고보니 내가 Chrome에 기본 언어 설정을 영어로 해서 어떤 언어이든 간에 무조건 영어로 번역되는 듯 했다(explore는 다국어 처리가 잘됨) Chrom 언어 변경 후 해결
'Server > Spring' 카테고리의 다른 글
json list 안에 list 읽기 (0) | 2019.07.15 |
---|---|
Spring resources 위치 가져오기 (0) | 2019.07.13 |
전자정부프레임워크(egov) logback 설정 (0) | 2019.07.12 |
Invalid bound statement error 해결 (1) | 2019.07.10 |
@ControllerAdvice JavaConfig (0) | 2019.07.01 |
Comments