// This file was automatically generated by localedef.

package gnu.java.locale;

import java.util.ListResourceBundle;

public class LocaleInformation_nl_BE extends ListResourceBundle
{
  static final String decimalSeparator = LocaleInformation_fr_BE.decimalSeparator;
  static final String groupingSeparator = LocaleInformation_fr_BE.groupingSeparator;
  static final String numberFormat = LocaleInformation_fr_BE.numberFormat;
  static final String percentFormat = LocaleInformation_fr_BE.percentFormat;
  static final String[] weekdays = { null, "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" };

  static final String[] shortWeekdays = { null, "zo", "ma", "di", "wo", "do", "vr", "za" };

  static final String[] shortMonths = { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null };

  static final String[] months = { "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december", null };

  static final String[] ampms = { "", "" };

  static final String shortDateFormat = "dd-MM-yy";
  static final String defaultTimeFormat = "";
  static final String currencySymbol = LocaleInformation_fr_BE.currencySymbol;
  static final String intlCurrencySymbol = LocaleInformation_fr_BE.intlCurrencySymbol;
  static final String currencyFormat = LocaleInformation_fr_BE.currencyFormat;

  private static final Object[][] contents =
  {
    { "weekdays", weekdays },
    { "shortWeekdays", shortWeekdays },
    { "shortMonths", shortMonths },
    { "months", months },
    { "ampms", ampms },
    { "shortDateFormat", shortDateFormat },
    { "defaultTimeFormat", defaultTimeFormat },
    { "currencySymbol", currencySymbol },
    { "intlCurrencySymbol", intlCurrencySymbol },
    { "currencyFormat", currencyFormat },
    { "decimalSeparator", decimalSeparator },
    { "groupingSeparator", groupingSeparator },
    { "numberFormat", numberFormat },
    { "percentFormat", percentFormat },
  };

  public Object[][] getContents () { return contents; }
}
