/* LocaleInformation_en.java -- US English locale data
   Copyright (C) 1998, 1999, 2001, 2002 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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.util.ListResourceBundle;
import java.util.Calendar;
import java.util.Date;

/**
 * This class contains locale data for English.
 */
public class LocaleInformation_en extends ListResourceBundle
{

  /*
   * This area is used for defining object values
   */

  /**
   * This is the set of collation rules used by java.text.RuleBasedCollator 
   * to sort strings properly.  See the documentation of that class for the 
   * proper format.
   */
  // FIXME: this is nowhere near complete.
  // In particular we must mark accents as ignorable,
  // and probably other things as well.
  private static final String collation_rules = 
  "<0<1<2<3<4<5<6<7<8<9<A,a<b,B<c,C<d,D<e,E<f,F<g,G<h,H<i,I<j,J<k,K" +
  "<l,L<m,M<n,N<o,O<p,P<q,Q<r,R<s,S<t,T<u,U<v,V<w,W<x,X<y,Y,z<Z";

  /**
   * This is the list of months, fully spelled out
   */
  private static final String[] months =
  {
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December", null
  };

  /**
   * This is the list of abbreviated month names
   */
  private static final String[] shortMonths =
  {
    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", null
  };

  /**
   * This is the list of weekdays, fully spelled out
   */
  private static final String[] weekdays =
  {
    null, "Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday"
  };

  /**
   * This is the list of abbreviated weekdays
   */
  private static final String[] shortWeekdays =
  {
    null, "Sun", "Mon", "Tue", "Wed",
    "Thu", "Fri", "Sat"
  };

  /**
   * This is the list of AM/PM strings
   */
  private static final String[] ampms = { "AM", "PM" };

  /**
   * This is the list of era identifiers
   */
  private static final String[] eras = { "BC", "AD" };

  private static final String[][] zoneStrings =
  {
    { "GMT", "Greenwich Mean Time", "GMT",
      /**/   "Greenwich Mean Time", "GMT", "GMT" },
    { "PST", "Pacific Standard Time", "PST",
      /**/   "Pacific Daylight Time", "PDT", "San Francisco" },
    { "MST", "Mountain Standard Time", "MST",
      /**/   "Mountain Daylight Time", "MDT", "Denver" },
    { "PNT", "Mountain Standard Time", "MST",
      /**/   "Mountain Standard Time", "MST", "Phoenix" },
    { "CST", "Central Standard Time", "CST",
      /**/   "Central Daylight Time", "CDT", "Chicago" },
    { "EST", "Eastern Standard Time", "EST",
      /**/   "Eastern Daylight Time", "EDT", "Boston" },
    { "IET", "Eastern Standard Time", "EST",
      /**/   "Eastern Standard Time", "EST", "Indianapolis" },
    { "PRT", "Atlantic Standard Time", "AST",
      /**/   "Atlantic Daylight Time", "ADT", "Halifax" },
    { "CNT", "Newfoundland Standard Time", "NST",
      /**/   "Newfoundland Daylight Time", "NDT", "St. Johns" },
    { "ECT", "Central European Standard Time", "CET",
      /**/   "Central European Daylight Time", "CEST", "Paris" },
    { "CTT", "China Standard Time", "CST",
      /**/   "China Standard Time", "CST", "Shanghai" },
    { "JST", "Japan Standard Time", "JST",
      /**/   "Japan Standard Time", "JST", "Tokyo" },
    { "HST", "Hawaii Standard Time", "HST",
      /**/   "Hawaii Standard Time", "HST", "Honolulu" },
    { "AST", "Alaska Standard Time", "AKST",
      /**/   "Alaska Daylight Time", "AKDT", "Anchorage" }
  };

  /*************************************************************************/

  /**
   * This is the object array used to hold the keys and values
   * for this bundle
   */

  private static final Object[][] contents =
  {
    // For RuleBasedCollator
    { "collation_rules", collation_rules },

    // For SimpleDateFormat/DateFormatSymbols
    { "months", months },
    { "shortMonths", shortMonths },
    { "weekdays", weekdays },
    { "shortWeekdays", shortWeekdays },
    { "ampms", ampms },
    { "eras", eras },
    { "localPatternChars", "GyMdkHmsSEDFwWahKz" },
    { "zoneStrings", zoneStrings },

    { "shortDateFormat", "M/d/yy" },         // Java's Y2K bug.
    { "mediumDateFormat", "d-MMM-yy" },
    { "longDateFormat", "MMMM d, yyyy" },
    { "fullDateFormat", "EEEE MMMM d, yyyy G" },
    { "defaultDateFormat", "d-MMMM-yy" },
    { "shortTimeFormat", "h:mm a" },
    { "mediumTimeFormat", "h:mm:ss a" },
    { "longTimeFormat", "h:mm:ss a z" },
    { "fullTimeFormat", "h:mm:ss;S 'o''clock' a z" },
    { "defaultTimeFormat", "h:mm:ss a" },

    // For DecimalFormat/DecimalFormatSymbols
    { "decimalSeparator", "." },
    { "digit", "#" },
    { "exponential", "E" },
    { "groupingSeparator", "," },
    { "infinity", "\u221e" },
    { "NaN", "\ufffd" },
    { "minusSign", "-" },
    { "monetarySeparator", "." },
    { "patternSeparator", ";" },
    { "percent", "%" },
    { "perMill", "\u2030" },
    { "zeroDigit", "0" },

    // For NumberFormat.
    { "numberFormat", "#,##0.###" },
    { "percentFormat", "#,##0%" },
  };

  /*************************************************************************/

  /**
   * This method returns the object array of key, value pairs containing
   * the data for this bundle.
   *
   * @return The key, value information.
   */
  public Object[][] getContents ()
  {
    return contents;
  }
}
