/*
 * 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=am

/**
 * Implementation of DateTimeFormatInfo for the "am" locale.
 */
public class DateTimeFormatInfoImpl_am extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ጥዋት",
        "ከሰዓት"
    };
  }

  @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[] {
        "ዓመተ ዓለም",
        "ዓመተ ምሕረት"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "ዓ/ዓ",
        "ዓ/ም"
    };
  }

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

  @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[] {
        "ጃንዩወሪ",
        "ፌብሩወሪ",
        "ማርች",
        "ኤፕሪል",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስት",
        "ሴፕቴምበር",
        "ኦክተውበር",
        "ኖቬምበር",
        "ዲሴምበር"
    };
  }

  @Override
  public String[] monthsFullStandalone() {
    return new String[] {
        "ጃንዩወሪ",
        "ፌብሩወሪ",
        "ማርች",
        "ኤፕሪል",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስት",
        "ሴፕቴምበር",
        "ኦክቶበር",
        "ኖቬምበር",
        "ዲሴምበር"
    };
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] {
        "ጃ",
        "ፌ",
        "ማ",
        "ኤ",
        "ሜ",
        "ጁ",
        "ጁ",
        "ኦ",
        "ሴ",
        "ኦ",
        "ኖ",
        "ዲ"
    };
  }

  @Override
  public String[] monthsShort() {
    return new String[] {
        "ጃንዩ",
        "ፌብሩ",
        "ማርች",
        "ኤፕሪ",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስ",
        "ሴፕቴ",
        "ኦክተ",
        "ኖቬም",
        "ዲሴም"
    };
  }

  @Override
  public String[] monthsShortStandalone() {
    return new String[] {
        "ጃንዩ",
        "ፌብሩ",
        "ማርች",
        "ኤፕሪ",
        "ሜይ",
        "ጁን",
        "ጁላይ",
        "ኦገስ",
        "ሴፕቴ",
        "ኦክቶ",
        "ኖቬም",
        "ዲሴም"
    };
  }

  @Override
  public String[] quartersFull() {
    return new String[] {
        "1ኛው ሩብ",
        "ሁለተኛው ሩብ",
        "3ኛው ሩብ",
        "4ኛው ሩብ"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "ሩብ1",
        "ሩብ2",
        "ሩብ3",
        "ሩብ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[] {
        "እሑድ",
        "ሰኞ",
        "ማክሰኞ",
        "ረቡዕ",
        "ሐሙስ",
        "ዓርብ",
        "ቅዳሜ"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "እ",
        "ሰ",
        "ማ",
        "ረ",
        "ሐ",
        "ዓ",
        "ቅ"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "እሑድ",
        "ሰኞ",
        "ማክሰ",
        "ረቡዕ",
        "ሐሙስ",
        "ዓርብ",
        "ቅዳሜ"
    };
  }
}
