프로그래밍

[Spring] day74 : 다국어처리 본문

자바/Spring

[Spring] day74 : 다국어처리

시케 2023. 8. 24. 15:46
728x90
반응형

2023.08.24.목

다국어처리

예전에는 다른언어로 서비스를 해야했을때 .jsp 파일 자체를 새로 제작해야 했었다

Spring 프로젝트에서는 "메세지 파일"만을 제작하여 활용이 가능하다

 

메세지 파일 추가

우리가 사용할 메세지 파일을 읽어들일 수 있는 Resolver는src/main/resources 경로를 읽기 때문에 해당 경로에 패키지를 만들 것이다메세지 파일은 '패키지이름File_언어.properties'로 설정한다

 

영어는 en한국어는 ko 등등이며 그외 언어 또한 설정 가능하다

 

messageFile_en.properties

# key = value

# insertBoard.jsp
header.title = INSERT TITLE
header.content = INSERT CONTENT
header.btn = INSERT

body.image = DEFAULT IMAGE

footer.gobackmain = GO BACK MAIN

messageFile_ko.properties

# key = value

# insertBoard.jsp
header.title = \uC81C\uBAA9 \uC791\uC131
header.content = \uB0B4\uC6A9 \uC791\uC131
header.btn = \uAE00 \uC791\uC131

body.image = \uC378\uB124\uC77C

footer.gobackmain = \uBA54\uC778\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30

 

메세지 파일은 key = value 형식으로 이루어져있다키값을 설정 후 뒤에 번역할 내용(해당 언어)으로 작성하면 된다주석은 #으로 작성하며 한국어로 작성하면 자동으로 유니코드로 변환된다

 

. 은 들어가야 하는 것은 아니지만 통상적으로 넣어서 표기하는 편이다

더보기

어떠한 요소에 어떤 값이 들어갈지 정확히 나타내기 위해
~의 ~~라고 하면 가독성이 좋아진다

김철수

6학년 1반 김철수

 

메세지 파일 Resolver 등록

메세지 파일을 읽어들일 수 있는 Resolver(MessagSource)를 등록해야 한다

Resolver는 DispatcherServlet의 멤버변수이므로 DispatcherServlet-servlet.xml 에서 진행하도록 한다

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
	<property name="basenames">
		<list>
			<value>message.messageFile</value>
		</list>
	</property>
</bean>

해당 Resolver는 확장자 없이 작성한다

즉, en.properties / ko.properties 등을 작성하지 않는다

언어 설정(en, ko)은 자동으로 붙여주며 확장자(.properties)는 패키지 경로와 혼동될 수 있기 때문이다

 

MessageSource 클래스는 _en _ko..등을 자동으로 추가해준다

즉, 파일을 만들때마다(언어를 추가할때마다) 설정을 추가하지 않아도 된다

대신 자동으로 언어 설정을 파악할 수 있도록 역할하는 것을 등록 및 설정해야 한다

 

message 파일이 유독 확장자 문제가 많으므로

컴퓨터 설정에서 확장자를 항상 같이 나오도록 설정하도록하고 

파일명만 작성하는건지 확장자까지 작성해야 하는지 확실히 유념하는 것이 좋다

LocaleChangeInterceptor 클래스 등록

웹 브라우저에서 서버에게 요청을 하게되면

HTTP 요청 헤더 내에 브라우저의 Locale 정보를 갖고 있게 된다

해당 Locale 정보를 추출할 LocaleResolver가 필요하다

 

LocaleResolver를 사용하기 위해 클래스를 등록해보자

 

DispatcherServlet-servlet.xml 에 mvc 네임스페이스를 추가한 후에 등록해야 한다(순서 중요)

LocaleChangeInterceptor를 사용하면 인위적으로 다른언어로 서비스할수 있도록 할 수 있다

∴언어설정을 변경할 수 있도록 된다

 

DispatcherServlet-servlet.xml

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
      <property name="paramName" value="lang" />
         </bean>
</mvc:interceptors>

<property name="paramName" value="lang" />

setter 주입하여 lang이라는 파라미터로 언어설정 변경이 가능해졌다

 

페이지에 적용

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>

 

해당 태그라이브러를 작성하면 언어설정을 불러올 수 있게 된다

 

<spring:message code='메세지 키'/> 해당 형식으로 사용하면 전체가 메세지 값으로 보여지는 형태이다

 

insertBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글작성페이지</title>
</head>
<body>

<h1><a href="insertBoard.do?lang=en">EN</a> | <a href="insertBoard.do?lang=ko">KO</a></h1>

<form action="insertBoard.do" method="post" enctype="multipart/form-data">
	<input type="hidden" name="writer" value="${member}">
	<input type="text" name="title" required placeholder="<spring:message code='header.title' />"> <br>
	<input type="text" name="content" required placeholder="<spring:message code='header.content' />"> <br>
	<input type="file" name="fileUpload" onchange="thumbnail(this);"> <br>
	<input type="submit" value="<spring:message code='header.btn' />">
</form>

<hr>
<img alt="<spring:message code='body.image' />" src="" id="thumbnailImage">
<hr>

<a href="main.do"><spring:message code="footer.gobackmain" /></a>

<script>
	function thumbnail(input) {
		if (input.files && input.files[0]) {
			var reader = new FileReader();
			reader.onload = function(e) {
				document.getElementById('thumbnailImage').src = e.target.result;
			};
			reader.readAsDataURL(input.files[0]);
		}
		else {
			document.getElementById('thumbnailImage').src = "";
		}
    }
</script>
</body>
</html>

이제 ViewResolver를 사용하는 것이므로 해당 페이지에 바로 접근하지 못한다

 

※ redirect를 사용하면 새로운 요청이기 때문에 local 정보가 사라진다

∴ local 정보를 활용하고 싶다면 foward 방식으로 요청해야 한다

 

2023.07.31 - [Web] - [Web] day38 : 데이터 전송(foward / sendRedirect)

 

[Web] day38 : 데이터 전송(foward / sendRedirect)

2023.06.28.수 데이터 전송 이제 본격적으로 페이지 이동과 함께 데이터 전송을 하여 구조적인 웹 페이지를 구성하기 시작할 것이다 데이터 전송 태그를 활용하여 데이터를 전송한다 "test04.jsp" 페

dev-9rm.tistory.com

 

 

소스코드 보러가기

 

728x90
반응형
Comments