/*
 * 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

/**
 * Implementation of DateTimeFormatInfo for the "as" locale.
 */
public class DateTimeFormatInfoImpl_as 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 "dd-MM-y";
  }

  @Override
  public String dateFormatShort() {
    return "d-M-y";
  }

  @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 "a h.mm";
  }

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

  @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 "dd-MM";
  }

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

  @Override
  public String formatYearMonthNumDay() {
    return "dd-MM-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 "a h.mm.ss zzzz";
  }

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

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

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

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

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

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

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