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

  @Override
  public String[] erasFull() {
    return new String[] {
        "Ӏийса пайхамар вина де кхачале",
        "Ӏийса пайхамар вина дийнахь дуьйна"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "в. э. тӀ. я",
        "в. э"
    };
  }

  @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[] {
        "1-гӀа квартал",
        "2-гӀа квартал",
        "3-гӀа квартал",
        "4-гӀа квартал"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "1-гӀа кв.",
        "2-гӀа кв.",
        "3-гӀа кв.",
        "4-гӀа кв."
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "кӀира",
        "оршот",
        "шинара",
        "кхаара",
        "еара",
        "пӀераска",
        "шуот"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "кӀи",
        "ор",
        "ши",
        "кха",
        "еа",
        "пӀе",
        "шуо"
    };
  }

  @Override
  public String[] weekdaysNarrowStandalone() {
    return new String[] {
        "кӀ",
        "о",
        "ш",
        "кх",
        "е",
        "пӀ",
        "ш"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "кӀи",
        "ор",
        "ши",
        "кха",
        "еа",
        "пӀе",
        "шуо"
    };
  }
}
