/*
 * 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-10 08:39:57 +0200 (Sat, 10 Aug 2013) $
//  number=$Revision: 9196 $
//  type=sah

/**
 * Implementation of DateTimeFormatInfo for the "sah" locale.
 */
public class DateTimeFormatInfoImpl_sah extends DateTimeFormatInfoImpl {

  @Override
  public String[] ampms() {
    return new String[] {
        "ЭИ",
        "ЭК"
    };
  }

  @Override
  public String dateFormatFull() {
    return "y 'сыл' MMMM d 'күнэ', EEEE";
  }

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

  @Override
  public String dateFormatMedium() {
    return "y, MMM d";
  }

  @Override
  public String dateFormatShort() {
    return "yy/M/d";
  }

  @Override
  public String[] erasFull() {
    return new String[] {
        "б. э. и.",
        "б. э"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] {
        "б. э. и.",
        "б. э"
    };
  }

  @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[] {
        "1-кы кыбаартал",
        "2-с кыбаартал",
        "3-с кыбаартал",
        "4-с кыбаартал"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] {
        "1-кы кб",
        "2-с кб",
        "3-с кб",
        "4-с кб"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] {
        "Баскыһыанньа",
        "Бэнидиэлинньик",
        "Оптуорунньук",
        "Сэрэдэ",
        "Чэппиэр",
        "Бээтиҥсэ",
        "Субуота"
    };
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] {
        "Б",
        "Б",
        "О",
        "С",
        "Ч",
        "Б",
        "С"
    };
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] {
        "Бс",
        "Бн",
        "Оп",
        "Сэ",
        "Чп",
        "Бэ",
        "Сб"
    };
  }
}
