티스토리 뷰

반응형

Spring Boot 에서 사용할 수 있는 다국어 처리(i18n)에 대해서 몇 가지만 이야기 하려고 합니다.


Spring Boot 에서 다국어를 처리하는 가장 쉬운 방법은 src/main/resources 디렉토리에 messages.properties 파일을 이용하는 방법입니다.

기본 제공할 언어에 대해서 messages.properties 에 정의하고 messages_ko.properties, messages_en.properties 와 같이 파일을 생성하면 해당 언어에 따른 메세지를 별도로 관리할 수 있습니다. 물론 messages_ko_KR.properties, messages_en_US.properteis 와 같이 언어 뿐만 아니라 국가에 따른 분류 파일도 추가로 설정할 수 있습니다.

이를 쉽게 관리하기 위해 IDE 에서 기능을 제공하기도 하는데, IntelliJ 의 경우 messages.properties 와 같은 파일을 다음과 같이 인식하여 관리를 할 수 있게 해줍니다.



위와 같이 Project 화면에서 별도로 표시가 됩니다. 그리고 파일을 열어보면 아래와 같이 key 와 각 파일의 내용을 한 번에 비교해볼 수도 있습니다



하단의 Resource Bundle 탭을 선택하면(기존 정보 보호를 위해 가렸습니다) 왼쪽에 properties 파일 내의 key 가 보이고, 각 언어별로 value 들이 나열되는 형식으로 관리를 할 수 있습니다.

실제로는 일일이 이렇게 관리하는 것보다는 Google Drive 에서 Google 스프레드시트를 이용해 열 별로 언어를 지정하고 각 언어에 맞는 변역 문구를 번역하는 분들과 공유하면서 작업하고, "웹에 게시" 하는 기능을 이용해서 프로그램에서 자동으로 messages.properties 파일을 생성하는 형태로 만드는 것이 더 효율적이라고 생각합니다.

아래 코드는 Apache Commons 의 commons-csv 을 이용해서 실제 파일을 만들어내는 예제입니다.


import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.springframework.util.StringUtils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.OpenOption;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;

public class ResourceBundleUtil {

	/**
	 * 번역 시트 주소 (CSV)
	 * 아래 주소는 실제 주소가 아닌 예제입니다.
	 */
	private static final String SHEET_URL = "https://docs.google.com/spreadsheets/...&output=csv";

	public static void main(String[] args) throws Exception {

		String modulePath = "";

		// Resource Bundle 파일 열기
		Charset charset = Charset.forName("utf-8");
		HashSet openOptionSet = new HashSet<>();
		openOptionSet.add(StandardOpenOption.CREATE);
		openOptionSet.add(StandardOpenOption.TRUNCATE_EXISTING);
		openOptionSet.add(StandardOpenOption.WRITE);

		// 원격으로 Sheet 접속
		URL url = new URL(ResourceBundleUtil.SHEET_URL);

		// CSV Parse, 각 언어별 Resource Bundle 파일 열기
		try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
		     CSVParser parse = CSVFormat
				     .EXCEL
				     .withAllowMissingColumnNames()
				     .withFirstRecordAsHeader()
				     .withTrim()
				     .parse(reader);
		     FileChannel koChannel = FileChannel.open(Paths.get(modulePath + "src/main/resources/messages_ko.properties"), openOptionSet);
		     FileChannel koKRChannel = FileChannel.open(Paths.get(modulePath + "src/main/resources/messages_ko_KR.properties"), openOptionSet);
             FileChannel defaultChannel = FileChannel.open(Paths.get(modulePath + "src/main/resources/messages.properties"), openOptionSet)) {

			// 파일에 데이터 쓰기
			for (CSVRecord record : parse) {

				if (!StringUtils.isEmpty(record.get(0))) {

					defaultChannel.write(charset.encode(record.get(0) + "=" + record.get(1) + "\n"));
					koChannel.write(charset.encode(record.get(0) + "=" + record.get(1) + "\n"));
					koKRChannel.write(charset.encode(record.get(0) + "=" + record.get(1) + "\n"));

				}

			}

		}

	}

}


2019/01/28 - [Programming/Spring Boot 시작하기] - Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (2)

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함