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: * <p> 59: * This method is used by the localized name lookup methods to 60: * retrieve the next locale to try. The next locale is derived 61: * from the supplied locale by applying the first applicable 62: * rule from the following: 63: * </p> 64: * <ol> 65: * <li>If the variant contains a <code>'_'</code>, then 66: * this and everything following it is trimmed.</li> 67: * <li>If the variant is non-empty, it is converted to 68: * an empty string.</li> 69: * <li>If the country is non-empty, it is converted to 70: * an empty string.</li> 71: * <li>If the language is non-empty, it is converted to 72: * an empty string (forming {@link java.util.Locale#ROOT})</li> 73: * </ol> 74: * <p> 75: * The base fallback locale is {@link java.util.Locale#ROOT}. 76: * </p> 77: * 78: * @param locale the locale for which a localized piece of 79: * data could not be obtained. 80: * @return the next fallback locale to try. 81: */ 82: public static Locale getFallbackLocale(Locale locale) 83: { 84: String language = locale.getLanguage(); 85: String country = locale.getCountry(); 86: String variant = locale.getVariant(); 87: int uscore = variant.indexOf('_'); 88: if (uscore != -1) 89: return new Locale(language, country, 90: variant.substring(0, uscore)); 91: if (!variant.isEmpty()) 92: return new Locale(language, country, ""); 93: if (!country.isEmpty()) 94: return new Locale(language, "", ""); 95: return Locale.ROOT; 96: } 97: 98: /** 99: * Return an array of all the locales for which there is a 100: * {@link Collator} instance. A new array is returned each time. 101: */ 102: public static Locale[] getCollatorLocales() 103: { 104: // For now we don't bother caching. This is probably 105: // not called very frequently. And, we would have to 106: // clone the array anyway. 107: if (LocaleData.collatorLocaleNames.length == 0) 108: return new Locale[] { Locale.US }; 109: Locale[] result = new Locale[LocaleData.collatorLocaleNames.length]; 110: for (int i = 0; i < result.length; ++i) 111: { 112: String language; 113: String region = ""; 114: String variant = ""; 115: String name = LocaleData.collatorLocaleNames[i]; 116: 117: language = name.substring(0, 2); 118: 119: if (name.length() > 2) 120: region = name.substring(3); 121: 122: int index = region.indexOf("_"); 123: if (index > 0) 124: { 125: variant = region.substring(index + 1); 126: region = region.substring(0, index - 1); 127: } 128: 129: result[i] = new Locale(language, region, variant); 130: } 131: return result; 132: } 133: 134: /** 135: * Return the number of locales we know of. 136: */ 137: public static int getLocaleCount() 138: { 139: return LocaleData.localeNames.length; 140: } 141: 142: /** 143: * Return the Nth locale name. 144: */ 145: public static String getLocaleName(int n) 146: { 147: return LocaleData.localeNames[n]; 148: } 149: }