Spring Message Source (i18n)

김신영·2023년 9월 18일
0

Spring MVC

목록 보기
1/1
post-thumbnail

메시지

  • messages.properties
    typeMismatch.item.price=상품 가격은 숫자를 입력하세요.
    typeMismatch.price=가격은 숫자를 입력하세요.
    typeMismatch.java.lang.Integer=Failed to convert property value of type java.lang.String to required type java.lang.Integer for property {0}; nested exception is {1}: For input string: "{2}"
    typeMismatch=Failed to convert property value {0}; nested exception is {1}: For input string: "{2}"
    
    required.item.name=상품 이름은 필수입니다.
    required.name=이름은 필수입니다.
    required.java.lang.String=필수 문자입니다.
    required=필수 값 입니다.

국제화

  • messages_en.properties
    item=Item
    item.id=Item ID
    item.name=Item Name
    item.price=Item Price
    item.quantity=Item Quantity
  • messages_ko.properties
    item=상품
    item.id=상품 ID
    item.name=상품 이름
    item.price=상품 가격
    item.quantity=상품 수량

Spring에서 MessageSource 설정

  • basenames
  • defaultEncoding
@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name())
    return messageSource
}

SpringBoot에서 MessageSource 설정

  • MessageSource를 자동으로 스프링 빈으로 등록한다.
  • application.properties
spring.messages.basename=messages,errors
  • 관련 클래스
    • MessageSourceProperties
    • MessageSourceAutoConfiguration

MessageSource 인터페이스

  • MessageSource
    • NoSuchMessageException
    • MessageSourceResolvable
public interface MessageSource {

	@Nullable
	String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

	String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
    
	String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}

@FunctionalInterface
public interface MessageSourceResolvable {

	@Nullable
	String[] getCodes();

	@Nullable
	default Object[] getArguments() {
		return null;
	}

	@Nullable
	default String getDefaultMessage() {
		return null;
	}
}

메시지가 없는 경우

  • NoSuchMessageException 발생
  • 기본 메시지(default message)를 파라미터로 넘겨준 경우
    • 기본 메시지(default message)가 반환

Locale 을 파라미터로 넘겨주지 않은 경우

  • Locale.getDefault() 을 호출해서 시스템의 기본 Locale을 사용
  • 해당 기본 Locale에 해당하는 메시지가 없는 경우
    • message.properties 조회

Thymeleaf 에 MessageSource 적용

  • #{...}
  • #{a.b.c(${message.argument.a.b.c})
<div th:text="#{label.item}"></div>"

Web Application에 국제화 적용

  • LocaleResolver
    • AcceptHeaderLocaleResolverr

Accept-Language

클라이언트가 서버에 기대하는 언어 정보를 담아서 요청하는 HTTP 요청 헤더

public interface LocaleResolver {

	Locale resolveLocale(HttpServletRequest request);

	/**
	 * Set the current locale to the given one.
	 * @param request the request to be used for locale modification
	 * @param response the response to be used for locale modification
	 * @param locale the new locale, or {@code null} to clear the locale
	 * @throws UnsupportedOperationException if the LocaleResolver
	 * implementation does not support dynamic changing of the locale
	 */
	void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);
}
  • messages_en.properties
    item=Item
    item.id=Item ID
    item.name=Item Name
    item.price=Item Price
    item.quantity=Item Quantity
  • messages_ko.properties
    item=상품
    item.id=상품 ID
    item.name=상품 이름
    item.price=상품 가격
    item.quantity=상품 수량

정리

  • MessageSource
    • ResourceBundleMessageSource
    • NoSuchMessageException
  • LocaleResolver
    • AcceptHeaderLocaleResolver
  • MessageProperties
    • spring.messages.basename
    • spring.messages.encoding
  • Thymeleaf + MessageSource
    • #{...}_
profile
Hello velog!

0개의 댓글