/*
 * Copyright 2014 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.shared.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
//  cldrVersion=25
//  date=$Date: 2014-03-14 18:20:13 +0100 (Fri, 14 Mar 2014) $
//  number=$Revision: 9967 $
//  type=root

/**
 * Implementation of DateTimeFormatInfo for the "bn" locale.
 */
public class DateTimeFormatInfoImpl_bn extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "am",
        "pm"
    };
  }

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

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

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

  @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 5;
  }

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

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

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

  @Override
  public String formatMonthNumDay() {
    return "d/M";
  }

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

  @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[] monthsNarrow() {
    return new String[] {
        "জা",
        "ফে",
        "মা",
        "এ",
        "মে",
        "জুন",
        "জু",
        "আ",
        "সে",
        "অ",
        "ন",
        "ডি"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "জানুয়ারী",
        "ফেব্রুয়ারী",
        "মার্চ",
        "এপ্রিল",
        "মে",
        "জুন",
        "জুলাই",
        "আগস্ট",
        "সেপ্টেম্বর",
        "অক্টোবর",
        "নভেম্বর",
        "ডিসেম্বর"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "প্রথম চতুর্থাংশ",
        "দ্বিতীয় চতুর্থাংশ",
        "তৃতীয় চতুর্থাংশ",
        "চতুর্থ চতুর্থাংশ"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "চতুর্থাংশ ১",
        "চতুর্থাংশ ২",
        "চতুর্থাংশ ৩",
        "চতুর্থাংশ ৪"
    };
  }

  @Override
  public String timeFormatFull() {
    return "h:mm:ss a zzzz";
  }

  @Override
  public String timeFormatLong() {
    return "h:mm:ss a z";
  }

  @Override
  public String timeFormatMedium() {
    return "h:mm:ss a";
  }

  @Override
  public String timeFormatShort() {
    return "h:mm a";
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "রবিবার",
        "সোমবার",
        "মঙ্গলবার",
        "বুধবার",
        "বৃহষ্পতিবার",
        "শুক্রবার",
        "শনিবার"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "র",
        "সো",
        "ম",
        "বু",
        "বৃ",
        "শু",
        "শ"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "রবি",
        "সোম",
        "মঙ্গল",
        "বুধ",
        "বৃহস্পতি",
        "শুক্র",
        "শনি"
    };
  }
}
