文書の過去の版を表示しています。
Text internaliztion from a ResourceBundle
코드에 포함되어 있는 다국어를 일반 자바 리소스 번들을 통해 국제화시키는 방법을 소개한다.
지역화된 표시 문자열을 리소스 번들로부터 얻어오는 Utility 메소드를 작성하였다.
import java.text.MessageFormat; import java.util.ResourceBundle; import java.util.MissingResourceException; import java.util.Locale; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.servlet.ServletContext; protected static ClassLoader getCurrentClassLoader(Object defaultObject) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); if (loader == null) { loader = defaultObject.getClass().getClassLoader(); } return loader; } public static String getDisplayString(String bundleName, String id, Object params[], Locale locale) { String text = null; ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, getCurrentClassLoader(params)); try { text = bundle.getString(id); } catch (MissingResourceException e) { text = "!! key " + id + " not found !!"; } if (params != null) { MessageFormat mf = new MessageFormat(text, locale); text = mf.format(params, new StringBuffer(), null).toString(); } return text; }
이 코드는 getCurrentClassLoader라는 메소드로 시작하는데, 이 메소드는 현재 스레드의 클래스 로더나
또는 지정된 기본 객체의 클래스 로더를 리턴한다.
클래스 로더가 왜 필요할까? 리소스 번들을 로드할 때 ResourceBundle 클래스는 리소스 번들에 해당하는 파일을 클래스 경로에서 찾는다.
Utils와 같은 유틸리티 클래스는 대개 다른 클래스 로더에 의해 Web Application의 주된 클래스 경로로부터 로드된다.
만약 이 사실을 고려하지 않는다면 Utils 클래스가 WEB-INF 디렉토리에 존재하지 않는 한 getDisplayString이 올바르게 작동하는 것을 보장하지 못한다.
getDisplayString 메소드는 getCurrentClassLoader로부터 얻어온 ClassLoader 인스턴스를 정적 메소드인
ResourceBundle.getBundle에 전달하여 번들을 로드한다.
그 다음 ResourceBundle.getString 메소드에 식별자를 전달하여 호출함으로써 번들로부터 문자열을 얻어온다.
만약 저장된 식별자를 찾지 못한다면, 이 메소드는 MissingResourceException을 던진다. 이와 같은 경우에 에러
메세지를 리턴하기 위해서는 이 예외를 잡아야 한다.
파라미터의 배열이 들어있다면 MessageFormat 클래스를 사용하여 파라미터들을 문자열에 삽입한다.