Frames | No Frames |
1: /* LocaleHelper.java -- helper routines for localization 2: Copyright (C) 2004, 2005 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package gnu.java.locale; 40: 41: import java.text.Collator; 42: import java.util.Locale; 43: import java.util.MissingResourceException; 44: import java.util.ResourceBundle; 45: 46: /** 47: * This class provides common helper methods 48: * for handling localized data. 49: * 50: * @author Andrew John Hughes (gnu_andrew@member.fsf.org) 51: * 52: * @see java.util.Locale 53: * @see java.util.ResourceBundle 54: */ 55: public class LocaleHelper 56: { 57: /** 58: * This method is used by the localized name lookup methods to retrieve 59: * the localized name of a particular piece of locale data. 60: * If the display name can not be localized to the supplied 61: * locale, it will fall back on other output in the following order: 62: * 63: * <ul> 64: * <li>the localized name in the default locale</li> 65: * <li>the localized name in English (optional)</li> 66: * <li>the localized name in the root locale bundle (optional)</li> 67: * <li>the localized input string</li> 68: * </ul> 69: * <p> 70: * If the supplied key is merely the empty string, then the empty string is 71: * returned. 72: * </p> 73: * 74: * @param inLocale the locale to use for formatting the display string. 75: * @param key the locale data used as a key to the localized lookup tables. 76: * @param name the name of the hashtable containing the localized data. 77: * @param checkEnglish true if the method should fall back on data 78: * from the English locale. 79: * @param checkRoot true if the method should fall back on data from the 80: * unlocalized root locale. 81: * @return a <code>String</code>, hopefully containing the localized 82: * variant of the input data. 83: * @throws NullPointerException if <code>inLocale</code> is null. 84: */ 85: public static String getLocalizedString(Locale inLocale, String key, 86: String name, boolean checkEnglish, 87: boolean checkRoot) 88: { 89: String localizedString; 90: String property; 91: 92: if (key.equals("")) 93: return ""; 94: property = name + "." + key; 95: /* Localize to inLocale */ 96: try 97: { 98: localizedString = 99: ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", 100: inLocale).getString(property); 101: } 102: catch (MissingResourceException exception) 103: { 104: localizedString = null; 105: } 106: /* Localize to default locale */ 107: if (localizedString == null) 108: { 109: try 110: { 111: ResourceBundle bundle; 112: 113: bundle = 114: ResourceBundle.getBundle("gnu.java.locale.LocaleInformation"); 115: localizedString = bundle.getString(property); 116: } 117: catch (MissingResourceException exception) 118: { 119: localizedString = null; 120: } 121: } 122: /* Localize to English */ 123: if (localizedString == null && checkEnglish) 124: { 125: try 126: { 127: localizedString = 128: ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", 129: Locale.ENGLISH).getString(property); 130: } 131: catch (MissingResourceException exception) 132: { 133: localizedString = null; 134: } 135: } 136: /* Return unlocalized version */ 137: if (localizedString == null && checkRoot) 138: { 139: try 140: { 141: localizedString = 142: ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", 143: new Locale("","","") 144: ).getString(property); 145: } 146: catch (MissingResourceException exception) 147: { 148: localizedString = null; 149: } 150: } 151: /* Return original input string */ 152: if (localizedString == null) 153: { 154: localizedString = key; 155: } 156: return localizedString; 157: } 158: 159: /** 160: * Return an array of all the locales for which there is a 161: * {@link Collator} instance. A new array is returned each time. 162: */ 163: public static Locale[] getCollatorLocales() 164: { 165: // For now we don't bother caching. This is probably 166: // not called very frequently. And, we would have to 167: // clone the array anyway. 168: if (LocaleData.collatorLocaleNames.length == 0) 169: return new Locale[] { Locale.US }; 170: Locale[] result = new Locale[LocaleData.collatorLocaleNames.length]; 171: for (int i = 0; i < result.length; ++i) 172: { 173: String language; 174: String region = ""; 175: String variant = ""; 176: String name = LocaleData.collatorLocaleNames[i]; 177: 178: language = name.substring(0, 2); 179: 180: if (name.length() > 2) 181: region = name.substring(3); 182: 183: int index = region.indexOf("_"); 184: if (index > 0) 185: { 186: variant = region.substring(index + 1); 187: region = region.substring(0, index - 1); 188: } 189: 190: result[i] = new Locale(language, region, variant); 191: } 192: return result; 193: } 194: 195: /** 196: * Return the number of locales we know of. 197: */ 198: public static int getLocaleCount() 199: { 200: return LocaleData.localeNames.length; 201: } 202: 203: /** 204: * Return the Nth locale name. 205: */ 206: public static String getLocaleName(int n) 207: { 208: return LocaleData.localeNames[n]; 209: } 210: }