/*
 * Copyright 2012 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.i18n.client.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
//  cldrVersion=21.0
//  number=$Revision: 6546 Google $
//  type=be
//  date=$Date: 2012-02-07 13:32:35 -0500 (Tue, 07 Feb 2012) $

/**
 * Implementation of DateTimeFormatInfo for the "be" locale.
 */
public class DateTimeFormatInfoImpl_be extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "да палудня",
        "пасля палудня"
    };
  }

  @Override
  public String dateFormatFull() {
    return "EEEE, d MMMM y";
  }

  @Override
  public String dateFormatLong() {
    return "d MMMM y";
  }

  @Override
  public String dateFormatMedium() {
    return "d.M.yyyy";
  }

  @Override
  public String dateFormatShort() {
    return "d.M.yy";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "да н.э.",
        "н.э."
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "да н.э.",
        "н.э."
    };
  }

  @Override
  public int firstDayOfTheWeek() {
    return 0;
  }

  @Override
  public String formatHour12Minute() {
    return "h.mm a";
  }

  @Override
  public String formatHour12MinuteSecond() {
    return "h.mm.ss a";
  }

  @Override
  public String formatHour24Minute() {
    return "HH.mm";
  }

  @Override
  public String formatHour24MinuteSecond() {
    return "HH.mm.ss";
  }

  @Override
  public String formatMinuteSecond() {
    return "mm.ss";
  }

  @Override
  public String formatMonthAbbrevDay() {
    return "d MMM";
  }

  @Override
  public String formatMonthFullWeekdayDay() {
    return "MMMM d, EEEE";
  }

  @Override
  public String formatYearMonthAbbrev() {
    return "MMM y";
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "d MMM y";
  }

  @Override
  public String formatYearMonthFull() {
    return "MMMM y";
  }

  @Override
  public String formatYearMonthFullDay() {
    return "d MMMM y";
  }

  @Override
  public String formatYearMonthNum() {
    return "MM/yyyy";
  }

  @Override
  public String formatYearMonthNumDay() {
    return "d.M.yy";
  }

  @Override
  public String formatYearMonthWeekdayDay() {
    return "EEE, d MMM y";
  }

  @Override
  public String formatYearQuarterFull() {
    return "QQQQ 'кв'. y";
  }

  @Override
  public String formatYearQuarterShort() {
    return "Q 'кв'. y";
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "студзень",
        "люты",
        "сакавік",
        "красавік",
        "май",
        "чэрвень",
        "ліпень",
        "жнівень",
        "верасень",
        "кастрычнік",
        "лістапад",
        "снежань"
    };
  }

  @Override
  public String[] monthsFullStandalone() {
    return new String[] {
        "студзень",
        "люты",
        "сакавік",
        "красавік",
        "травень",
        "чэрвень",
        "ліпень",
        "жнівень",
        "верасень",
        "кастрычнік",
        "лістапад",
        "снежань"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "с",
        "л",
        "с",
        "к",
        "т",
        "ч",
        "л",
        "ж",
        "в",
        "к",
        "л",
        "с"
    };
  }

  @Override
  public String[] monthsNarrowStandalone() {
    return new String[] {
        "с",
        "л",
        "с",
        "к",
        "м",
        "ч",
        "л",
        "ж",
        "в",
        "к",
        "л",
        "с"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "сту",
        "лют",
        "сак",
        "кра",
        "май",
        "чэр",
        "ліп",
        "жні",
        "вер",
        "кас",
        "ліс",
        "сне"
    };
  }

  @Override
  public String[] monthsShortStandalone() {
    return new String[] {
        "сту",
        "лют",
        "сак",
        "кра",
        "тра",
        "чэр",
        "ліп",
        "жні",
        "вер",
        "кас",
        "ліс",
        "сне"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "1-шы квартал",
        "2-гі квартал",
        "3-ці квартал",
        "4-ты квартал"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "1-шы кв.",
        "2-гі кв.",
        "3-ці кв.",
        "4-ты кв."
    };
  }

  @Override
  public String timeFormatFull() {
    return "HH.mm.ss zzzz";
  }

  @Override
  public String timeFormatLong() {
    return "HH.mm.ss z";
  }

  @Override
  public String timeFormatMedium() {
    return "HH.mm.ss";
  }

  @Override
  public String timeFormatShort() {
    return "HH.mm";
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "нядзеля",
        "панядзелак",
        "аўторак",
        "серада",
        "чацвер",
        "пятніца",
        "субота"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "н",
        "п",
        "а",
        "с",
        "ч",
        "п",
        "с"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "нд",
        "пн",
        "аў",
        "ср",
        "чц",
        "пт",
        "сб"
    };
  }
}
