/*
 * Copyright 2010 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 DATA

/**
 * Implementation of DateTimeFormatInfo for locale "be".
 */
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 1;
  }

  @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 formatMonthFullWeekdayDay() {
    return "EEEE, d MMMM";
  }

  @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.y";
  }

  @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[] weekdaysFullStandalone() {
    return weekdaysFull();
  }

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

  @Override
  public String[] weekdaysNarrowStandalone() {
    return weekdaysNarrow();
  }

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

  @Override
  public String[] weekdaysShortStandalone() {
    return weekdaysShort();
  }
}
