/*
 * 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 AND ICU DATA

/**
 * 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 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/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[] 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[] {
        "রবি",
        "সোম",
        "মঙ্গল",
        "বুধ",
        "বৃহস্পতি",
        "শুক্র",
        "শনি"
    };
  }
}
