Header

  1. View current page

    Develop with pleasure!

Profile_image?t=1224205604&type=big
42

eclipse 다국어 지원 흉내내기

eclipse의 소스 코드를 활용해서 eclipse 밖에서 국제화 서비스를 편리하게 이용하는 방식을 알아본다.

 

eclipse의 NLS(National Language Support)를 이용하면 기존 자바 애플리케이션에서 다국어지원을 이용하려고 직접 번들을 로드해  처리하던 불편사항을 해결할 수 있다. 패키지 소프트웨어를 만들고 있기에 국제화 처리를 자주하게 되지만(그래도 외국에 팔리고 있다는 사실!) 회사에 eclipse 기반 제품만 있는 것이 아닌지라 아무래도 eclipse 기반 제품이 아닌 제품에서 직접 properties 파일에 접근하는 방식이 매우 불편하게 느껴졌다. 미루고 미루다 이제서야 처리했다.

 

eclipse의 다국어 지원

먼저 이클립스의 다국어 처리 방식을 보려고 다중 히스토리 플러그인의 코드를 보도록하자.

 

NLS 클래스

  1. package com.eclipsegeek.history.internal.ui;

    import org.eclipse.osgi.util.NLS;

    public class Messages extends NLS {
       
        private static final String BUNDLE_NAME = "com.eclipsegeek.history.internal.ui.messages";//$NON-NLS-1$
       
        static {
            // load message values from bundle file
            NLS.initializeMessages(BUNDLE_NAME, Messages.class);
        }
       
        public static String ShowLocalHistory_0;
        public static String GenericHistoryTableProvider_FileName;
        public static String GenericHistoryTableProvider_FilePath;
       
        public static String LocalHistoryPage_RecentFilterAction;
        public static String LocalHistoryPage_RecentFilterTip;
    }

 

단순히 NLS 클래스를 상속받고 Properties 파일의 패키지 경로를 포함한 이름을 이용해서 초기화만 해주면 된다. 이때 메시지 번들 파일의 Locale명과 확장자는 추가하지 않는다 (예를 들어, messages_ko_kr.properties에서 _ko_kr.properties는 포함시키지 않는다). 그 다음 static으로 선언된 메시지 번들의 키만 정의해준다. 값은 NLS 서비스에서 알아서 채워준다.

 

참고로 위 코드의 //$NON-NLS-1$는 해당 문자열은 국제화와 관련 없는 문자열이므로 자동 추출 등을 이용해서 문자열을 국제화할 때 대상에서 제외됨을 표시하는 일종의 마커(marker)이다.

 

메시지 번들 (com/eclipsegeek/history/internal/ui/messages.properties)

  1. ###############################################
    # Message catalog for com.eclipsegeek.history.ui
    ###############################################

    ShowLocalHistory_0=No local history available for selected resource(s).

    GenericHistoryTableProvider_FileName=File Name
    GenericHistoryTableProvider_FilePath=Path

    LocalHistoryPage_RecentFilterAction=Show only one occurrence for each resource
    LocalHistoryPage_RecentFilterTip=Show only one occurrence for each resource

 

사용자가 지정한 클래스 파일과 동일한 키 값을 이용한 Key-Value 짝의 메시지를 구성하면 된다. 여기까지는 기존 다국어 지원 방식과 다를게 없다. 한 가지 주의할 점은 NLS 클래스에서 동일한 키값으로 참조하기 때문에 자바의 필드가 허용하는 문자로만 구성하야 한다. 다시말해 키값이 숫자로 시작하거나 점(.) 연산자가 포함되면 안된다. 그래서 이클립스 코드를 확인해보면 밑줄(_)을 이용함을 볼 수 있다.

 

메시지 사용하기

메시지를 사용하는 코드를 보자. 위에서 정의한 NLS 클래스의 필드를 참조하는 것만으로 모든 처리가 끝난다.

 

  1. MessageDialog.openInformation(getShell(), getPromptTitle(), Messages.ShowLocalHistory_0);

 

사용자는 별도로 메시지 번들을 읽어오기 위한 유틸리티 함수를 만들거나 하지 않아도 되고, 장황스러운 방식으로 메시지에 접근하지 않아도 된다. 또 NLS 클래스에는 정의되지 않았지만 번들 파일에 있는 메시지나 이와 반대의 상황에 대해서도 로그를 남겨주니 편리하다. 이클립스 가니메데부터는 Ctrl키를 이용한 점프 기능에서 메시지 번들 파일의 해당 키값으로 바로가기를 지원하기에 더 편리해졌다.

 

일반 자바 애플리케이션에서 eclipse 다국어 지원 사용하기

"eclipse에서는 메시지 처리하기 참 편했는데..."라는 생각에 이클립스 외부에서도 NLS 방식을 이용하는 방법을 알아봤다. 먼저 NLS 클래스 코드를 추출한다. 다행히도 로그 메시지를 처리하는 부분을 제외하고는 완전히 독립적인 클래스다. 이런 행운이!!! 코드의 양이 많으므로 파일로 첨부한다.

 

첨부파일: NLS.java

 

첨부한 파일은 로그 메시지를 처리하는 영역에 TODO 주석을 달아뒀으므로 자신의 프로그램에 맞도록 로그 메시지를 처리하도록 한다. 이 로그 처리 부분에서 제공하는 정보가 꽤나 중요한데, 번들 파일에는 있지만 NLS 클래스에 없는 메시지(즉, 사용되지 않고 있는 메시지)나 NLS 클래스에는 있지만 번들 파일에 없는 메시지(즉, 사용할 가능성 있지만 실제로는 없는 메시지)에 대한 정보를 알려준다. (메시지 분할을 제대로 하지 못한 근본적인 문제가 있을 수 있지만) 메시지 양이 방대한 경우 기존의 방식으로는 판단하기 쉽지 않았다. 여러가지 언어 환경을 지원할 때 영문 메시지는 추가 했지만 잊어버리고 한국어 메시지를 추가하지 않았다거나 하면 전체 메시지를 확인하지 않아도 (해당 Locale 정보로) 최초 로딩시에 바로 알려준다. (eclipse에서는 workspace/.log 파일에 조용히 기록해주고 있는데 플러그인 개발 환경에서 사용하던 사용자도 이런 기능을 모르는 경우가 많다.)

 

이제 추출한 NLS 클래스를 이용해서 이클립스에서 사용하던 방식 그대로 메시지를 처리할 수 있다. 

사용전에 주의해야 할 점은 eclipse의 소스 코드이므로 Eclipse Public License 1.0을 따른다는 점이다. 하지만, 워낙 유연한 라이선스인지라 특별한 경우를 제외하고는 마음껏 사용해도 된다.

 

마치며

eclipse 덕분에 오픈소스 코드를 많이 읽게된다. 오픈 소스 코드 읽기를 하면 더 좋은 코딩 습관 등 개발 스킬을 배우기도 하지만 이렇듯 편리한 코드를 알게되고 그대로 사용하게 되는 행운도 얻을 수 있다.

History

Last edited on 12/19/2008 14:28 by 김성안

Comments (0)

You must log in to leave a comment. Please sign in.