/*
 * 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.shared.impl.cldr;
// DO NOT EDIT - GENERATED FROM CLDR AND ICU DATA

/**
 * Implementation of DateTimeFormatInfo for the "ckb" locale.
 */
public class DateTimeFormatInfoImpl_ckb extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ب.ن",
        "د.ن"
    };
  }

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

  @Override
  public String[] erasFull() {
    return new String[] {
        "پێش زایین",
        "زایینی"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "پێش زایین",
        "زایینی"
    };
  }

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

  @Override
  public String formatMonthAbbrevDay() {
    return "dی MMM";
  }

  @Override
  public String formatMonthFullWeekdayDay() {
    return "EEEE، dی MMMM";
  }

  @Override
  public String formatYearMonthAbbrev() {
    return "MMMی y";
  }

  @Override
  public String formatYearMonthAbbrevDay() {
    return "dی MMMی 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، dی MMMی 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[] {
        "چارەکی یەکەم",
        "چارەکی دووەم",
        "چارەکی سێەم",
        "چارەکی چوارەم"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "چ١",
        "چ٢",
        "چ٣",
        "چ٤"
    };
  }

  @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[] {
        "یەکشەممە",
        "دووشەممە",
        "سێشەممە",
        "چوارشەممە",
        "پێنجشەممە",
        "ھەینی",
        "شەممە"
    };
  }

  @Override
  public int weekendEnd() {
    return 6;
  }

  @Override
  public int weekendStart() {
    return 5;
  }
}
