/* 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;

/**
 * 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
{
  /**
   * <p>
   * This method is used by the localized name lookup methods to
   * retrieve the next locale to try.  The next locale is derived
   * from the supplied locale by applying the first applicable
   * rule from the following:
   * </p>
   * <ol>
   * <li>If the variant contains a <code>'_'</code>, then
   * this and everything following it is trimmed.</li>
   * <li>If the variant is non-empty, it is converted to
   * an empty string.</li>
   * <li>If the country is non-empty, it is converted to
   * an empty string.</li>
   * <li>If the language is non-empty, it is converted to
   * an empty string (forming {@link java.util.Locale#ROOT})</li>
   * </ol>
   * <p>
   * The base fallback locale is {@link java.util.Locale#ROOT}.
   * </p>
   *
   * @param locale the locale for which a localized piece of
   *               data could not be obtained.
   * @return the next fallback locale to try.
   */
  public static Locale getFallbackLocale(Locale locale)
  {
    String language = locale.getLanguage();
    String country = locale.getCountry();
    String variant = locale.getVariant();
    int uscore = variant.indexOf('_');
    if (uscore != -1)
      return new Locale(language, country,
                        variant.substring(0, uscore));
    if (!variant.isEmpty())
      return new Locale(language, country, "");
    if (!country.isEmpty())
      return new Locale(language, "", "");
    return Locale.ROOT;
  }

  /**
   * 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];
  }
}
