|  | | ResourceBundle String manager |  
| 
 |  
   
     
 
/* 
 * Copyright (C) 2003 Colin Bell 
 * [email protected] 
 * 
 * This library is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser General Public 
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version. 
 * 
 * This library is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 * Lesser General Public License for more details. 
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this library; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */ 
import java.text.MessageFormat; 
import java.util.Locale; 
import java.util.MissingResourceException; 
import java.util.ResourceBundle; 
import java.net.URLClassLoader; 
import java.net.URL; 
 
/** 
 * This class defines i18nized strings. These strings are stored in a file 
 * with a base name I18NStrings.properties in each package directory. 
 * 
 * @author <A HREF="mailto:[email protected]">Colin Bell</A> 
 */ 
public class StringManager 
{ 
 
  /** Contains the localised strings. */ 
  private ResourceBundle _rsrcBundle; 
  private String _bundleBaseName; 
  private URL[] _bundleLoaderUrLs = new URL[0]; 
   
  /** a flag to indicate whether or not to throw exception for missing resource string */ 
  private static boolean _testMode = false; 
 
  /** 
   * Ctor specifying the package name. Attempt to load a resource bundle 
   * from the package directory. 
   * 
   * @param packageName Name of package 
   * @param classLoader Class loader to use 
   */ 
  StringManager(String packageName, ClassLoader loader) 
  { 
    super(); 
    _bundleBaseName = packageName + ".I18NStrings"; 
    _rsrcBundle = ResourceBundle.getBundle(_bundleBaseName, Locale.getDefault(), loader); 
 
    if(loader instanceof URLClassLoader) 
    { 
      _bundleLoaderUrLs = ((URLClassLoader) loader).getURLs(); 
    } 
 
 
  } 
 
  /** 
   * Retrieve the localized string for the passed key. If it isn't found 
   * an error message is returned instead. 
   * 
   * @param key   Key to retrieve string for. 
   * 
   * @return  Localized string or error message. 
   * 
   * @throws  IllegalArgumentException 
   *      Thrown if <TT>null</TT> <TT>key</TT> passed. 
   */ 
  public String getString(String key) 
  { 
    if (key == null) 
    { 
      throw new IllegalArgumentException("key == null"); 
    } 
 
    try 
    { 
      return _rsrcBundle.getString(key); 
    } 
    catch (MissingResourceException ex) 
    { 
      StringBuilder sb = new StringBuilder(); 
      sb.append("No resource string found for key '" + key + "' in bundle " + _bundleBaseName + "\n\n"); 
 
      if(0 < _bundleLoaderUrLs.length) 
      { 
        sb.append("The following classpath entries are available to the bundle loader:\n"); 
        for (int i = 0; i < _bundleLoaderUrLs.length; i++) 
        { 
          sb.append(_bundleLoaderUrLs[i]).append("\n"); 
        } 
      } 
      
      if (_testMode) { 
        throw new IllegalStateException(sb.toString()); 
      } 
      return "No resource found for key " + key; 
    } 
  } 
 
    /** 
     * Retrieve the localized string for the passed key and format it with the 
     * passed arguments. 
     * 
     * @param   key     Key to retrieve string for. 
     * @param   args    Any string arguments that should be used as values to  
     *                  parameters found in the localized string. 
     *                    
     * @return  Localized string or error message. 
     * 
     * @throws  IllegalArgumentException 
     *          Thrown if <TT>null</TT> <TT>key</TT> passed. 
     */     
    public String getString(String key, String[] args)  
    { 
        return getString(key, (Object[])args); 
    } 
     
  /** 
   * Retrieve the localized string for the passed key and format it with the 
   * passed arguments. 
   * 
   * @param key   Key to retrieve string for. 
     * @param   args    Any string arguments that should be used as values to  
     *                  parameters found in the localized string.  
   * 
   * @return  Localized string or error message. 
   * 
   * @throws  IllegalArgumentException 
   *      Thrown if <TT>null</TT> <TT>key</TT> passed. 
   */ 
  public String getString(String key, Object... args) 
  { 
    if (key == null) 
    { 
      throw new IllegalArgumentException("key == null"); 
    } 
 
    if (args == null) 
    { 
      args = new Object[0]; 
    } 
 
    final String str = getString(key); 
    try 
    { 
      return MessageFormat.format(str, args); 
    } 
    catch (IllegalArgumentException ex) 
    { 
      String msg = "Error formatting i18 string. Key is '" + key + "'"; 
   
      return msg + ": " + ex.toString(); 
    } 
  } 
   
  /** 
   * Allows the caller to enable/disable test mode which results in an exception being thrown for no  
   * resource string defined.  
   *  
   * @param enabled  
   */ 
  public static void setTestMode(boolean enabled) { 
    _testMode = enabled; 
  } 
} 
 
    
     
     
     
   |     
 
 |  
 |  
 |  
| Related examples in the same category |   
 |