이번 글에서는 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

+ Recent posts