blob: 9d4976aaa97e3586e93cb2941da5df70c1ab374a [file] [log] [blame]
/*
*****************************************************************************
* Copyright (C) 2000-2004, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
package com.ibm.rbm;
import java.io.*;
import java.net.URL;
import java.net.JarURLConnection;
import java.text.MessageFormat;
import java.util.*;
import java.util.zip.ZipEntry;
import com.ibm.rbm.gui.RBManagerGUI;
/**
* A class not to be instantiated. Provides methods for translating items from a resource bundle. To use this class
* make sure you first call initBundle(). Once this is done, calling any of the getTranslation() methods will return
* the appropriate String.
*
* @author Jared Jackson
* @see com.ibm.rbm.RBManager
*/
public class Resources {
private static ResourceBundle resource_bundle;
private static Locale locale;
/**
* Initialize the properties of this resource bundle. This method must be called once before any
* other method can be called (unless that method performs a check that calls this method). This is
* also the method to use in case the resource data on the data store has changed and those changes
* need to be reflected in future use of this class.
*/
public static void initBundle() {
try {
if (locale == null) locale = Locale.getDefault();
resource_bundle = ResourceBundle.getBundle("com/ibm/rbm/resources/RBManager", locale);
} catch(MissingResourceException mre) {
System.err.println("Missing Resource for default locale, " + Locale.getDefault().toString());
mre.printStackTrace(System.err);
}
}
/**
* Set the locale to be used when making a query on the resource
*/
public static void setLocale(Locale locale) {
try {
Resources.locale = locale;
Resources.resource_bundle = ResourceBundle.getBundle("com/ibm/rbm/resources/RBManager", locale);
} catch (MissingResourceException mre) {
System.err.println("Missing Resource for locale, " + locale.toString());
mre.printStackTrace(System.err);
}
}
/**
* Returns the currently set Locales object.
*/
public static Locale getLocale() {
if (Resources.locale == null) Resources.initBundle();
return Resources.locale;
}
/**
* Returns an array of strings containing the locale encoding (e.g. 'en_US', 'de', etc.)
* of the locales defined in the current resource bundle. These are all of the locales for
* which unique translation of resource bundle items are possible. If a locale encoding is
* used to query on that is not in this array, the base class translation will be returned.
*/
public static String[] getAvailableLocales() {
//Locale loc[] = null;
String list[] = new String[0];
Vector locVect = new Vector();
try {
URL resURL = ClassLoader.getSystemResource("com/ibm/rbm/resources/RBManager.properties");
JarURLConnection resConnection = (JarURLConnection)resURL.openConnection();
Enumeration enumRes = resConnection.getJarFile().entries();
String baseName = "com/ibm/rbm/resources/RBManager";
while (enumRes.hasMoreElements()) {
String entryName = ((ZipEntry)enumRes.nextElement()).getName();
if (entryName.startsWith(baseName)) {
entryName = entryName.substring(baseName.length(), entryName.lastIndexOf('.'));
if (entryName.startsWith("_")) {
entryName = entryName.substring(1);
}
else if (entryName.length() == 0) {
/* For our resources we consider root as English */
entryName = "en";
}
locVect.add(entryName);
}
}
/* File locDir = new File("resources");
list = locDir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
boolean accept = true;
if (!name.toLowerCase().endsWith(".properties")) accept = false; // Must be property file
if (!name.startsWith("RBManager")) accept = false; // Must be a RBManager file
if (name.equals("RBManager.properties")) accept = false; // Base class does not count
return accept;
}
});
*/
int listSize = locVect.size();
list = new String[listSize];
for (int i=0; i < listSize; i++) {
list[i] = (String)locVect.get(i);
}
}
catch (IOException ioe) {
System.err.println("Can't get resources");
ioe.printStackTrace(System.err);
}
catch (ClassCastException cce) {
System.err.println("Can't get resources");
cce.printStackTrace(System.err);
}
return list;
}
/**
* Looks up a translation in the currently set Locale by the NLS lookup key provided.
* If no resource by that key is found, the key itself is returned.
*/
public static String getTranslation(String key) {
if (key == null || resource_bundle == null) return "";
try {
String retStr = resource_bundle.getString(key);
return retStr;
} catch (Exception e) {
return key;
}
}
/**
* Given a locale encoding, returns the language portion of that encoding.
*<br>
* For instance 'en', 'en_US', 'en_GB', all return 'en'
*/
public static String getLanguage(String encoding) {
if (encoding == null) return null;
if (encoding.indexOf("_") < 0) return encoding.trim();
return encoding.substring(0, encoding.indexOf("_"));
}
/**
* Given a locale encoding, returns the country portion of that encoding.
* <br>
* For instance 'en_US', 'sp_US', both return 'US'
* <br>
* Returns null if no country is specified (e.g. 'en' or 'de')
*/
public static String getCountry(String encoding) {
if (encoding == null) return null;
if (encoding.indexOf("_") < 0) return null;
String result = encoding.substring(encoding.indexOf("_")+1, encoding.length());
if (result.indexOf("_") < 0) return result.trim();
return result.substring(0, encoding.indexOf("_"));
}
/**
* Given a locale encoding, returns the variant portion of that encoding.
* <br>
* For instance 'en_GB_EURO', 'de_DE_EURO', both return 'EURO'
* <br>
* Returns null if no variant is specified (e.g. 'en' or 'en_US')
*/
public static String getVariant(String encoding) {
RBManagerGUI.debugMsg(encoding);
if (encoding == null) return null;
if (encoding.indexOf("_") < 0) return null;
String result = encoding.substring(encoding.indexOf("_")+1, encoding.length());
if (result.indexOf("_") < 0) return null;
result = result.substring(result.indexOf("_")+1, result.length());
return result.trim();
}
/**
* Gets a translation given the currently set locale, a lookup key, and a single lookup item replacement.
* For an understanding of the lookup item replacement see getTranslation(String key, String[] lookup).
*/
public static String getTranslation(String key, String lookup) {
if (key == null || resource_bundle == null) return "";
try {
Object objects[] = {lookup};
String retStr = resource_bundle.getString(key);
retStr = MessageFormat.format(retStr, objects);
return retStr;
} catch (Exception e) {
return key;
}
}
/**
* Gets a translation given the currently set locale, a lookup key, and zero or more lookup item replacements.
* Lookup items are contextual translation material stored in the resource according to the format dictated in
* the java.text package. In short, numbered markers are replaced by strings passed in as parameters.
* <p>
* For example, suppose you have the following resource:
* <p>
* myResource = Hello {1}, Isn't this a great {2}?
* <p>
* You want to replace the '{1}' witht the current user name and the '{2}' with the name of the day today.
* You can do this by calling:
* <p>
* String lookups[] = { "Joe", "Friday" };
* <br>
* Resources.getTranslation("myResource", lookups);
* <p>
* The result would be:
* <p>
* 'Hello Joe, Isn't this a great Friday?'
* <p>
* This method (as well as the getTranslation(String key, String lookup) method) is useful for using nested
* lookups from the resource bundle. For instance, the above line could be replaced with:
* <p>
* String lookups[] = { getUserName(), Resources.getTranslation("Friday") };
*/
public static String getTranslation(String key, String[] lookup) {
if (key == null || resource_bundle == null) return "";
try {
Object objects[] = new Object[lookup.length];
for (int i=0; i < lookup.length; i++) objects[i] = lookup[i];
String retStr = resource_bundle.getString(key);
retStr = MessageFormat.format(retStr, lookup);
return retStr;
} catch (Exception e) {
return key;
}
}
}