인지용

스프링 다국어 처리 기본 설정 본문

카테고리 없음

스프링 다국어 처리 기본 설정

인지용 2022. 11. 1. 15:38

기본 설정 방법

 

1. 언어 파일 생성

/src/main/resources/messages 폴더 밑에 언어별 properties 파일 생성

(마지막에 들어가는 ko, en 등등은 언어코드를 넣어줘야 한다.)

 

messageContext.properties 파일 추가 이유는

locale에 대응하는 파일이 없을 경우 default로 messageContext.properties 파일을 참조하기 때문이다.

그래서 기본으로 표시할 언어의 값들을 messageContext.properties에 추가해놓으면 된다.

 

폴더 구조
한글 언어 파일
영어 언어 파일

 

언어 파일별로 값만 변경해주면 된다.

 

 

 

2. ReloadableResourceBundleMessageSource 빈 등록

context-common.xml

<bean id="messageSource"
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
   <property name="basenames">
      <list>
         <value>classpath:/messages/messageContext</value>
      </list>
   </property>
   <property name="defaultEncoding" value="UTF-8"/>
   <property name="cacheSeconds" value="60"/>   
</bean>

 

 

-> 아래에 messages 폴더에서 messageContext로 시작하는 파일중에서 언어코드에 맞는 파일을 찾겠다는 의미.

 

쿠키의 값이 ko라면, messageContext_ko.properties 파일을,

쿠키의 값이 en이라면, messageContext_en.properties 파일을 참조하겠다는 뜻

 

 

3. LocaleChangeInterceptor 및  localeResolver 빈 등록

dispatcher-servlet.xml

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="cookieName" value="language" />
    <property name="defaultLocale" value="en"/>
</bean>
<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="language" />
</bean>

 

localeResolver의 종류로는 대표적으로 cookie, session, header가 있다.

 

현재의 경우 CookieLocaleResolver로 설정해놨기 때문에

쿠키의 키 : language, 값 : 언어코드를 설정하고 새로고침하면 된다.

 

 

 

사용방법

properties에서 메시지 선언 방법

message.test.msg1=게시판
message.test.msg2=총 게시글 개수 {0}개
message.test.msg3={0}님의 {1}번째 생일

 

중괄호는 외부에서 값을 받아서 사용하겠다는 의미

(외부에서 값 주입방법은 아래에 있다.)

 

 

jsp

<div>
	<ul>
		<li>
			<%--사용방법1, 일반--%>
			msg1 = <spring:message code="message.test.msg1"/>
			<input type="text" placeholder="<spring:message code="message.user.login.id"/>" name="id" id="id">
		</li>
		<li>
			<%--사용방법2, 메시지 파라미터가 하나일 때--%>
			msg2 = <spring:message code="message.test.msg2" arguments="one"/>
		</li>
		<li>
			<%--사용방법3, 메시지 파라미터가 여러개일 때--%>
			msg3 = <spring:message code="message.test.msg3" arguments="${value}, two" argumentSeparator=","/>
		</li>
	</ul>
</div>

 

 

javascript

<script type="text/javascript">
	function alertTest(){
		<%--사용방법1, 일반--%>
		alert("<spring:message code="message.test.msg1"/>");
		
		<%--사용방법2, 메시지 파라미터가 하나일 때--%>
		alert("<spring:message code="message.test.msg2" arguments="one"/>");
		
		<%--사용방법3, 메시지 파라미터가 여러개일 때--%>
		alert("<spring:message code="message.test.msg3" arguments="${value}, two" argumentSeparator=","/>");		
</script>

 

java

import org.springframework.context.MessageSource;

@Service
public class TestService {

	@Autowired
    private MessageSource messageSource;
 
	private void testMessage(){
	
		//사용방법1, 일반
        String message1 = messageSource.getMessage("message.test.msg1", null, "defaultMessage", Locale.KOREA);

		//사용방법2, 메시지 파라미터가 존재할 때
        String message2 = messageSource.getMessage("message.test.msg1", new Object[]{"params of message", "test"}, Locale.KOREA);

		//사용방법3, 여러 메시지들 중 하나 사용할 때
		//제일 먼저 발견되는 메시지 리턴
        String[] codes = new String[] {"message.test.msg3", "message.test.msg4"};
        MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable(codes, null, "default");
        String message3 = messageSource.getMessage(resolvable, Locale.KOREA);
    }
	
}

 

 

자바에서는 MessageSource를 주입받아서 사용해야 한다.

messageSource를 통해서 메시지를 가져오는 메소드는 3개가 있다.

 

1번 String getMessage(String code, Object[] args, String defaultMessage, Locale locale);

String code : 메시지 경로

Object[] args  : 메시지 파라미터 값 (없으면 null 넣으면 됨)

String defaultMessage : 메시지가 없을때 사용할 기본 메시지

Locale locale : 언어 properties 구분


2번 String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;

1번과 마찬가지지만 defaultMessage만 빠졌음


3번 String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

MessageSourceResolvable 생성시에 메시지 경로가 담긴 String 배열이 들어간다.

해당 메시지들을 순차적으로 찾으면서

있으면 해당 메시지 리턴

없으면 다음 메시지를 찾는다는 의미

 

 

 

 

테스트

쿠키의 langugae가 ko일 때

 

 

쿠키의 langugae가 en일 때

 

 

 

 

 

출처

https://help.ads.microsoft.com/#apex/18/ko/10004/-1

 

https://help.ads.microsoft.com/#apex/18/ko/10004/-1

Search Results View more

help.ads.microsoft.com

 

https://www.44bits.io/ko/keyword/locale

 

로케일(Locale)이란? 국가 및 언어 설정

로케일(Locale)은 사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열입니다. 유닉스, 리눅스, 맥OS 등 POSIX (호환) 시스템에서는 언어, 국가, 인코딩 방법의 조합으

www.44bits.io

https://heidish.tistory.com/86

 

다국어 처리 : 메시지파일, MessageSource 등록, LocaleResolver 등록, Locale 변경

다국어 처리 스프링에서 제공하는 다국어 처리 방식은 스프링 이전에 등장했던 Struts 프레임워크와 매우 유사하다. 그리고 사용자가 원하는 언어로 화면이나 메시지를 출력해주기 위해서는 각

heidish.tistory.com

https://blog.naver.com/PostView.nhn?blogId=talag&logNo=220046781150 

 

[Spring] ReloadableResourceBundleMessageSource

스프링에서 message의 국제화를 위해서, 보통 다음을 선언하여 사용한다.. <bean id="messageSource" c...

blog.naver.com

https://offbyone.tistory.com/382

 

Java Config로 메세지소스(MessageSource) 설정하기(다국어 지원)

스프링프레임워크에서 다국어지 지원을 위한 메세지소스 설정을 Java Config로 해 봅니다. 이번 예제는 "Spring Framework 메세지 국제화(다국어 지원) 사용하기" 에서의 xml 설정을 Java 클래스를 사용한

offbyone.tistory.com

https://stackoverflow.com/questions/8588365/spring-message-tag-with-multiple-arguments

 

spring message tag with multiple arguments

I am trying to get i18n message like below: messageCode=Test message for {0} and {1} and {2}. In jsp, I have this: <spring:message code="messageCode" arguments="${value1},${v...

stackoverflow.com