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

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
//  cldrVersion=21.0
//  number=$Revision: 6546 $
//  type=root
//  date=$Date: 2012-02-07 13:32:35 -0500 (Tue, 07 Feb 2012) $

/**
 * 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 formatYear() {
    return "yyyy";
  }

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

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

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

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

  @Override
  public String formatYearMonthWeekdayDay() {
    return "EEE, MMM d, yyyy";
  }

  @Override
  public String formatYearQuarterFull() {
    return "QQQQ yyyy";
  }

  @Override
  public String formatYearQuarterShort() {
    return "Q yyyy";
  }

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