/*
 * Copyright 2012 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 "ak" locale.
 */
public class DateTimeFormatInfoImpl_ak extends DateTimeFormatInfoImpl {

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

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

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

  @Override
  public String[] erasFull() {
    return new String[] {
        "Ansa Kristo",
        "Kristo Ekyiri"
    };
  }

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

  @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 formatYearMonthFull() {
    return "MMMM y";
  }

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

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

  @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[] {
        "Sanda-Ɔpɛpɔn",
        "Kwakwar-Ɔgyefuo",
        "Ebɔw-Ɔbenem",
        "Ebɔbira-Oforisuo",
        "Esusow Aketseaba-Kɔtɔnimba",
        "Obirade-Ayɛwohomumu",
        "Ayɛwoho-Kitawonsa",
        "Difuu-Ɔsandaa",
        "Fankwa-Ɛbɔ",
        "Ɔbɛsɛ-Ahinime",
        "Ɔberɛfɛw-Obubuo",
        "Mumu-Ɔpɛnimba"
    };
  }

  @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[] {
        "S-Ɔ",
        "K-Ɔ",
        "E-Ɔ",
        "E-O",
        "E-K",
        "O-A",
        "A-K",
        "D-Ɔ",
        "F-Ɛ",
        "Ɔ-A",
        "Ɔ-O",
        "M-Ɔ"
    };
  }

  @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[] {
        "Kwesida",
        "Dwowda",
        "Benada",
        "Wukuda",
        "Yawda",
        "Fida",
        "Memeneda"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "K",
        "D",
        "B",
        "W",
        "Y",
        "F",
        "M"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Kwe",
        "Dwo",
        "Ben",
        "Wuk",
        "Yaw",
        "Fia",
        "Mem"
    };
  }
}
