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

  @Override
  public String[] ampms() {
    return new String[] {
        "ቀደም ሰርምዕል",
        "ሓቆ ስርምዕል"
    };
  }

  @Override
  public String dateFormatFull() {
    return "EEEE፡ dd MMMM ዮም y G";
  }

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

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

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

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

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

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

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

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

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

  @Override
  public String formatYearMonthNumDay() {
    return "M/d/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[] monthsNarrow() {
    return new String[] {
        "ጃ",
        "ፌ",
        "ማ",
        "ኤ",
        "ሜ",
        "ጁ",
        "ጁ",
        "ኦ",
        "ሴ",
        "ኦ",
        "ኖ",
        "ዲ"
    };
  }

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

  @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[] {
        "ሰንበት ዓባይ",
        "ሰኖ",
        "ታላሸኖ",
        "ኣረርባዓ",
        "ከሚሽ",
        "ጅምዓት",
        "ሰንበት ንኢሽ"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "ሰ",
        "ሰ",
        "ታ",
        "ኣ",
        "ከ",
        "ጅ",
        "ሰ"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "ሰ/ዓ",
        "ሰኖ",
        "ታላሸ",
        "ኣረር",
        "ከሚሽ",
        "ጅምዓ",
        "ሰ/ን"
    };
  }
}
