/*
 * 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
//  cldrVersion=21.0
//  number=$Revision: 5953 $
//  date=$Date: 2011-07-04 19:22:55 -0400 (Mon, 04 Jul 2011) $
//  type=IN

/**
 * Implementation of DateTimeFormatInfo for the "ne_IN" locale.
 */
public class DateTimeFormatInfoImpl_ne_IN extends DateTimeFormatInfoImpl_ne {

  @Override
  public String[] ampms() {
    return new String[] {
        "पूर्वाह्न",
        "अपराह्न"
    };
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "जनवरी",
        "फरवरी",
        "मार्च",
        "अप्रेल",
        "मई",
        "जुन",
        "जुलाई",
        "अगस्त",
        "सेप्टेम्बर",
        "अक्टोबर",
        "नोभेम्बर",
        "दिसम्बर"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "पहिलो पाउ",
        "दोस्रो पाउ",
        "तेस्रो पाउ",
        "चौथो पाउ"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "पहिलो पाउ",
        "दोस्रो पाउ",
        "तेस्रो पाउ",
        "चौथो पाउ"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "आइतवार",
        "सोमवार",
        "मङ्गलवार",
        "बुधवार",
        "बिहीवार",
        "शुक्रवार",
        "शनिवार"
    };
  }

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