| /* LocaleHelper.java -- helper routines for localization |
| Copyright (C) 2004, 2005 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| |
| package gnu.java.locale; |
| |
| import java.text.Collator; |
| import java.util.Locale; |
| import java.util.MissingResourceException; |
| import java.util.ResourceBundle; |
| |
| /** |
| * This class provides common helper methods |
| * for handling localized data. |
| * |
| * @author Andrew John Hughes (gnu_andrew@member.fsf.org) |
| * |
| * @see java.util.Locale |
| * @see java.util.ResourceBundle |
| */ |
| public class LocaleHelper |
| { |
| /** |
| * This method is used by the localized name lookup methods to retrieve |
| * the localized name of a particular piece of locale data. |
| * If the display name can not be localized to the supplied |
| * locale, it will fall back on other output in the following order: |
| * |
| * <ul> |
| * <li>the localized name in the default locale</li> |
| * <li>the localized name in English (optional)</li> |
| * <li>the localized name in the root locale bundle (optional)</li> |
| * <li>the localized input string</li> |
| * </ul> |
| * <p> |
| * If the supplied key is merely the empty string, then the empty string is |
| * returned. |
| * </p> |
| * |
| * @param inLocale the locale to use for formatting the display string. |
| * @param key the locale data used as a key to the localized lookup tables. |
| * @param name the name of the hashtable containing the localized data. |
| * @param checkEnglish true if the method should fall back on data |
| * from the English locale. |
| * @param checkRoot true if the method should fall back on data from the |
| * unlocalized root locale. |
| * @return a <code>String</code>, hopefully containing the localized |
| * variant of the input data. |
| * @throws NullPointerException if <code>inLocale</code> is null. |
| */ |
| public static String getLocalizedString(Locale inLocale, String key, |
| String name, boolean checkEnglish, |
| boolean checkRoot) |
| { |
| String localizedString; |
| String property; |
| |
| if (key.equals("")) |
| return ""; |
| property = name + "." + key; |
| /* Localize to inLocale */ |
| try |
| { |
| localizedString = |
| ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", |
| inLocale).getString(property); |
| } |
| catch (MissingResourceException exception) |
| { |
| localizedString = null; |
| } |
| /* Localize to default locale */ |
| if (localizedString == null) |
| { |
| try |
| { |
| ResourceBundle bundle; |
| |
| bundle = |
| ResourceBundle.getBundle("gnu.java.locale.LocaleInformation"); |
| localizedString = bundle.getString(property); |
| } |
| catch (MissingResourceException exception) |
| { |
| localizedString = null; |
| } |
| } |
| /* Localize to English */ |
| if (localizedString == null && checkEnglish) |
| { |
| try |
| { |
| localizedString = |
| ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", |
| Locale.ENGLISH).getString(property); |
| } |
| catch (MissingResourceException exception) |
| { |
| localizedString = null; |
| } |
| } |
| /* Return unlocalized version */ |
| if (localizedString == null && checkRoot) |
| { |
| try |
| { |
| localizedString = |
| ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", |
| new Locale("","","") |
| ).getString(property); |
| } |
| catch (MissingResourceException exception) |
| { |
| localizedString = null; |
| } |
| } |
| /* Return original input string */ |
| if (localizedString == null) |
| { |
| localizedString = key; |
| } |
| return localizedString; |
| } |
| |
| /** |
| * Return an array of all the locales for which there is a |
| * {@link Collator} instance. A new array is returned each time. |
| */ |
| public static Locale[] getCollatorLocales() |
| { |
| // For now we don't bother caching. This is probably |
| // not called very frequently. And, we would have to |
| // clone the array anyway. |
| if (LocaleData.collatorLocaleNames.length == 0) |
| return new Locale[] { Locale.US }; |
| Locale[] result = new Locale[LocaleData.collatorLocaleNames.length]; |
| for (int i = 0; i < result.length; ++i) |
| { |
| String language; |
| String region = ""; |
| String variant = ""; |
| String name = LocaleData.collatorLocaleNames[i]; |
| |
| language = name.substring(0, 2); |
| |
| if (name.length() > 2) |
| region = name.substring(3); |
| |
| int index = region.indexOf("_"); |
| if (index > 0) |
| { |
| variant = region.substring(index + 1); |
| region = region.substring(0, index - 1); |
| } |
| |
| result[i] = new Locale(language, region, variant); |
| } |
| return result; |
| } |
| |
| /** |
| * Return the number of locales we know of. |
| */ |
| public static int getLocaleCount() |
| { |
| return LocaleData.localeNames.length; |
| } |
| |
| /** |
| * Return the Nth locale name. |
| */ |
| public static String getLocaleName(int n) |
| { |
| return LocaleData.localeNames[n]; |
| } |
| } |
| |