/*
 * 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 "brx" locale.
 */
public class DateTimeFormatInfoImpl_brx extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "फुं",
        "बेलासे"
    };
  }

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

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

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

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

  @Override
  public String[] erasFull() {
    return new String[] {
        "ईसा.पूर्व",
        "सन"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "ईसा.पूर्व",
        "सन"
    };
  }

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

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

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

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

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

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

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

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

  @Override
  public String formatYearMonthNum() {
    return "M/y";
  }

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

  @Override
  public String formatYearMonthWeekdayDay() {
    return "EEE, MMM d, 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[] {
        "रबि",
        "सम",
        "मंगल",
        "बुद",
        "बिसथि",
        "सुखुर",
        "सुनि"
    };
  }

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