/*
 * 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: 2013-08-26 05:28:21 +0200 (Mon, 26 Aug 2013) $
//  number=$Revision: 9275 $
//  type=lag

/**
 * Implementation of DateTimeFormatInfo for the "lag" locale.
 */
public class DateTimeFormatInfoImpl_lag extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "TOO",
        "MUU"
    };
  }

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

  @Override
  public String[] erasFull() {
    return new String[] {
        "Kɨrɨsitʉ sɨ anavyaal",
        "Kɨrɨsitʉ akavyaalwe"
    };
  }

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

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

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

  @Override
  public String[] monthsFull() {
    return new String[] {
        "Kʉfúngatɨ",
        "Kʉnaanɨ",
        "Kʉkeenda",
        "Kwiikumi",
        "Kwiinyambála",
        "Kwiidwaata",
        "Kʉmʉʉnchɨ",
        "Kʉvɨɨrɨ",
        "Kʉsaatʉ",
        "Kwiinyi",
        "Kʉsaano",
        "Kʉsasatʉ"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "F",
        "N",
        "K",
        "I",
        "I",
        "I",
        "M",
        "V",
        "S",
        "I",
        "S",
        "S"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "Fúngatɨ",
        "Naanɨ",
        "Keenda",
        "Ikúmi",
        "Inyambala",
        "Idwaata",
        "Mʉʉnchɨ",
        "Vɨɨrɨ",
        "Saatʉ",
        "Inyi",
        "Saano",
        "Sasatʉ"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "Ncholo ya 1",
        "Ncholo ya 2",
        "Ncholo ya 3",
        "Ncholo ya 4"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "Ncho 1",
        "Ncho 2",
        "Ncho 3",
        "Ncho 4"
    };
  }

  @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[] {
        "Jumapíiri",
        "Jumatátu",
        "Jumaíne",
        "Jumatáano",
        "Alamíisi",
        "Ijumáa",
        "Jumamóosi"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "P",
        "T",
        "E",
        "O",
        "A",
        "I",
        "M"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Píili",
        "Táatu",
        "Íne",
        "Táano",
        "Alh",
        "Ijm",
        "Móosi"
    };
  }
}
