본문 바로가기

Spring Boot internationalization

java by 낼스 2019. 1. 30.
### 참고 : https://justinrodenbostel.com/2014/05/13/part-4-internationalization-in-spring-boot/ ### Spring Boot internationalization 1. message.properties 생성 - messages.properties - messages_en.properties - messages_ko.properties 2. I18nConfiguration 생성 3. hello.html 작성 ### messages.properties msg_hello = Hello msg_world = World msg_complex = Good morning {0}! ### messages_en.properties msg_hello = Hello msg_world = World msg_complex = Good morning {0}! ### messages_ko.properties msg_hello = 안녕 msg_world = 세계 msg_complex = 좋은아침 {0}! ### I18nConfiguration.java ```java import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; /** * 로케일 처리 순서 * 1. 웹 요청의 로케일을 확인 * 1.1) 로케일 리졸버의 방식에 따라 세션 또는 쿠키에서 로케일 확인 * 1.2) 세션 또는 쿠키에서 로케일 확인이 안될 때(ex.첫 요청등)는 브라우저가 보내는 로케일 확인 * 1.2.1) 단, Resolver의 DefaultLocale이 설정되어 있을 경우 해당 값으로 덮어쓰기 * 2. 로케일에 맞는 메세지 파일의 값을 호출 * 3. 로케일에 맞는 메세지 파일이 없는 경우 * 3.1) FallBackToSystemLocale이 true(기본값)인 경우 * 3.1.1) 시스템 로케일에 맞는 메세지 파일의 값을 호출 * 3.1.2) 못찾았을 경우 기본 메세지 파일(messages.properties)의 값을 호출 * 3.2) FallBackToSystemLocale이 false인 경우 * 3.2.1) 기본 메세지 파일(messages.properties)의 값을 호출 * 4. 로케일에 맞는 메세지 파일이 없거나 값을 못찾았을 경우 예외 발생 */ @Configuration public class I18nConfiguration extends WebMvcConfigurerAdapter { @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("i18n/messages"); // in classpath messageSource.setDefaultEncoding("UTF-8"); messageSource.setFallbackToSystemLocale(false); return messageSource; } @Bean public LocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); /* CookieLocaleResolver localeResolver = new CookieLocaleResolver(); localeResolver.setCookieName("my-locale-cookie"); localeResolver.setCookieMaxAge(3600); // in second (-1: deleted when client shuts down) */ localeResolver.setDefaultLocale(Locale.KOREAN); return localeResolver; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); interceptor.setParamName("lang"); // default: "locale" return interceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } } ``` ### /src/main/resources/hello.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <meta charset="UTF-8" />
    <title>HELLO</title>
</head>
<body>
<h1 th:text="#{msg_complex}">바다</h1><br/>
<h1 th:text="#{msg_hello}">안녕~~~</h1><br/>
<h1 th:text="#{msg_world}">세계~~~</h1><br/>
<br/>
<a href="?lang=en">English</a><br/>
<a href="?lang=ko">Korea</a><br/>
</body>
</html>

### test http://localhost:8080/hello.html http://localhost:8080/hello.html?lang=en http://localhost:8080/hello.html?lang=ko ### javascript에서 다국어 메시지 참조(jquery.i18n.properties.js) 참고 : http://aretias.egloos.com/970593 1. I18nController 생성 2. Download jquery.i18n.properties.js https://github.com/jquery-i18n-properties/jquery-i18n-properties 3. hello.html 작성 ```java @RestController public class I18nController { @RequestMapping("/properties/{propertiesName}") public void getProperties(@PathVariable String propertiesName, HttpServletResponse response) throws IOException { OutputStream outputStream = response.getOutputStream(); Resource resource = new ClassPathResource("/i18n/" + propertiesName + ".properties"); // Resource resource = new ClassPathResource("/i18n/" + propertiesName ); InputStream inputStream = resource.getInputStream(); List readLines = IOUtils.readLines(inputStream); IOUtils.writeLines(readLines, null, outputStream); IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(outputStream); } } ```

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <meta charset="UTF-8" />
    <title>HELLO</title>
    <script type="text/javascript" src="/js/prevision/jquery.i18n.properties.js"></script>
    <script>
        jQuery.i18n.properties({
            name:'messages',
            path:'/properties/',
            mode:'map',
            language:'${lang}',
            callback: function () {
                jQuery.i18n.prop('msg_hello');
                jQuery.i18n.prop('msg_complex', 'John');
            }
        });

        function i18n(msg) {
            var args = "\""+ msg + "\"";
            for (var i = 1; i < arguments.length; i++) {
                args += ", \"" + arguments[i] + "\"";
            }
            if (parent != this) {
                return eval("parent.i18n(" + args + ")");
            }
            return eval("jQuery.i18n.prop(" + args + ")");
        }

        window.onload = function() {
            alert(i18n("msg_hello") + " / " + i18n("msg_world"));
            alert(i18n("msg_complex","바둑아"));
        }
    </script>

</head>
<body>
<h1 th:text="#{msg_complex}">바다</h1><br/>
<h1 th:text="#{msg_hello}">안녕~~~</h1><br/>
<h1 th:text="#{msg_world}">세계~~~</h1><br/>
<br/>
<a href="?lang=en">English</a><br/>
<a href="?lang=ko">Korea</a><br/>
</body>
</html>

### test http://localhost:8080/hello.html

'java' 카테고리의 다른 글

Singletone Design Pattern  (0) 2019.01.30
Adapter Design Pattern  (0) 2019.01.30
상관관계 분석(Correlation Analysis)?  (0) 2019.01.29
kmeans  (0) 2019.01.29
spring_sqlmap_selectkey  (0) 2019.01.29

댓글