/*
 * 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.client.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
//  cldrVersion=25
//  date=$Date: 2014-03-01 06:57:43 +0100 (Sat, 01 Mar 2014) $
//  number=$Revision: 9852 $
//  type=brx

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