이번 글에서는 Spring Boot에서 다국어 기능을 properties 파일이 아닌 yaml 파일을 이용하여 적용을 해보겠다.
다국어 관련 Config 파일 작성.
yml YamlResourceBundle 클래스를 사용하기 위한 pom.xml 파일 혹은 build.gradle 파일에 의존성 추가.
# Maven
<dependency>
<groupId>net.rakugakibox.util</groupId>
<artifactId>yaml-resource-bundle</artifactId>
<version>1.1</version>
</dependency>
# gradle
implementation group: 'net.rakugakibox.util', name: 'yaml-resource-bundle', version: '1.1'
Config 클래스 생성
package com.blackvue.config;
import com.blackvue.common.interceptor.WebInterceptor;
import com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter;
import com.pittasoft.common.config.AFConfigYAML;
import net.rakugakibox.util.YamlResourceBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.FixedLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
/**
* 변경된 언어 정보를 기억할 로케일 리졸버를 생성한다.
* 여기서는 세션에 저장하는 방식을 사용한다.
* @return
*/
@Bean
public SessionLocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
/**
* 언어 변경을 위한 인터셉터를 생성한다.
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor())
.excludePathPatterns("/resources/**", "/resources/", "/css/**", "/vendor/**", "/js/**", "/script/**", "/images/**", "/fonts/**", "/lib/**");
}
/**
* 각 언어별 메시지 정보를 yaml-bundle을 통해 가져옴
*/
@Bean("messageSource")
public MessageSource messageSource(@Value("${spring.config.messages.basename}") String basename,
@Value("${spring.config.messages.encoding}") String encoding ) {
YamlMessageSource source = new YamlMessageSource();
source.setBasename(basename);
source.setDefaultEncoding(encoding);
source.setAlwaysUseMessageFormat(true);
source.setUseCodeAsDefaultMessage(true);
source.setFallbackToSystemLocale(false);
return source;
}
}
class YamlMessageSource extends ResourceBundleMessageSource {
@Override
protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException {
return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE);
}
}
src/main/resources/appilcation.yml 에 다국어 설정파일이 있는 경로 추가.
spring:
config:
messages:
basename: lang/messages
encoding: UTF-8
src/main/resources/i18n/messages.yml 파일
alert:
confirm: "확인"
cancel: "취소"
loginEmail: "아이디(이메일)를 입력해 주세요."
loginPassword: "비밀번호를 입력해 주세요."
loginFail: "아아디(이메일) 또는 비밀번호가 올바르지 않습니다."
src/main/resources/i18n/messages_en.yml 파일
alert:
confirm: "Ok"
cancel: "Cancel"
loginEmail: "Please enter your ID(Email)."
loginPassword: "Please enter a password."
loginFail: "The email or password is invalid."
src/main/resources/i18n/messages_jp.yml 파일
alert:
confirm: "确认"
cancel: "取消"
loginEmail: "请输入用户名(邮箱)。"
loginPassword: "请输入密码。"
loginFail: "请重新确认用户名(邮箱)或者密码。"
src/main/resources/i18n/messages_zh.yml 파일.
alert:
confirm: "確認"
cancel: "取り消し"
loginEmail: "ID(Eメール)を入力してください"
loginPassword: "パスワードを入力してください"
loginFail: "ID(Eメール)またはパスワードをもう一度ご確認ください。"
웹페이지에서 사용하기
<!-- Jsp -->
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <-- 태그 선언 후
<spring:message code="alert.loginEmail" />
<!-- thymeleaf -->
1. <span th:text="#{alert.loginEmail}">아이디(이메일)를 입력해 주세요.</span>
2. <span>[[#{alert.loginEmail}]]</span>
default url 조회
영문조회 시 (lang=en)
일문 조회시 (lang=jp)
'Framework > Spring Boot' 카테고리의 다른 글
[Spring boot] 다국어 처리하기 (0) | 2021.01.05 |
---|