๋ฐ์ํ
๋ฉ์ธ์ง
- ๋ฉ์ธ์ง๋ฅผ ํ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ(messages.properties ํ์ผ์์ ๊ด๋ฆฌ)
- ๋ฌธ์์ด์ ํ๋์ฝ๋ฉํ์ง ์๊ณ ํ์ผ์ ์๋ ๊ฐ์ ์ฝ์ด์์ ๋ณด์ฌ์ค๋ค.
item=์ํ
item.id=์ํ ID
item.itemName=์ํ๋ช
item.price=๊ฐ๊ฒฉ
item.quantity=์๋
<!-- ์ค์ ์ฌ์ฉ -->
<label for="itemName" th:text="#{item.itemName}"></label>
๊ตญ์ ํ
- ๋๋ผ๋ณ๋ก ๋ฉ์ธ์ง ํ์ผ์ ๊ด๋ฆฌํด์ ๊ฐ ์ธ์ด์ ๋ง๋ ๋ฉ์ธ์ง ํ์ผ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ.
- ์ ์ ๊ฐ ์ ๊ทผํ ๋๋ผ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์
- HTTP accept-language ํค๋ ๊ฐ์ ์ฌ์ฉํ๊ฑฐ๋
- ์ฌ์ฉ์๊ฐ ์ง์ ์ธ์ด๋ฅผ ์ ํํ๊ฒ ํ๊ณ ์ฟ ํค ๊ฐ์ ์ด์ฉํ๋ฉด ๋๋ค. -> LocaleResolver ์ฌ์ฉ
- Locale์ด en_US ์ ๊ฒฝ์ฐ messages_en_US -> messages_en -> messages ์์๋ก ์ฐพ๋๋ค.
- ๊ตฌ์ฒด์ ์ธ ๊ฒ์ด ์์ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์ฐพ๊ณ , ์์ผ๋ฉด ๋ํดํธ๋ฅผ ์ฐพ๋๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
์ฌ์ฉ๋ฒ
1. ์ง์ ๋ฑ๋ก
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- basename : ๋ฉ์ธ์ง ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ๋ค
- setBasenames("messages") <- message.properties ํ์ผ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป
- _en, _ko์ ๊ฐ์ด ํ์ผ์ด๋ฆ์ ์ธ์ด์ ๋ณด๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ๊ตญ์ ํ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค. ๋ง์ฝ ๊ตญ์ ํ ํ์ผ์ด ์๋ค๋ฉด messages๋ฅผ ์ฌ์ฉํ๋ค.
- ํ์ผ์ ์์น๋ /resources ํ์์ ์์ฑํ๋ฉด ๋๋ค
- ์ฌ๋ฌ ํ์ผ์ ํ๋ฒ์ ์ง์ ํ ์ ์๋ค. (messages, error, ... etc)
2. ์คํ๋ง ๋ถํธ ์ฌ์ฉ
์คํ๋ง๋ถํธ ์ฌ์ฉ์ ์๋์ผ๋ก MessageSource์ ๋น์ผ๋ก ๋ฑ๋กํด์ค์ ์ง์ ๋ฑ๋กํ์ง ์์๋ ๋๋ค.
// application.properties
spring.messages.basename=messages,config.i18n.messages (๊ธฐ๋ณธ๊ฐ messages)
hello=์๋
hello.name=์๋
{0} {1} {2} // ์ธ์๋ฅผ ์ค ์ ์๋ค
MessageSource ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
public interface MessageSource {
// message code, ์ธ์๋ค, ์ฝ๋์์๋ ๋์ฌ default message, locale
String getMessage(String code, @Nullable Object[] args, @Nullable String
defaultMessage, Locale locale);
// message code, ์ธ์๋ค, locale
String getMessage(String code, @Nullable Object[] args, Locale locale) throws
NoSuchMessageException;
}
// ํ
์คํธ ์ฝ๋
@Test
void notFoundMessageCode() {
assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class); // ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด NoSuchMessageException
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "๊ธฐ๋ณธ ๋ฉ์์ง", null);
assertThat(result).isEqualTo("๊ธฐ๋ณธ ๋ฉ์์ง"); // ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด "๊ธฐ๋ณธ ๋ฉ์ธ์ง"
}
์คํ๋ง์ ๊ตญ์ ํ ๋ฉ์์ง ์ ํ
- ์คํ๋ง์ ์ธ์ด ์ ํ์ ๊ธฐ๋ณธ์ผ๋ก Accept-Language ํค๋์ ๊ฐ์ ์ฌ์ฉํ๋ค.
- LocaleResolver : Locale ์ ํ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์๋๋ก LocaleResolver ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- ์คํ๋ง ๋ถํธ๋ ๊ธฐ๋ณธ์ผ๋ก Accept-Language ๋ฅผ ํ์ฉํ๋ AcceptHeaderLocaleResolver ๋ฅผ ์ฌ์ฉํ๋ค.
- Accept-Language๋ฅผ ํ์ฉํ๊ณ ์ถ์ง ์๊ณ ์ง์ ์ ํํ๊ณ ์ถ๋ค๋ฉด LocaleResolver ์ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํด์ ์ฟ ํค๋ ์ธ์ ๊ธฐ๋ฐ์ Locale ์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);
}
๋ฐ์ํ