/*
 * Copyright 2010 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 "dav" locale.
 */
public class DateTimeFormatInfoImpl_dav extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "Luma lwa K",
        "luma lwa p"
    };
  }

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

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

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

  @Override
  public String dateFormatShort() {
    return "dd/MM/yyyy";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "Kabla ya Kristo",
        "Baada ya Kristo"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "KK",
        "BK"
    };
  }

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

  @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 "d MMM y";
  }

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

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

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

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

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

  @Override
  public String formatYearQuarterFull() {
    return "'K'QQQQ y";
  }

  @Override
  public String formatYearQuarterShort() {
    return "'K'Q y";
  }

  @Override
  public String[] monthsFull() {
    return new String[] {
        "Mori ghwa imbiri",
        "Mori ghwa kawi",
        "Mori ghwa kadadu",
        "Mori ghwa kana",
        "Mori ghwa kasanu",
        "Mori ghwa karandadu",
        "Mori ghwa mfungade",
        "Mori ghwa wunyanya",
        "Mori ghwa ikenda",
        "Mori ghwa ikumi",
        "Mori ghwa ikumi na imweri",
        "Mori ghwa ikumi na iwi"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "I",
        "K",
        "K",
        "K",
        "K",
        "K",
        "M",
        "W",
        "I",
        "I",
        "I",
        "I"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "Imb",
        "Kaw",
        "Kad",
        "Kan",
        "Kas",
        "Kar",
        "Mfu",
        "Wun",
        "Ike",
        "Iku",
        "Imw",
        "Iwi"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "Kimu cha imbiri",
        "Kimu cha kawi",
        "Kimu cha kadadu",
        "Kimu cha kana"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "K1",
        "K2",
        "K3",
        "K4"
    };
  }

  @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[] {
        "Ituku ja jumwa",
        "Kuramuka jimweri",
        "Kuramuka  kawi",
        "Kuramuka kadadu",
        "Kuramuka kana",
        "Kuramuka kasanu",
        "Kifula nguwo"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "J",
        "J",
        "K",
        "K",
        "K",
        "K",
        "N"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Jum",
        "Jim",
        "Kaw",
        "Kad",
        "Kan",
        "Kas",
        "Ngu"
    };
  }
}
