프로젝트 폴더 정보

message-start 코드를 중심으로 사용
message-start -> message라고 변경 후에 프로젝트 진행하기

Message & Internationalization?

Message

예시

프로젝트에 상품명이라고 되어있는 단어를 모두 상품 이름이라고 고쳐달라고 하면 어떻게 해야할까?

item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량

messages.properties

Internationlization

item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity

messages_kr.properties

item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량

대부분은 SpringBoot를 사용하다보니, 굳이 Bean으로 등록할 필요는 없다.
아래의 코드만 추가 해주면 된다.

spring.messages.basename=message, config.i18n.message

application.properties

spring.messages.basename=message

Spring Message Source 사용

MessageSource Interface

public interface MessageSource{
	String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
	String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
}

실습

MessageSourceTest

Path : test/java/hello/itemservice/domain/message/MessageSourceTest.java

...
import static org.assertj.core.api.Assertions.*;
...


@SpringBootTest  
public class MessageSourceTest {  
  
    @Autowired  
    MessageSource ms;  
  
    @Test  
    void helloMessage(){  
        String result = ms.getMessage("hello", null, null);  
        Assertions.assertThat(result).isEqualTo("안녕");  
    }  
}

// 해당 메시지를 찾지 못했을 때 생성되는 Error를 Throw Exception 처리 하였다.  
@Test  
void notFoundMessageCode(){  
    assertThatThrownBy(()-> ms.getMessage("no_code", null, null))  
            .isInstanceOf(NoSuchFieldError.class);  
}
// hello.name에서 {0} 부분을 Spring이라는 문자로 치환해서 테스트 진행
@Test
void argumentMessage(){
	String message = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
	assertThat(message).isEqualTo("안녕 Spring");
}

// meesage.properties 처럼 다른 옵션이 없다면, 자동으로 default로 설정 된다.
@Test  
void defaultLang(){  
    assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");  
    assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");  
}

//영어 message
@Test  
void enLang(){  
    assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");  
}

웹 애플리케이션에 적용하기

Message

message.properties

hello=안녕  
hello.name=안녕 {0}  
label.item=상품 IDlabel.item.itemName=상품명  
label.item.price=가격  
label.item.quantity=수량  
  
page.items=상품 목록  
page.item=상품 상세  
page.addItem=상품 등록  
page.updateItem=상품 수정  
  
button.save=저장  
button.cancel=취소

ThymLeaf 메시지 적용법

...
<div>
	<h2 th:text="#{label.item}">상품 등록</h2>
</div>
...
<!--
페이지 이름에 적용
-->
<h2 th:text="#{page.addItem}">상품 등록 폼</h2>

<!--
레이블에 적용
-->
<label for="itemName" th:text="#{label.item.itemName}">상품명</label>
<label for="itemName" th:text="#{label.item.price}">가격</label>
<label for="itemName" th:text="#{label.item.quantity}">수량</label>

addForm.html

Internationalization

hello=hello  
hello.name=hello {0}  
  
label.item.id=Item ID  
label.item.itemName=Item Name  
label.item.price=price  
label.item.quantity=quantity  
  
page.items=Item List  
page.item=Item Detail  
page.addItem=Item Add  
page.updateItem=Item Update  
  
button.save=Save  
button.cancel=Cancel

imessages_en.properties

Choose Internationalization message of Spring

LocaleResolver


#Spring_Java