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

// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA
//  cldrVersion=25
//  date=$Date: 2014-03-06 06:14:25 +0100 (Thu, 06 Mar 2014) $
//  number=$Revision: 9876 $
//  type=lkt

/**
 * Implementation of DateTimeFormatInfo for the "lkt" locale.
 */
public class DateTimeFormatInfoImpl_lkt extends DateTimeFormatInfoImpl {

  @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[] {
        "BCE",
        "CE"
    };
  }

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

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

  @Override
  public String[] monthsFull() {
    return new String[] {
        "Wiótheȟika Wí",
        "Thiyóȟeyuŋka Wí",
        "Ištáwičhayazaŋ Wí",
        "Pȟežítȟo Wí",
        "Čhaŋwápetȟo Wí",
        "Wípazukȟa-wašté Wí",
        "Čhaŋpȟásapa Wí",
        "Wasútȟuŋ Wí",
        "Čhaŋwápeǧi Wí",
        "Čhaŋwápe-kasná Wí",
        "Waníyetu Wí",
        "Tȟahékapšuŋ Wí"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "Wiótheȟika Wí",
        "Thiyóȟeyuŋka Wí",
        "Ištáwičhayazaŋ Wí",
        "Pȟežítȟo Wí",
        "Čhaŋwápetȟo Wí",
        "Wípazukȟa-wašté Wí",
        "Čhaŋpȟásapa Wí",
        "Wasútȟuŋ Wí",
        "Čhaŋwápeǧi Wí",
        "Čhaŋwápe-kasná Wí",
        "Waníyetu Wí",
        "Tȟahékapšuŋ Wí"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "Q1",
        "Q2",
        "Q3",
        "Q4"
    };
  }

  @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[] {
        "Aŋpétuwakȟaŋ",
        "Aŋpétuwaŋži",
        "Aŋpétunuŋpa",
        "Aŋpétuyamni",
        "Aŋpétutopa",
        "Aŋpétuzaptaŋ",
        "Owáŋgyužažapi"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "A",
        "W",
        "N",
        "Y",
        "T",
        "Z",
        "O"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Aŋpétuwakȟaŋ",
        "Aŋpétuwaŋži",
        "Aŋpétunuŋpa",
        "Aŋpétuyamni",
        "Aŋpétutopa",
        "Aŋpétuzaptaŋ",
        "Owáŋgyužažapi"
    };
  }
}
