zepinos
17k
2019-01-28 15:00:58 작성 2019-01-28 16:10:35 수정됨
3
325

Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (1)


제 블로그에 올린 글을 퍼왔습니다.


쓸데없는 내용이 많아서 포스트를 나눠 적고 있는데, 아래에는 1편만 올립니다. 다음편부터는 제 블로그에서 계속 봐주시면 고맙겠습니다.


덤으로, okky 는 별도의 후원금이 없이 운영되다 보니 항상 자금이 부족하다고 합니다. okky 의 구글 광고를 그냥 구경만 하지 마시고 한 번씩 눌러주시면 okky 에 큰 도움이 될 것 같습니다. 제 블로그 광고의 클릭도 굽신굽신... -_-;;;


https://zepinos.tistory.com/42




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"));

                }

            }

        }

    }

}


출처: https://zepinos.tistory.com/42 [zepinos BLOG]

3
0
  • 댓글 3

  • 잠만보 
    4k
    2019-01-28 15:22:35

    구글 스프레드시트로 관리한다고 할때 변경사항에 대해서 라이브 리로딩이 가능한지 여쭈고 싶습니다 ㅠㅠ


    0
  • zepinos
    17k
    2019-01-28 15:28:04

    위 예제처럼 특정 클래스에 main() 을 만들어서 실행하면 파일이 지워지고 다시 생성되기 때문에 Live Reloaded 도 가능할 것으로 생각됩니다. 물론 구글에서 push 을 해줄 수는 없으니 완전 자동화는 힘들겠지요.

    1
  • 잠만보 
    4k
    2019-01-28 20:14:10

    찾아보니 구글 드라이브 api로 변경을 감지 해볼순 있겠지만 굳이 메리트가 없네요..


    저는 xml로 관리하는걸 공유해야겟습니다!

    좋은 글 공유 감사합니다

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.