Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

文書の過去の版を表示しています。


Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

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 클래스를 사용하여 파라미터들을 문자열에 삽입한다.


QR Code
QR Code study:jsf:logging (generated for current page)